3056


どうも、皆様お世話になっております。

下記の仕様を実現させるために、仕様2の箇所を下のコードで実装してみたのですが、 仕様3の「移動方向に合わせて」の箇所で実装方法に詰まってしまいました。

【仕様】  

  1. 2Dキャラクタで八方向のSpriteを持つ
  2. マウスクリック（またはタップ）でクリックした場所にキャラクタが移動する
  3. 移動方向に合わせてSpriteを切り替える

【実装コード】

[code]

    //移動速度
    public float speed = 2;
    
    Vector2 vec;
    
    void Update () {
        //移動処理
        if(Input.GetMouseButtonDown(0)){
            vec=Camera.main.ScreenToWorldPoint(Input.mousePosition);
            //Debug.Log("x="+vec.x+" y="+vec.y);
        }
        transform.position = Vector2.MoveTowards(transform.position, new Vector2(vec.x,vec.y), speed * Time.deltaTime);
    
    }
    
[/code]

こちらに関して良いアイディアは御座いませんでしょうか？お知恵を拝借したく存じます。


CC BY-SA 3.0
2015-01-04T04:21:42.017
3013
2015-01-05T03:01:38.870
5974
question
unity3d
Unityで2Dキャラクタをクリックした場所へ移動、対応したSpriteを表示させるには？


必要になるのはVector2の演算とMecanimをつかったアニメーションの切り替えです。

どちらも公式のチュートリアルに出てきますので確認してみてください。

  * <http://japan.unity3d.com/developer/document/tutorial/2d-shooting-game/game/02.html>

2つのVector2を引き算した値を取得したXとYのそれぞれが一定の値以上か以下かの組み合わせで8方向の判定を得られます。参考までに4方向の例を挙げます。チュートリアルのようにnormalizeするのもよいでしょう。

[code]

    //移動速度
    public float speed = 2;
    
    Vector2 vec;
    
    void Update () {
        //移動処理
        if(Input.GetMouseButtonDown(0)){
            Vector2 vec = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            Vector2 diff = (Vector2) this.transform.position - vec;
            Debug.Log ("x="+diff.x+" y="+diff.y);
    
            var direction = "nutral";
    
            if (diff.x > 0 && diff.y < 0) {
                // left up
            } else if (diff.x > 0 && diff.y > 0) {
                // left down
            } else if (diff.x < 0 && diff.y < 0) {
                // right up
            } else if (diff.x < 0 && diff.y > 0) {
                // right down
            }
        }
    }
    
[/code]

  * <http://japan.unity3d.com/developer/document/tutorial/2d-shooting-game/game/11.html>

判定した結果を元にAnimatorControllerにフラグをあてて対応するアニメーションステートに切り替えてはどうでしょうか。サンプルではSetTriggerを使っていますが、SetParameterを使って値を渡すこともできます。

パラメータの場合であればVector2の差分のXとYをそのまま渡し、方向の制御はすべてMecanimのステート制御にまかせてしまうとコードが要らなくなりますね。

Mecanimについては、まさにそのものという記事がありました。

  * <http://mobiletou.ch/2014/01/unity4-3-%E3%81%A7%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%81%9F-sprite-%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86-%E3%81%9D%E3%81%AE2>


CC BY-SA 3.0
2015-01-04T12:53:42.207
3056
2015-01-05T03:01:38.870
2015-01-05T03:01:38.870
452
452
3013
answer