UnityUnityメモ

Unityで長押しボタンを実装する方法|イベント系インターフェースの使い方入門【初心者向け】

Unity

はじめに|Unityで長押しボタンを作れるようになろう!

ゲームの中で「長押ししてチャージ攻撃!」とか、「押しっぱなしでスキップできるボタン」って、よく見かけますよね。
この「長押しボタン」、実はUnityのイベント機能を使えば、初心者でもカンタンに作れちゃうんです!

この記事では、Unityで長押しボタンを作る方法を、ひとつひとつていねいに紹介していきます。

「ボタンを押した瞬間じゃなくて、一定時間押し続けたときだけ反応させたい
「長押ししている間に、ゲージがたまっていくような演出を入れたい」
そんなあなたにぴったりの内容です!

ボタンを押す・離すといった操作は、IPointerDownHandlerIPointerUpHandlerといったイベント系インターフェースを使えば、自由にコントロールできます。
最初は少し難しそうに見えるかもしれませんが、この記事を読みながら一緒に作っていけば大丈夫!




1. イベント系インターフェースとは

Unityでゲームを作っていると、ボタンをクリックしたときマウスをのせたときに、何かの動きをさせたい!ってことがありますよね?
そんなときに使えるのが、イベント系インターフェースです。

これは簡単に言うと、「ボタンが押されたよ!」「マウスがのったよ!」という合図(イベント)を受け取る仕組みなんです。

主なイベントインターフェースの種類

インターフェース名何ができる?
IPointerClickHandlerボタンをクリックしたときの処理
IPointerDownHandlerボタンが押し下げられた瞬間
IPointerUpHandlerボタンから指やマウスが離れた瞬間
IPointerEnterHandlerマウスがUIの上に入ったとき
IDragHandlerUIをドラッグしている間の処理

このように、イベント系インターフェースは「〇〇が起きたときに、こうしてね!」とUnityに伝えることができます。

たとえば、今回の長押しボタンでは「押されたとき」「離されたとき」が必要なので、
IPointerDownHandlerIPointerUpHandler を使っていきます!

使い方はとてもシンプルで、スクリプトに「このインターフェース使います!」と宣言して、
対応する関数(メソッド)を用意してあげればOKです。

次は、その基本的な使い方を「クリックイベント」を例にして紹介します!




2. イベント系インターフェースの基本的な使い方(クリックイベントの例)

ここでは、イベント系インターフェースの基本的な使い方を、**クリックされたときの処理(IPointerClickHandler)**を例にして紹介していきます!

「ボタンが押されたら何かしたい」という時に使える、とっても便利な方法です。

手順① 名前空間の追加

まず、スクリプトの上の方にイベント系インターフェースを使うための命令文を追加します。

using UnityEngine;
using UnityEngine.EventSystems; // ←これが必要!

手順② インターフェースを宣言する

次に、スクリプトのクラス名のところで IPointerClickHandler を使うよ!と宣言します。

public class ClickExample : MonoBehaviour, IPointerClickHandler
{
// ここに処理を書くよ!
}

MonoBehaviour の後にカンマ「,」で区切って書きます。

手順③ メソッドを実装する

IPointerClickHandler を使うには、決まった形のメソッドを作る必要があります。
それがこちら:

public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("クリックされました!");
}

このメソッドの中に、「クリックされたらやりたいこと」を書きましょう。
今はテストとして、Debug.Log()でメッセージを表示しています。

手順④ スクリプトをUIにアタッチする

このスクリプトを、実際にクリックされるUI(ImageやButtonなど)にドラッグ&ドロップでアタッチします。

手順⑤ 動作確認してみよう!

ゲームを実行して、スクリプトをつけたUIをクリックしてみてください。
コンソール(Console)に「クリックされました!」と表示されれば成功です!

この流れが、イベント系インターフェースの**基本の「き」**になります。

次は、これを応用して「長押しボタン」の作り方を紹介していきますよ!
UIに変化をつけたいときにすごく便利なので、ぜひ覚えていってくださいね。




3. 長押しボタンの実装方法

Unityで長押しボタンを作成するには、以下の3ステップに分けて進めていくのがわかりやすくておすすめです!


1. 長押しボタンのUI準備

まずは、シーン上に必要なUI要素を配置していきましょう。

✅ ボタン用のUIを作る

  1. ヒエラルキーウィンドウで右クリック →「UI」→「Image」を選びます。
  2. 追加されたImageオブジェクトの名前を「Button」に変更しておくとわかりやすいです。
  3. このオブジェクトが、ユーザーが長押しする対象になります。

