メモ
Unity
備忘録

僕がUnityを初めて気がついたこと[0]

僕がUnityを初めてから気がついたことをメモしていきます。

Prefab

Prefabはゲームオブジェクトの雛形のようなもの。
スクリプトから動的にゲームオブジェクトを生成するときにはPrefabを使うのが便利そう。

Random.Range(x,y)

今までは

Random.Range(0,10); //0から10までの乱数を生成する

とか思ってたけど、

Random.Range(0,10); //0から9までの乱数を生成する

つまりRandom.Range()はminからmax-1までの乱数を生成してくれる。
なぜかfloatの場合はminからmaxまでの乱数を生成する。
事情があるんだろうけど、謎w

privateだけどUnityで初期値を設定したい

これは結構悩んだ場所。
メンバ変数をprivateにしたいけどUnityがわで初期値を設定したい・・・だけど・・・

そこで!

Bullet.cs
public class Bullet : MonoBehaviour{
    [SerializeField]
    float angle;
    [SerializeField]
    float speed;
}

いちいち宣言の前に[SerializeField]を付けるのは面倒だけど、ないよりマシ。

Start()の順番

これも結構ハマったところ。

BulletManager.cs
public class BulletManager : MonoBehaviour{
    List<Bullet> bullets;

    void Start(){
        bullets = new List<Bullet>
    }

    public void Add(Vector3 pos){
        /*省略(((((((((((っ・ω・)っ ブーン*/
    }
}
GameManager.cs
public class GameManager{
    [SerializeField]
    BulletManager bulletManager;

    void Start(){
        bulletManager.Add(new Vector3(0,0,0));
    }
}

これで実行するとReferenceExceptionが発生!
どうやらBulletManagerListで発生しているらしい。

原因

BulletManagerStart()Listnewで生成している。
そしてGameManagerStart()BulletManagerAdd()を呼び出している。
Add()ではBulletManagerListを使っている。

原因はこれを順番にしてみると分かる。

  1. GameManagerStart()が呼び出されてBulletManagerAddが呼ばれる(ここでReferenceException)
  2. BulletManagerStart()が呼び出されListが生成される。

つまりBulletManagerStart()Listが生成される前にListを参照するAdd()が呼び出されてしまう。

解決策

解決策1

解決策としてGameManagerStart()よりBulletManagerStart()を初めに呼び出してListを最初に生成させる。

解決策2

BulletManagerListの生成をAwake()関数で実行すればGameManagerStart()よりも前にListが生成されるので解決できます。

参考:イベント関数の実行順

ryo0kaさんありがとうございます!

解決策2のほうがUnity側で管理しなくてもいいので良さそうです。

方法

UnityでEdit->Project Settings -> Script Execution Order+ボタンをクリックしてStart()を呼び出したいクラスのtimeを短めにセットする。