【Unity】Invokeで引数を渡す、途中で停止・中断。

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと以下の実行ができます

ボタンを押すと2秒間隔でカウントが進み、右クリックあるいは画面クリックでカウント停止。

UIボタンでカウントスタート

ノベルゲームで実装されているオート(Auto)機能は、オートボタンを押して、数秒後に話が進むシステムです。

しかし、Autoシステムの再現をUnityで試みたものの、思うように動作せず、挫折した方は多いかと思います。

確かに、Auto機能は他の動作に比べて少し複雑になりますが、Invokeを用いることで、オート機能は作ることが可能です。

本記事では、Unityにて、Invokeの使い方を確認しつつ、オート機能に類似した、ボタンを押すとカウントを数秒ごと加えて、画面をクリック、右クリックでカウントが止まるシステムを作っていきます。

本記事は次の人におすすめ
  • オート(Auto)機能を再現したい。
  • Invokeを一通り使えるようになりたい。
スポンサーリンク

Invoke

Invokeは、指定された時間の経過後にメソッドを呼び出すための機能です。
使用することで、一定の遅延後に実行したり、繰り返し実行することができます。

単発の処理には、Invokeを使用します。
delayTimeで指定された時間(秒単位)の経過後にMethodNameというメソッドが呼び出されます。

Invoke("MethodName", delayTime);


繰り返しの処理には、InvokeRepeatingを使用します。
initialDelayで指定された時間(秒単位)の遅延後に初回のメソッド呼び出しを行い、
以降はrepeatRateで指定された時間の間隔でメソッドが繰り返し実行されます。

InvokeRepeating("MethodName", initialDelay, repeatRate);


Invokeの処理を停止するには、CancelInvokeを使用します。

CancelInvoke("MethodName");


別のアプローチとして、onClickのクリックイベントを拡張する方法で、
「.onClick.Invoke()」を使用しています。
参考ページ:「UI.Button-onClick – Unity スクリプトリファレンス

Invoke("呼び出す関数",秒数);

一例として、Invokeで、関数sec()を2秒後に、表示までにかかる時間を表示する動作を実行します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InvokeMove : MonoBehaviour
{
    void Start()
    {
        Invoke("sec", 2); //sec関数を2秒後に実行
    }

    void sec()
    {
        Debug.Log("表示時間:::::" + Time.time);
    }
}

実際の動作はこちらになります。

Invoke動作

いま

ボタンを押すと数秒ごとにカウントを加えて、画面を押すとカウントが止まる

Invokeの使い方を確認しましたので、ここからはオート機能と類似したシステムを作ります。

ノベルゲームのオート機能は、Autoボタンを押すと、数秒ごとにテキストや立ち絵、セリフが進み、画面やマウスの右クリックで動作が止まります

しかし、テキストや立ち絵、セリフの遷移は複雑になり、目的から反れてしまうので、本記事では、UIテキストを用いて、ボタンを押すと、数秒ごとにカウントを進めて、画面を左クリックあるいは、マウスを右クリックするとカウントを停止するシステムを作成します。

この機能を応用すれば、ノベルゲームでのAuto機能を実装することができます。

ソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//追加

public class AutoFn : MonoBehaviour
{
    public Text Count;
    public Button btn;
    bool Auto;
    int i;

    //Auto機能
    public void Autobtn()
    {
        Invoke("Autocount", 2); //Autocount関数を2秒後に実行
        Auto = true;
        Debug.Log("開始!"+ Auto);
        btn.image.color = Color.gray;
    }

    void Autocount()
    {
        i++;
        Count.text = i.ToString();//変数iを文字列に変換
        btn.onClick.Invoke();     //btnを押し続ける
    }

    void Update()
    {
        if (Auto == true && Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1))
        {
            //Auto Cancel
            CancelInvoke("Autocount");
            Auto = false;
            Debug.Log("停止!" + Auto);
            btn.image.color = Color.white;
        }
    }

}

思い通りのゲームが作れない

Unityでゲーム開発しているけど完成しない。
技術的な壁や知識不足が原因で、思い描いたゲームを実現するのは難しいです。

しかし、Udemyは動画で実践的なゲーム開発を解説していて、
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで学習できます。

Udemyの特徴
  • プロのエンジニアによる講習が受けられる
  • 自分のペースで学習を進められる
  • オンデマンド形式だから何度でも視聴可能
  • 不満足なコースは視聴していても返金可能返金ポリシー

