Programming Serendipity

プログラミングを中心に種々雑多に書き留めます

Unity5 メモ7

  • 特定のスクリプトがアタッチされたGameObjectの配列
    例えばEnemy.csがアタッチされた敵用のゲームオブジェクトの配列を作りたいときは、
    GameObject[]とすると入れることはできるが、GameObject内在の関数しか呼べない。
    Enemy[]とすれば、自動的に「Enemy.csがアタッチされたGameObjectの配列」と解釈され、
    Enemy.cs内の関数を呼ぶことができる。(スクリプトの配列とはみなされない)

  • UI.Text.enabled
    これはTextコンポーネント自体のon/offを制御するもので、
    このTextがアタッチされたGameObject本体が非表示設定だとTextがenabledされても表示されない。

  • 全てのInputを無効化する
    フェード中など、ユーザー側の操作を一切受け付けないようにしたい場合、
    Unity側では特に関数などは用意されていないので
    public static bool canControl;
    を宣言して、Input.GetXXXXX()系の呼び出しの時に確認する。
    もしくは、Inputクラスのラッパーを用意して全てそちらに置き換える。

  • オブジェクトの移動はFixedUpdate()
    一般的に毎フレーム行う処理はUpdate()関数に記述するが、
    瞬間的に重い処理が発生した場合次のUpdate()関数が呼ばれるまでに間が開いてしまうことがあり、
    キャラクターの移動などをUpdate()で行うと飛び飛びになってしまうことがある。
    その対策として用意されているのがFixedUpdate()で、これは同じ時間の間隔で実行されることが保障されているため、
    通常オブジェクトの移動はFixedUpdate()で行うとより自然な動きになる。

  • GameObjectを特定のGameObjectの子オブジェクトとして生成する
    GameObjectをEnemiesという名前のGameObjectの子オブジェクトとしてゲーム中に動的に生成する場合、以下のようにできる。

GameObject go = Instantiate(A, new Vector3 (0,0,0), Quaternion.identity)   
as GameObject;   
go.transform.parent = GameObject.Find("Enemies").transform;  
  • GameObjectの名前を取得
    gameObject.name

  • 引数つきでInvoke()を呼びたい場合
    Invoke()は引数なしでしか利用できないので、StartCoroutine()を使用する。

void Start()  
{  
    StartCoroutine(MyFunction(false, 1f));  
}  
  
IEnumerator MyFunction(bool status, float delayTime)  
{  
    yield return new WaitForSeconds(delayTime);  
    // Now do your thing here  
}  
coll.GetComponent<ScriptName>().SomePublicFunction();  
// RigidBody2Dなども同様にGetComponentから取得できる