LoginSignup
2
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-28

僕が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を短めにセットする。

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2