ユーザ用ツール

サイト用ツール


unity2d:co-routine

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
unity2d:co-routine [2016/01/17 23:52] yajuadminunity2d:co-routine [2024/01/12 02:13] (現在) – [C#スクリプト作成] yajuadmin
行 1: 行 1:
-<markdown> +====== コルーチンについて ====== 
-#コルーチン +===== 概要 ===== 
- +特徴として通常の関数とは異なり、処理を途中で抜けて任意のタイミングで中断部分から処理を再開できる。\\   
-##概要 +例えば、初心者の方が「キャラクターを1フレームに1ドットずつ100 ドット動かす」といった場合、下記のようにしてしまうことがあります。
-特徴として通常の関数とは異なり、処理を途中で抜けて任意のタイミングで中断部分から処理を再開できる。   +
-例えば、初心者の方が「キャラクターをフレームにドットずつ100 ドット動かす」といった場合、下記のようにしてしまうことがあります。+
  
 +<code csharp>
 for(int i=1; i<100; i++){   for(int i=1; i<100; i++){  
-  myChar.MoveToRight(1);  +    myChar.MoveToRight(1);  
 } }
 +</code>
  
-これでは結果的に失敗で、これを実行するとフレームで100 ドット右に動いてしまいます。 +これでは結果的に失敗で、これを実行すると1フレームで100ドット右に動いてしまいます。\\ 
- +ところが、「yeild」を1行入れることで、1フレームに1ドットずつ100ドット動かすことが出来るようになります。
-ところが、「yeild」を1行入れることで、フレームにドットずつ100 ドット動かすことが出来てしまいます。+
  
 +<code csharp>
 for(int i=1; i<100; i++){   for(int i=1; i<100; i++){  
-  myChar.MoveToRight(1);    +    myChar.MoveToRight(1);    
-  yeild return 0;  +    yeild return 0;  
 }  }
 +</code>
  
-「yeild」を使用することで、関数の実行を一時的に中断し、次回にその関数が呼び出されたときにその続きを実行することが出来ます。  +「yeild」を使用することで、関数の実行を一時的に中断し、次回にその関数が呼び出されたときにその続きを実行することが出来ます。\\ 
 内部的には、オブジェクト指向のイテレータとなるため「IEnumerator」を使う。この機能により状態変数を減らせることが出来て便利です。   内部的には、オブジェクト指向のイテレータとなるため「IEnumerator」を使う。この機能により状態変数を減らせることが出来て便利です。  
  
-[Unityで覚えるC# SlideShare](http://www.slideshare.net/lucifuges/unityc)   +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine.png|}} 
-![コルーチンスライド](http://yaju.sakura.ne.jp/wiki/image/unity10/co-routine.png)+ 
 +==== 参考 ==== 
 +  * [[http://www.slideshare.net/lucifuges/unityc|Unityで覚えるC# SlideShare]
 +  * [[https://web.archive.org/web/20130522010427/http:/www44.atwiki.jp/pioswiki/pages/33.html|マイクロスレッド]]  
 +  [[http://blogs.wankuma.com/yaju/archive/2012/12/24/310310.aspx|[VB]遅れてやってきたYield その5]] 
 + 
 +===== コルーチンの準備 ===== 
 +==== シーンの読み込み ==== 
 +UnityChan2Dのプロジェクトを使用して、コルーチンの動きを確認してみましょう。\\ 
 +UnityChan2D→Assets→Scenesにある「Introduction Demo」をクリックして、シーンの読み込みを行ってください。    
 +       
 +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine2.png|}} 
 +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine3.png|}} 
 + 
 +==== 弾としてコインのライトを生成 ==== 
 +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します。 
 + 
 +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine4.png|}}  
 +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine5.png|}} 
 +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine6.png|}} 
 + 
 +==== 弾であるコインの設定 ==== 
 +Coinが大きいので、Scaleを0.5にして小さくします。\\   
 +またRigidBody 2Dを追加して「Gravity Scale」を「0」にし、「Freeze Rotation Z」をオンにします。\\ 
 +また、Circle Collider 2Dを追加します。   
 + 
 +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine7.png|}}  
 +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine8.png|}}  
 +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine9.png|}}  
 + 
 +==== C#スクリプト作成 ==== 
 +Assets/ScriptsにC# スクリプトの「Coin」を作成します。下記コーを入力してCoinにアタッチします。\\   
 +アタッチ後、プレハブ化するためにAssets/Prefabs にCoinをドラッグ&ドロップします。 
 + 
 +<code csharp> 
 +public class Coin : MonoBehaviour { 
 +    public int speed = 2; 
 +    private static int count = 0; 
 + 
 +    void Start() { 
 +        GetComponent<Rigidbody2D>().velocity = transform.right.normalized * speed; 
 +    } 
 + 
 +    void OnTriggerStay2D(Collider2D other) { 
 +        if (other.tag == "DamageObject") { 
 +               if(++count >= 6) 
 +                 Destroy(other.gameObject); // コインが6発当たれば敵を削除 
 +               Destroy(this.gameObject); 
 +          } 
 +    } 
 + 
 +    void OnBecameInvisible() { 
 +        Destroy(this.gameObject); // カメラから外れたら削除 
 +    } 
 +
 +</code> 
 + 
 +==== コルーチンの使い方 ==== 
 +Unityでコルーチンを使用するケースのほとんどは、任意の時間(秒)処理を止めたい場合となります。\\   
 +任意の時間(秒)処理を止める処理は下記コードとなります。 
 + 
 +<code csharp> 
 +yield return new WaitForSeconds (秒数); 
 +</code> 
 + 
 +コルーチンは、IEnumeratorを返す関数として実装します。\\ 
 + 
 +<code csharp> 
 +IEnumerator Shot() {   
 +    yield return new WaitForSeconds(1f); //1秒待機   
 +}   
 +</code> 
 + 
 +コルーチンを呼ぶには、StartCoroutineメソッドで実行します。 
 + 
 +<code csharp> 
 +StartCoroutine(“Shot”);  
 +</code> 
 + 
 +=== 参照 === 
 +[[http://wonderpla.net/blog/engineer/Unity_Co-routine/|Unityのコルーチンの使い方をまとめてみた]] 
 + 
 +==== Coinの発射 ==== 
 +左クリックでコインが3連射されるようにプログラムを変更します。\\  
 +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine10.png|}} 
 + 
 +Assets/ScriptsにC# スクリプトの「UnityChan2DController」を編集します。 
 + 
 +<code csharp> 
 +private bool isRunning = false; 
 +public GameObject Coin; 
 + 
 +void Update(
 +    if (m_state != State.Damaged) { 
 +        float x = Input.GetAxis("Horizontal"); 
 +        bool jump = Input.GetButtonDown("Jump"); 
 +        Move(x, jump);  
 +        // 左クリックでコイン発射 
 +        if (Input.GetButtonDown("Fire1")) 
 +            StartCoroutine(“Shot”); // コルーチンを呼びます 
 +
 +     }
  
-【参考】   +     IEnumerator Shot() { 
-[マイクロスレッド](https://web.archive.org/web/20130522010427/http:/www44.atwiki.jp/pioswiki/pages/33.html  +         if (isRunning) { yield break; } 
-[[VB]遅れてやってきたYield その5](http://blogs.wankuma.com/yaju/archive/2012/12/24/310310.aspx)+         isRunning = true; 
 +         // コインを3連射する 
 +         for(int i = 0; i<3; i++)  { 
 +             Instantiate(Coin, new Vector2(transform.position.x + 0.5f,  
 +            transform.position.y - 0.5f), Quaternion.identity); 
 +             yield return new WaitForSeconds(1f); // 1秒待機 
 +        } 
 +        isRunning = false; 
 +     } 
 +</code>
  
-##コルーチンの準備 
-</markdown> 
unity2d/co-routine.1453042328.txt.gz · 最終更新: 2016/01/17 23:52 by yajuadmin