画面に3つのキューブを配置し、それぞれをコルーチンとUpdate()で左右に動かしてみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
using UnityEngine; using System.Collections; public class TestCoroutine : MonoBehaviour { public GameObject _cube1, _cube2, _cube3; bool _flag = true; float _limitX = 5f; float _stepX = 0.1f; int _direction = 1; void MoverCube1() { Vector3 pos = _cube1.transform.localPosition; pos.x += _stepX * _direction; if (pos.x > _limitX || pos.x < -_limitX) _direction *= -1; _cube1.transform.localPosition = pos; } IEnumerator MoverCube2() { Vector3 pos = _cube2.transform.localPosition; int direction = 1; while(_flag) { pos.x += _stepX * direction; if (pos.x > _limitX || pos.x < -_limitX) direction *= -1; _cube2.transform.localPosition = pos; yield return null; } } IEnumerator MoverCube3() { Vector3 pos = _cube3.transform.localPosition; int direction = 1; while(_flag) { pos.x += _stepX * direction; if (pos.x > _limitX || pos.x < -_limitX) direction *= -1; _cube3.transform.localPosition = pos; yield return new WaitForSeconds(0.1f); } } void Start() { StartCoroutine(MoverCube2()); StartCoroutine(MoverCube3()); } void Update() { MoverCube1(); } } |
33行目: nullを返す。中断し次のフレームで再開する。
48行目: 0.1秒の待ち時間を指定。0.1秒後に再開する。
※MoverCube2()とMoverCube3()の違いは、yieldの指定内容だけ(33行目と48行目)。
実行結果
yield return null;
としたCube2は、Update()と同じ周期で動作
yield return new WaitForSeconds(0.1f);
としたものは、0.1秒の待機時間付きで動作
参考
Update()や各コルーチンがMonoBehaviourのライフサイクル内で、どんなタイミングで実行されるかは以下のページ(図)を参照してください。Unity3D触ってるとよく見る定番の図です。
Unity3D MonoBehaviour Lifecycle:
http://www.richardfine.co.uk/2012/10/unity3d-monobehaviour-lifecycle/
公式ドキュメントのコルーチンの説明
コルーチン / Coroutines:
http://docs-jp.unity3d.com/Documentation/Manual/Coroutines.html
コメントを残す
コメントを投稿するにはログインしてください。