unity2d:co-routine
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
unity2d:co-routine [2016/01/18 00:10] – yajuadmin | unity2d:co-routine [2024/01/12 01:59] – yajuadmin | ||
---|---|---|---|
行 1: | 行 1: | ||
- | < | + | ====== |
- | #コルーチン | + | ===== 概要 |
- | + | 特徴として通常の関数とは異なり、処理を途中で抜けて任意のタイミングで中断部分から処理を再開できる。\\ | |
- | ##概要 | + | |
- | 特徴として通常の関数のとは異なり、処理を途中で抜けて任意のタイミングで中断部分から処理を再開できる。 | + | |
例えば、初心者の方が「キャラクターを1フレームに1ドットずつ100 ドット動かす」といった場合、下記のようにしてしまうことがあります。 | 例えば、初心者の方が「キャラクターを1フレームに1ドットずつ100 ドット動かす」といった場合、下記のようにしてしまうことがあります。 | ||
+ | <code csharp> | ||
for(int i=1; i<100; i++){ | for(int i=1; i<100; i++){ | ||
- | myChar.MoveToRight(1); | + | |
} | } | ||
+ | </ | ||
- | これでは結果的に失敗で、これを実行すると1フレームで100ドット右に動いてしまいます。 | + | これでは結果的に失敗で、これを実行すると1フレームで100ドット右に動いてしまいます。\\ |
ところが、「yeild」を1行入れることで、1フレームに1ドットずつ100ドット動かすことが出来るようになります。 | ところが、「yeild」を1行入れることで、1フレームに1ドットずつ100ドット動かすことが出来るようになります。 | ||
+ | <code csharp> | ||
for(int i=1; i<100; i++){ | for(int i=1; i<100; i++){ | ||
- | myChar.MoveToRight(1); | + | |
- | yeild return 0; | + | yeild return 0; |
} | } | ||
+ | </ | ||
- | 「yeild」を使用することで、関数の実行を一時的に中断し、次回にその関数が呼び出されたときにその続きを実行することが出来ます。 | + | 「yeild」を使用することで、関数の実行を一時的に中断し、次回にその関数が呼び出されたときにその続きを実行することが出来ます。\\ |
内部的には、オブジェクト指向のイテレータとなるため「IEnumerator」を使う。この機能により状態変数を減らせることが出来て便利です。 | 内部的には、オブジェクト指向のイテレータとなるため「IEnumerator」を使う。この機能により状態変数を減らせることが出来て便利です。 | ||
- | [Unityで覚えるC# | + | http:// |
- | ![コルーチンスライド](http:// | + | コルーチンスライド |
- | 【参考】 | + | ==== 参考 |
- | [マイクロスレッド](https:// | + | * [[http:// |
- | [[VB]遅れてやってきたYield その5](http:// | + | * [[https:// |
+ | | ||
- | ##コルーチンの準備 | + | ===== コルーチンの準備 |
- | ###シーンの読み込み | + | ==== シーンの読み込み |
- | UnityChan2Dのプロジェクトを使用して、コルーチンの動きを確認してみましょう。 | + | UnityChan2Dのプロジェクトを使用して、コルーチンの動きを確認してみましょう。\\ |
UnityChan2D→Assets→Scenesにある「Introduction Demo」をクリックして、シーンの読み込みを行ってください。 | UnityChan2D→Assets→Scenesにある「Introduction Demo」をクリックして、シーンの読み込みを行ってください。 | ||
| | ||
![プロジェクト1](http:// | ![プロジェクト1](http:// | ||
![シーン1](http:// | ![シーン1](http:// | ||
- | </markdown> | + | |
+ | ==== 弾としてコインのスプライトを生成 ==== | ||
+ | UnityChan2D→Demo→SpritesのCoin.pngをUnityChan2D→Spritesにコピーします。\\ | ||
+ | Inspectorにて「Sprite Mode」を「Multiple」、「Pixels Per Unit」を「16」にします。\\ | ||
+ | Sprite Editorにて「Type」をGridに変更、「Size」をX 16 Y 16で「Slice」ボタンを押下後、Applyします。 | ||
+ | |||
+ | ![スプライト1](http:// | ||
+ | ![インスペクター1](http:// | ||
+ | ![スプライトエディタ1](http:// | ||
+ | |||
+ | ==== 弾であるコインの設定 ==== | ||
+ | Coinが大きいので、Scaleを0.5にして小さくします。\\ | ||
+ | またRigidBody 2Dを追加して「Gravity Scale」を「0」にし、「Freeze Rotation Z」をオンにします。\\ | ||
+ | また、Circle Collider 2Dを追加します。 | ||
+ | |||
+ | ![シーン2](http:// | ||
+ | ![インスペクター2](http:// | ||
+ | ![コライダー1](http:// | ||
+ | |||
+ | ==== C# | ||
+ | Assets/ | ||
+ | アタッチ後、プレハブ化するためにAssets/ | ||
+ | |||
+ | <code csharp> | ||
+ | public class Coin : MonoBehaviour { | ||
+ | public int speed = 2; | ||
+ | private static int count = 0; | ||
+ | |||
+ | void Start() { | ||
+ | GetComponent< | ||
+ | } | ||
+ | |||
+ | void OnTriggerStay2D(Collider2D other) { | ||
+ | if (other.tag == " | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | void OnBecameInvisible() { | ||
+ | Destroy(this.gameObject); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== コルーチンの使い方 ==== | ||
+ | Unityでコルーチンを使用するケースのほとんどは、任意の時間(秒)処理を止めたい場合となります。\\ | ||
+ | 任意の時間(秒)処理を止める処理は下記コードとなります。 | ||
+ | |||
+ | <code csharp> | ||
+ | yield return new WaitForSeconds (秒数); | ||
+ | </ | ||
+ | |||
+ | コルーチンは、IEnumeratorを返す関数として実装します。\\ | ||
+ | |||
+ | <code csharp> | ||
+ | IEnumerator Shot() { | ||
+ | yield return new WaitForSeconds(1f); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | コルーチンを呼ぶには、StartCoroutineメソッドで実行します。 | ||
+ | |||
+ | <code csharp> | ||
+ | StartCoroutine(“Shot”); | ||
+ | </ | ||
+ | |||
+ | === 参照 === | ||
+ | [[http:// | ||
+ | |||
+ | ==== Coinの発射 ==== | ||
+ | 左クリックでコインが3連射されるようにプログラムを変更します。\\ | ||
+ | ![シーン3](http:// | ||
+ | |||
+ | Assets/ | ||
+ | |||
+ | <code csharp> | ||
+ | private bool isRunning = false; | ||
+ | public GameObject Coin; | ||
+ | |||
+ | void Update() { | ||
+ | if (m_state != State.Damaged) { | ||
+ | float x = Input.GetAxis(" | ||
+ | bool jump = Input.GetButtonDown(" | ||
+ | Move(x, jump); | ||
+ | // | ||
+ | if (Input.GetButtonDown(" | ||
+ | StartCoroutine(“Shot”); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | | ||
+ | if (isRunning) { yield break; } | ||
+ | | ||
+ | // | ||
+ | | ||
+ | | ||
+ | | ||
+ | yield return new WaitForSeconds(1f); | ||
+ | } | ||
+ | isRunning = false; | ||
+ | } | ||
+ | </code> |
unity2d/co-routine.txt · 最終更新: 2024/01/12 02:13 by yajuadmin