

Unity初心者です。

Unity内のfor文に関しての質問です。  
今、サイコロででた目の数だけキャラクターをマスの上で  
動かすプログラムを組んでみたのですが、  
上下左右に1マス、1マスずつ指定した方向に動かしたいのに、  
一度方向を指定した瞬間に一気にその方向に動いてしまいます。  
どのように修正すれば、入力待ちしながら1マス1マス動かすことができるようになりますか。  
以下プログラミング内容になります。  
updateの中で実行しています。

よろしくお願いします。

※d62.lastresultはサイコロの出た目です。

[code]

    public void MoveMain(){
    
        Dice2 d62 = dice2.GetComponent ();
        if (d62.lastresult != 0 && jj == false) {
            for (int i = 0; i < d62.lastresult; i++) {
                if(Input.GetKeyUp (KeyCode.W) ) {
                    this.transform.position += new Vector3 (0, 0, 1);
                    jj=true;
                }else if(Input.GetKeyUp (KeyCode.S)){
                    this.transform.position += new Vector3 (0, 0, -1);
                    jj=true;
                }else if(Input.GetKeyUp (KeyCode.A)){
                    this.transform.position += new Vector3 (-1, 0, 0);
                    jj=true;
                }else if(Input.GetKeyUp (KeyCode.D)){
                    this.transform.position += new Vector3 (1, 0, 0);
                    jj=true;
                }
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2016-02-08T15:32:22.930
21859
2016-04-20T13:18:25.940
2016-02-08T17:15:46.990
3068
14333
question
c# unity3d
Unity内のfor文に関しての質問です。

[code]

    public void MoveMain(){
    
        Dice2 d62 = dice2.GetComponent ();
        if (d62.lastresult != 0 && jj == false) {
            for (int i = 0; i < d62.lastresult; i++) {
                if(Input.GetKeyUp (KeyCode.W) ) {
                    this.transform.position += new Vector3 (0, 0, 1);
                    jj=true;
                }else if(Input.GetKeyUp (KeyCode.S)){
                    this.transform.position += new Vector3 (0, 0, -1);
                    jj=true;
                }else if(Input.GetKeyUp (KeyCode.A)){
                    this.transform.position += new Vector3 (-1, 0, 0);
                    jj=true;
                }else if(Input.GetKeyUp (KeyCode.D)){
                    this.transform.position += new Vector3 (1, 0, 0);
                    jj=true;
                }
            }
        }
    }
    
[/code]

上記だと、そもそも同一フレーム内にすべて処理してしまいます。  
そのため、フレーム別で管理してあげる必要があります。

> 1フレーム目：入力  
>  2フレーム目：(入力を検知している場合)移動  
>  3フレーム目：(入力を検知している場合)移動  
>  ・  
>  ・  
>  ・

ですので事象ごとにフラグで管理してコントロールしてやれば、  
質問者さんがしたいことは実現できるかと思います。

**追記**

上記のコードですが、

> if (d62.lastresult != 0 && jj == false) {

ここでは、ダイスの結果が0以外、jj?が偽である場合の分岐です。

> if(Input.GetKeyUp (KeyCode.W) ) {  
>  else if(Input.GetKeyUp (KeyCode.S)){  
>  else if(Input.GetKeyUp (KeyCode.A)){  
>  else if(Input.GetKeyUp (KeyCode.D)){

これいずれかが真だと、同一フレーム内では常に真の結果が返ります。

> jj=true;

これが本来ストッパーの役割を果たすものだと思いますが、果たせていません。

一度箇条書きでいいので、実現したいことを時系列を並べて設計をしてみてください。  
必要であればさらに追記します。


CC BY-SA 3.0
2016-02-08T23:50:08.990
21863
2016-02-09T00:12:50.663
2016-02-09T00:12:50.663
14215
14215
21859
answer


コルーチンで入力待ちすれば、  
以下の様な書き方できるんじゃないかな？

[code]

    public void MoveMain(){
        StartCoroutine(CoMoveMain());
    }
    
    IEnumerator CoMoveMain(){
        Dice2 d62 = dice2.GetComponent();
        for(int i=0;i<d62.lastresult;i++){
            While(!Input.anyKeyDown){ yield return 0; }
    
            if(Input.GetKeyUp (KeyCode.W) ) {
                this.transform.position += new Vector3 (0, 0, 1);
            }else if(Input.GetKeyUp (KeyCode.S)){
                this.transform.position += new Vector3 (0, 0, -1);
            }else if(Input.GetKeyUp (KeyCode.A)){
                this.transform.position += new Vector3 (-1, 0, 0);
            }else if(Input.GetKeyUp (KeyCode.D)){
                this.transform.position += new Vector3 (1, 0, 0);
            }
            else{
                i--;
            }
        }
    }
    
[/code]

※Transamさんからご指摘がありましたので加筆してみました。  
...こういうことなのかな(^^;？


CC BY-SA 3.0
2016-02-09T00:40:25.977
21865
2016-02-09T01:59:50.423
2016-02-09T01:59:50.423
14256
14256
21859
answer