Unityの機能を網羅したいや作りたいゲームがある人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を3つ紹介します。

夏のビックセール開催中(9月17日まで)
対象のコースが1500円から(最大95%OFF)

多彩な講座から自分に合った講座を探そう!

最大95%OFF

終了まで

時間

Unityのはじめの一歩としておすすめ。開発例に物理挙動やアニメーションを使用しているので、今後の開発が円滑になる。

トランプを題材にした講座。カードゲームやボードゲーム開発に応用可能

UnityエンジンのインストールやC#の文法に加えて、App StoreとGoogle Playにゲームをリリース方法を解説。

容量不足を解消

Unityのプロジェクトは1.5GB~3.5GBと大きく、クリエイターはHDD・SSD増設が必要です。

価格耐久性静音性読み書きサイズ
HDD
SSD

注目点は、HDDは安価だけど壊れやすい。SSDは丈夫だけど高価。
したがって、データの持ち運びをしない場合はHDD、持ち運びする場合はSSDがおすすめです。

  • 据え置きHDD
  • 外付けSDD
  • 内蔵SSD

ぜひ、あなたのクリエイティブな作業環境に兼ね備えたストレージをお役立てください。

解説

初めに、名前空間「using UnityEngine.UI;」を追加します。

上から3行はUnityにてスクリプトを生成するとデフォルトで取得できます。
しかし、今回はボタンとテキストのUIを使うので、入力が必要です。追加しないと、UIが使えないので注意してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//追加

続いて、変数を定義します。

「Count」と「btn」はそれぞれテキストとボタンのUIです。
「Auto」はTrueFalseの真偽値を代入するbool型です。int型で変数を0,1にして真偽を分ける方法でも代用可能です。
「i」は、単にint型の変数で、後にこの変数を文字列に変換します。

public Text Count;
public Button btn;
bool Auto;
int i;

ここで、Invokeを用いて、Auto機能を実装します。

ボタン(Autobtn)を押すと、2秒後に関数Autocount()を実行します。
また、AutoがTrue(真)になり、ボタンの背景が白からグレーになります。

関数Autocount()では、変数iを1増やして、変数iを文字列(Count)に変換します。btn.onClick.Invoke(); でボタン(btn)を押します。つまり、Autobtn()へ戻ります

    //Auto機能
    public void Autobtn()
    {
        Invoke("Autocount", 2); //Autocount関数を2秒後に実行
        Auto = true;
        Debug.Log("開始!"+ Auto);
        btn.image.color = Color.gray;
    }

    void Autocount()
    {
        i++;
        Count.text = i.ToString();//変数iを文字列に変換
        btn.onClick.Invoke();     //btnを押し続ける
    }

最後に、Auto機能の停止するコードを追加します。

if文でbool型変数AutoがTrue(真)であり、左クリックあるいは右クリックしたときは、関数Autocount()を停止します。
また、bool型変数AutoがFaulse(偽)になり、ボタンの背景がグレーから白になります。

void Update()
{
    if (Auto == true && Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1))
    {
        //Auto Cancel
        CancelInvoke("Autocount");
        Auto = false;
        Debug.Log("停止!" + Auto);
        btn.image.color = Color.white;
    }
}

動作確認

ソースコードが完成しましたら、スクリプトをHierarchyウィンドウにアタッチして、Inspectorウィンドウからテキスト・ボタンUIの項目をそれぞれアタッチします。

つづいて、ボタンにAutobtn()を実装します。

HierarchyウィンドウからOnclickを選択します。この中に、AutoBtnメソッドを追加してください。


シーン再生をすると、冒頭で紹介した動作をします。

実演

以下から実際にどのように実行できるかウェブ上で実行することができます。

まとめ

UnityでAuto機能の実装するには、Invokeを使います。
Invokeは、ある関数を数秒後に実行するものです。

「btn.onClick.Invoke();」は、ボタンを押すコードで、「CancelInvoke(“関数”);」は、関数の動作を停止するものです。

この記事を書いた人

プロフィール

アリッシア

                 

大学4年間で何か胸を張れるスキルを身に着けたくて当サイト運営を始めました。
現在、大学院に進学するか就職するか迷いながら勉強しています。
詳しいプロフィールはこちら

Contact icon

contact

X icon

X

Instagram icon

Instagram

Note icon

Note

スポンサーリンク
Unity
フォローする
タイトルとURLをコピーしました