Msg Class

マウスクリックに Msg Class を組み込みます。

プロジェクトの説明

  1. 「マウスをクリックした位置に図形を移動」に Message Class を組み込みます。
    Mouse を参照して、クリックの位置に図形を移動するプロジェクトを作成して下さい。
  2. Msg Class を作成します。
    [Projectタブ][Createタブ] から [C# Script] で MsgClass.cs を作成します。
    パラメータが異なる4種類の Msg() 関数を定義しています。
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MsgClass : MonoBehaviour {
    
        public void Msg()
        {   Debug.Log("Msg Class"); }
        public void Msg(string str)
        {   Debug.Log(str); }
        public void Msg(string str, int val)
        {   Debug.Log(str + "->" + val);    }
        public void Msg(Vector2 vct2)
        {   Debug.Log("X:" + vct2.x + "  Y:" + vct2.y); }
    }
    
  3. MsgClass.cs を図形(Circle)にアタッチして下さい。
    図形には NewBehaviourScript.cs と MsgClass.cs がアタッチされます。
  4. NewBehaviourScript.cs から MsgClass を呼び出します。
    FindObjectOfType<MsgClass>(); で MsgClass を取得します。
    取得した msgcls を使ってメソッドを呼び出します。
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class NewBehaviourScript : MonoBehaviour {
        private MsgClass msgcls;
    
        void Start () {
            msgcls = FindObjectOfType<MsgClass>();
            msgcls.Msg();
            msgcls.Msg("Start Program");
        }
    
        void Update () {
            if (Input.GetMouseButtonDown(0)) {
                Vector2 tapPoint = Camera.main.ScreenToWorldPoint (Input.mousePosition);
                transform.position = tapPoint;
                msgcls.Msg(tapPoint);
            }
        }
    }
    
  5. 再生ボタンをクリックして実行します。
    マウスをクリックした位置にモデルが移動します。
    Console タブを選択して実行すると、コンソール画面にメッセージが印字されます。

Script Execution Order の設定

  1. MsgClass を取得しようとしたとき、MsgClass.cs が先に実行されていたら問題ないのですが、実行されていないときは取得できません。
        private MsgClass msgcls;
        msgcls = FindObjectOfType<MsgClass>();
    
  2. 取得出来ないと msgcls は null になり、これを使うと NullReferenceException が発生します。
  3. 先に MsgClass.cs をアタッチして、後から NewBehaviourScript.cs をアタッチすればよさそうですが、 スクリプトの実行順は保証されているわけではなく、ユーザーは実行順を把握することは出来ません。
  4. 解決方法としてスクリプトの実行順を管理する「Script Execution Order」を利用します。
    メニューの Edit→Project Settings→Script Execution Order を選択するとインスペクターに表示されます。
    Inspector の「+」ボタンを押して Class(MsgClass など)を選択します。
    これを「Default Time」の上に移動すると全スクリプトで一番最初に実行されるようになります。

  5. Apply ボタンをクリックして Script Execution Order を更新してから実行して下さい。

前田稔の超初心者のプログラム入門
超初心者のプログラム入門(Unity)