ユーザ用ツール

サイト用ツール


unity2d:co-routine

差分

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

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
unity2d:co-routine [2016/02/14 23:26] yajuadminunity2d:co-routine [2024/01/12 02:13] (現在) – [C#スクリプト作成] yajuadmin
行 1: 行 1:
-<markdown> +====== コルーチンについて ====== 
-#コルーチンについて +===== 概要 ===== 
- +特徴として通常の関数とは異なり、処理を途中で抜けて任意のタイミングで中断部分から処理を再開できる。\\  
-##概要 +
-特徴として通常の関数とは異なり、処理を途中で抜けて任意のタイミングで中断部分から処理を再開できる。  +
 例えば、初心者の方が「キャラクターを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);  +    myChar.MoveToRight(1);  
 } }
 +</code>
  
-これでは結果的に失敗で、これを実行すると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);    +    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/images/unity10/co-routine.png)+
  
-参考】   +==== 参考 ==== 
-[マイクロスレッド](https://web.archive.org/web/20130522010427/http:/www44.atwiki.jp/pioswiki/pages/33.html)   +  [[http://www.slideshare.net/lucifuges/unityc|Unityで覚えるC# SlideShare]
-[[VB]遅れてやってきたYield その5](http://blogs.wankuma.com/yaju/archive/2012/12/24/310310.aspx)+  * [[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のプロジェクトを使用して、コルーチンの動きを確認してみましょう。\\
 UnityChan2D→Assets→Scenesにある「Introduction Demo」をクリックして、シーンの読み込みを行ってください。    UnityChan2D→Assets→Scenesにある「Introduction Demo」をクリックして、シーンの読み込みを行ってください。   
              
-![プロジェクト1](http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine2.png)  +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine2.png|}} 
-![シーン1](http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine3.png)+{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine3.png|}}
  
-###弾としてコインのスプライトを生成 +==== 弾としてコインのスプライトを生成 ==== 
-UnityChan2D→Demo→SpritesのCoin.pngをUnityChan2D→Spritesにコピーします。   +UnityChan2D→Demo→SpritesのCoin.pngをUnityChan2D→Spritesにコピーします。\\   
-Inspectorにて「Sprite Mode」を「Multiple」、「Pixels Per Unit」を「16」にします。  +Inspectorにて「Sprite Mode」を「Multiple」、「Pixels Per Unit」を「16」にします。\\  
 Sprite Editorにて「Type」をGridに変更、「Size」をX 16 Y 16で「Slice」ボタンを押下後、Applyします。 Sprite Editorにて「Type」をGridに変更、「Size」をX 16 Y 16で「Slice」ボタンを押下後、Applyします。
  
-![スプライト1](http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine4.png)  +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine4.png|}}  
-![インスペクター1](http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine5.png) +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine5.png|}} 
-![スプライトエディタ1](http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine6.png)+{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine6.png|}}
  
-###弾であるコインの設定 +==== 弾であるコインの設定 ==== 
-Coinが大きいので、Scaleを0.5にして小さくします。   +Coinが大きいので、Scaleを0.5にして小さくします。\\   
-またRigidBody 2Dを追加して「Gravity Scale」を「0」にし、「Freeze Rotation Z」をオンにします。  +またRigidBody 2Dを追加して「Gravity Scale」を「0」にし、「Freeze Rotation Z」をオンにします。\\
 また、Circle Collider 2Dを追加します。   また、Circle Collider 2Dを追加します。  
  
-![シーン2](http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine7.png)  +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine7.png|}}  
-![インスペクター2](http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine8.png)   +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine8.png|}}  
-![コライー1](http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine9.png) +{{http://yaju.sakura.ne.jp/wiki/images/unity10/co-routine9.png|}}  
-</markdown>+ 
 +==== 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() { 
 +         if (isRunning) { yield break; } 
 +         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> 
unity2d/co-routine.1455459984.txt.gz · 最終更新: 2016/02/14 23:26 by yajuadmin