✅ ゲージ表示用のImageを子オブジェクトとして作成

  1. 「Button」オブジェクトの上で右クリック →「UI」→「Image」を選び、子オブジェクトとしてImageを追加します。
  2. 名前を「Circle」などに変更しておくと管理しやすいです。
  3. 丸いスプライト画像があればそれを使ってください。なければ仮の画像でもOKです。

✅ ゲージ用Imageの設定を変更する

  • Image Type を「Simple」から「Filled」に変更します
  • Fill Method を「Radial 360」などに設定
  • Fill Origin を「Top」など好みに応じて選びます
  • Fill Amount を初期値「0」にします(最初は空の状態からスタート)
  • Clockwise(時計回り)はチェックを外しておくと自然に見える場合が多いです

この「Circle」Imageが、長押しの進行度を視覚的に示すゲージになります。


2. スクリプトの作成

続いて、長押しを判定するスクリプトを作ります。

✅ 作成方法

  1. プロジェクトウィンドウを右クリック →「Create」→「C# Script」を選びます
  2. 名前を「LongPressButton」にします

✅ スクリプト内容(コピペOK)

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class LongPressButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    [SerializeField] private float longTapTime = 1f;     // 長押しと判定する時間(秒)
    [SerializeField] private Image circleImage;          // ゲージImageをInspectorで指定

    private bool isDown = false;
    private float pressTime = 0f;

    public void OnPointerDown(PointerEventData eventData)
    {
        isDown = true;
        pressTime = 0f;
        circleImage.fillAmount = 0f;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isDown = false;
        pressTime = 0f;
        circleImage.fillAmount = 0f;
    }

    void Update()
    {
        if (isDown)
        {
            pressTime += Time.deltaTime;
            circleImage.fillAmount = pressTime / longTapTime;

            if (pressTime >= longTapTime)
            {
                isDown = false;
                circleImage.fillAmount = 0f;
                Debug.Log("長押し成功!");
                // ここに長押し成功時の処理を追加できます
            }
        }
    }
}

3. スクリプトの設定

スクリプトが完成したら、UnityエディターでUIに設定していきましょう。

  1. 作成した「LongPressButton」スクリプトを、Buttonオブジェクトにドラッグ&ドロップでアタッチします
  2. Buttonを選択し、Inspectorで**Circle Image(ゲージ用Image)**をcircleImageの欄にドラッグして指定します
  3. 必要に応じて longTapTime を調整します(例:2秒にしたいなら 2 に)

✅ 動作確認!

ゲームを再生して、「Button」を押しっぱなしにしてみましょう。

  • ゲージがたまっていき、指定時間を超えると Debug.Log("長押し成功!") が表示されれば成功!
  • 押すのを途中でやめたら、ゲージはリセットされます



まとめ

今回は、Unityで長押しボタンを実装する方法を、UIの準備からスクリプトの作成、そしてゲージの表示まで一通り紹介してきました。

特にポイントとなるのは以下の3つです:

  • IPointerDownHandlerIPointerUpHandler を使えば、押された/離されたタイミングを正確に検出できる
  • Time.deltaTime を使って押下時間を測ることで、長押しかどうかを判定できる
  • ImageFill Amount を使えば、視覚的にゲージ表示も可能

これらを組み合わせることで、チャージ系の攻撃や、確定操作など、さまざまなゲームUIに応用できます!

「短くタップ」と「長く押す」を分けて処理するだけでも、ゲームの操作性がぐっとアップしますよ!


あわせて読みたい

長押しボタンと組み合わせて使うと便利な機能や、UIイベント処理に関する関連記事もチェックしてみてください!


よくある質問(FAQ)

Q
ゲージが表示されないのですが、何が原因ですか?
A

ゲージ用Imageの「Image Type」が Filled に設定されていない可能性があります。インスペクターで「Image Type → Filled」になっているか確認しましょう。

Q
スクリプトのcircleImageに何も設定されていないとエラーが出ます
A

UnityエディターでスクリプトをアタッチしたUIオブジェクトを選択し、circleImage フィールドに「ゲージ用のImage」をドラッグ&ドロップで設定してください。

Q
スマホ操作でも長押しは反応しますか?
A

はい、Unityのイベント系インターフェースはマウスクリックとタップ操作の両方に対応しています。スマホでも同じように動作します。

C-BA Unity-memo
タイトルとURLをコピーしました