53590


`IEnumerator`は非同期の書き方ですが
Unityでは`Start()`は初期化の時に使う関数なのでそれを非同期に関数の名前にしてしまうと`Start()`を使いたいときに使えなくなるのでほんとはよろしくない書き方だと思うので`IEnumerator
e()`という関数を作ってそれを非同期したのですが`Start`を非同期にするのとどう違うのでしょうか？

[code]

    public class Emitter : MonoBehaviour {
    
        public GameObject[] waves;
        private int currentWave;
    
        // Use this for initialization
        /*
        IEnumerator Start ()
        {
            if(waves.Length == 0)
            {
                yield break;
            }
    
            while(true)
            {
                Debug.Log("コルーチン");
                GameObject wave = (GameObject)Instantiate(waves[currentWave],
                    transform.position,
                    Quaternion.identity);
    
                wave.transform.parent = transform;
                while(wave.transform.childCount != 0)
                {
                    yield return new WaitForEndOfFrame();
                }
                Destroy(wave);
    
                if (waves.Length <= ++currentWave)
                {
                    currentWave = 0;
                }
            }
    
        }
    */
    
        private IEnumerator e()
        {
            if (waves.Length == 0)
            {
                yield break;
            }
    
            while (true)
            {
                Debug.Log("コルーチン");
                GameObject wave = (GameObject)Instantiate(waves[currentWave],
                    transform.position,
                    Quaternion.identity);
    
                wave.transform.parent = transform;
                while (wave.transform.childCount != 0)
                {
                    yield return new WaitForEndOfFrame();
                }
                Destroy(wave);
    
                if (waves.Length <= ++currentWave)
                {
                    currentWave = 0;
                }
            }
    
        }
    
        private void Start()
        {
            StartCoroutine(e()); 
    
        }
    
        // Update is called once per frame
    
        void Update () {
    
        }
    
    }
    
[/code]


CC BY-SA 4.0
2019-03-19T20:25:06.253
53556
2019-03-21T03:13:20.593
2019-03-20T01:47:07.570
2238
question
c# unity2d
IEnumerator start()の正しい書き方


`IEnumerator Start()` は一般的な使用方法であり、問題ありません。

コンストラクタ的な機能が必要であれば `void Awake()` の使用を検討してください。  
ただし、`Awake` メソッドは呼び出されるオブジェクトの順番が保証されていないため、他のオブジェクトの情報取得は行わないようにする等の注意が必要です。

[Unity -
スクリプティングAPI](https://docs.unity3d.com/jp/460/ScriptReference/MonoBehaviour.Awake.html)
より抜粋

> Awake関数の呼び出しはランダムオーダーで行われますので、Awake
> 関数でのオブジェクトの参照は行っても、情報の取得は行わないようにしましょう。参照先の Awake 関数の処理が終わっていない可能性があるからです。
> 情報の取得はStart関数で行うようにします。 また、スクリプトのインスタンスが無効の場合でも呼び出されます。


CC BY-SA 4.0
2019-03-20T09:52:47.533
53590
2019-03-21T03:13:20.593
2019-03-21T03:13:20.593
14817
14817
53556
answer