Windows system >> Windowsの知識 >  >> コンピュータソフトウェアのチュートリアル >> 画像マルチメディア >> Unity3dあなたが

を必要としないのであれば、関数

Unity3dあなたが

を必要としないのであれば、関数

  
を呼び出さないでください。例えば、敵が遠くにいるとき、敵が眠りに落ちるとき、完璧な時間は受け入れられます。プレイヤーが近づくまで何もしません。これは遅い処理方法です:function Update(){//プレイヤーが遠すぎる場合は早い段階で。 (Vector3.Distance(transform.position、target.position)> 100)return;;実際の作業を行う…}これはお勧めできません。作業のすべてのフレームを実行するときにUnityがupdate関数を呼び出す必要があるためです。より良い解決策は、プレイヤーが近くなるまで行動を無効にすることです。これを行うには3つの方法があります。1. OnBecameVisibleとOnBecameInvisibleを使用します。これらのコールバックはレンダリングシステムに結び付けられています。どのカメラもそのオブジェクトを見ることができる限り、OnBecameVisibleが呼び出され、どのカメラもそのカメラを見ていない場合は、OnBecameInvisibleが呼び出されます。この方法は多くの状況で非常に役立ちますが、カメラを離れている限り使用できないため、通常はAIではあまり役に立ちません。関数OnBecameVisible(){enabled = true;} function OnBecameInvisible(){enabled = false;} 2.トリガを使用します。単純な球状のトリガーは非常にうまくいきます。このインフルエンスボールを離れると、OnTriggerEnter /Exitコールを受けるでしょう。関数OnTriggerEnter(c:Collider){if(c.CompareTag(< Player> Player>))enabled = true;} function OnTriggerExit(c:Collider){(if(c.CompareTag(' Player> Player'))enabled = false;}共同プログラムを使用する。 Update呼び出しの問題は、それらがフレームごとに発生することです。 5秒ごとにプレイヤーまでの距離を確認するだけで済みます。これは多くの処理サイクルを節約するはずです。

コラボレーティブプログラム:独自の条件が満たされるまでその実行を妨げることを可能にする特別なタイプの関数型プログラミング。関数MyCoroutine(){DoSomething(); yield; //1フレームに留まるDoSomethingElse();}この関数を呼び出すと(コルーチンを開始する)、出力に到達するまで、他の通常の関数と同じように動作します。プロダクション命令は、次のように解釈します。この意味での命令の出力として、関数を停止してコードを実行するための制御を返し、宣言された作業を返すために関数を呼び出します。主な違いは、yield命令を使うと、(最後の例ではDoSomethingElse()ステートメントの後に)コードの実行を遅らせることができます。関数MyCoroutine(){DoSomething(); //すぐにこのyieldを実行する; //呼び出し元に制御を返すDoSomethingElse(); //これは1フレーム後に実行される} void Start(){MyCoroution();} MyCoroutineがさらにコードを要求するとどうなりますか? function MyCoroutine(){print('これは2番目に印刷されます< '); //制御は開始関数print(' 3番目の1フレーム後に正確に1フレーム印刷されます)に戻ります。 void Start(){print('これは最初に印刷されます); MyCoroutine(); print('これは3番目に印刷されます<;);}命令を制御できると、歩留まりコードが実行されます。 1つのフレームが別のコルーチンを呼び出すのを待ちます:呼び出しコルーチンが実行を完了するまで待ちますWaitForSecondsオブジェクト:しばらく待ちますか? function MyCoroutine(){DoSomething()://yieldを実行するWaitForSeconds(2); //コントロールは呼び出し元に戻りますDoSomethingElse(); //これは2秒後に実行されます。} void Start(){ MyCoroutine();} function MyCoroutine(){DoSomething()://すぐにyield MyOtherCoroutine(); //MyOtherCoroutineに移動します。 DoSomethingElse(); //MyOtherCoroutine()関数の実行後に実行されますMyOtherCoroutine(){DoStuff()://yieldを実行しますWaitForSeconds(2); //この場合は開始関数の呼び出し元に戻ります。 ()DoMoreStuff(); //これは2秒後に実行されます//MyOtherCoroutineはここで行われます} void Start(){MyCoroutine();}

コルーチン&イールドイールド一連のイベントに対処する必要があります。これは以下のようなコードにつながる可能性があります。 private var state = 0; function Update(){if(state == 0){//ステップ0を実行するstate = 1; return;} if(state == 1){//ステップ1を実行state = 2; return;} yieldステートメントを使用するほうが便利です。 yieldステートメントは特殊なタイプのreturnであり、これは関数が次回の呼び出しでyieldステートメントから実行され続けることを保証します。 while(true){//ステップ0を実行する; //フレームを待機する////ステップ1を実行する////フレームを待機する////hellip;} Update関数の実行を遅らせるために特定の値をyieldステートメントに渡すこともできます。特定のイベントが発生するまで//何かをするWaitForSeconds(5.0); //5秒間待つ//他のことを行う&コルーチンをスタックして接続することができるこの例ではDoを実行し、呼び出しの直後に続けます。 Do(); print('これはすぐに印刷されます); function Do(){print(< '); yield WaitForSeconds(2); print(' 2秒後に");}この例はDoを実行し、終了するまで待ってから実行を続けます。 //コルーチンの歩留りStartCoroutine(< r>; print(< 2秒>); print(')これは、Doコルーチンの実行が終了した後のものです。< print(') UpdateまたはFixedUpdateでは、yieldを使用することはできませんが、StartCoroutineを使用すると、StartCoroutineを使用することができます。機能yieldの使い方の詳細については、YieldInSeconds、WaitForFixedUpdate、Coroutine、およびMonoBehaviour.StartCoroutineを参照してください。

Copyright © Windowsの知識 All Rights Reserved