2017-02-21 12 views
-1

私はスレッドとcaroutines上のいくつかの研究を行なったし、私は私が持っているプログラミングの問題を「かむ」する方法がわからない:のC#、団結 - caroutines、スレッド、ロジック、プログラムの開発構造

私はsimultainously文字を実行する必要がありますAIはシンプルなゲームであり、指定された時間だけ実行を一時停止/一時停止することができます。 また、リストから文字を取り出し、それぞれのAIを作成するforeach関数を実行する必要があります(コンストラクタを渡すことで、必要に応じて新しいAIを作成できる)。

これはおそらく簡単なことですが、私は経験がありません。助けてください。

+0

あなたの問題は何ですか?いくつかのコードを見せてください。あなたの鎧師は何もしない努力を示しています。また、Unity3Dは 'Component-Based'アーキテクチャなので、複数のGameObjectsを同時に動かすスクリプトを作ることは、それほど難しいことではありません。 – Smartis

答えて

2

Unityでは、同時動作を作成するためにスレッドなどについてあまり考える必要はありません。例えば;別のGameObjectに従うスクリプトを使って、GameObject、Enemyを作成します。 Player、あなたからの動きを取り入れるスクリプトを持っています。スクリプトを持つシーン内のすべてのオブジェクトは、スレッドなどを必要とすることなく、同時に実行されます。例えば、同じスクリプトEnemyFollowPlayer.csで5つのGameObjects "Enemy"があり、同時に5つの異なるEnemyFollowPlayerとして実行されます。コルーチンは、1つのスクリプト内でスレッドの振る舞いをしたい場合に非常に便利ですが、最も基本的なものには必要ありません。

I made a quick GIF to illustrate how Unity handles simuntaneous execution私の説明からわかりません。あなたは、ユニティコンポーネントベースのアーキテクチャについて間違った考え方を持っているようです。

このGIFには、Test.csがあります。これは、添付されているGameObjectにx = 0.001を移動させます。毎回void Update()が実行されます。これはUnityが毎フレーム実行します。私たちは1 GameObjectでどのように動作するのかを見ています。そのGameObjectをコピーすると、2つのGameObjectで同時にCoroutines、Threadsなどの必要がなくなります。

コルーチンはコード非同期を実行するのに最適です! Unityには便利な機能がいくつか付属しています。この例をチェックしてください:

void SomeNormalMethod() { 
    StartCoroutine(AsyncMethod()); 
    Debug.Log("I will Log first"); 
} 

IEnumerator AsyncMethod() { 
    yield return new WaitForSeconds(3f); 
    Debug.Log("Then after 3 seconds, I will Log!"); 
} 

Aコルーチンは私たちにyield機能へのアクセスを与えるタイプのIEnumeratorの方法でなければなりません。これにより、Unityの機能WaitForSeconds(他の中でも)を使用して、何かをする前にこの非同期コードを数秒待機させ、SomeNormalMethod()の実行を中断することなく継続できます! StartCoroutine()でそれらを初期化することを忘れないでください。そうしないと何も起こりません!

+0

ありがとうございます - 私はコードで初期化されたコードを実行する点で考えていましたが、GameObjectsの経験はあまりなく、必要であれば同時に実行するようスクリプト化されています。私は、GameObjectsとやりとりするコード構造によって基盤を作ります。 – Bronsoner

+0

よろしく!コードで初期化されたコードを実行することは、Coroutinesの優れた使い方です。 – Maakep

+0

ご理解いただきありがとうございます。私ができる場合は、私はあなたに多くのポイントを与えるだろう:) – Bronsoner