質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • C#

    7687questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    4397questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity2D

    975questions

2Dキャラクターを1マスずつ歩行させる

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 427

sena14

score 58

下記のようなもので動かしているのですがアニメーションがおかしくなってしまい困っています。
不具合の正確な発生条件が分かっていないのですが、ずっとある方向に動かした後に違う方向に動かすと違う方向へと移動はするのですがアニメーションが最初に動かしていた方向のアニメーションになってしまいます。その際に一瞬だけ違う方向のアニメーションが再生しているようにも見えます。
どこを修正すればよいのか教えていただけたらと思います。
よろしくお願いします。

修正画像

修正コード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour{

    Vector3 MOVEX = new Vector3(0.32f, 0, 0); // x軸方向に1マス移動するときの距離
    Vector3 MOVEY = new Vector3(0, 0.32f, 0); // y軸方向に1マス移動するときの距離

    float step = 2f;     // 移動速度
    Vector3 target;      // 入力受付時、移動後の位置を算出して保存 
    Vector3 prevPos;     // 何らかの理由で移動できなかった場合、元の位置に戻すため移動前の位置を保存

    Animator animator;   // アニメーション


    // Use this for initialization
    void Start()
    {
        target = transform.position;
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {

        // ① 移動中かどうかの判定。移動中でなければ入力を受付
        if (transform.position == target)
        {
            SetTargetPosition();
        }
        Move();
    }

    // ② 入力に応じて移動後の位置を算出
    void SetTargetPosition()
    {

        prevPos = target;

        if (Input.GetKey("down"))
        {
            SetAnimationParam(0);
            target = transform.position - MOVEY;
            return;
        }
        if (Input.GetKey("up"))
        {
            SetAnimationParam(1);
            target = transform.position + MOVEY;
            return;
        }
        if (Input.GetKey("right"))
        {
            SetAnimationParam(2);
            target = transform.position + MOVEX;
            return;
        }
        if (Input.GetKey("left"))
        {
            SetAnimationParam(3);
            target = transform.position - MOVEX;
            return;
        }
    }

    // WalkParam  0;下移動 1;上移動  2:右移動 3:左移動
    void SetAnimationParam(int param)
    {
        this.animator.SetInteger("Move",param);
    }

    // ③ 目的地へ移動する
    void Move()
    {
        transform.position = Vector3.MoveTowards(transform.position, target, step * Time.deltaTime);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour{

    Vector3 MOVEX = new Vector3(0.32f, 0, 0); // x軸方向に1マス移動するときの距離
    Vector3 MOVEY = new Vector3(0, 0.32f, 0); // y軸方向に1マス移動するときの距離

    float step = 2f;     // 移動速度
    Vector3 target;      // 入力受付時、移動後の位置を算出して保存 
    Vector3 prevPos;     // 何らかの理由で移動できなかった場合、元の位置に戻すため移動前の位置を保存

    Animator animator;   // アニメーション


    // Use this for initialization
    void Start()
    {
        target = transform.position;
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {

        // ① 移動中かどうかの判定。移動中でなければ入力を受付
        if (transform.position == target)
        {
            SetTargetPosition();
        }
        Move();
    }

    // ② 入力に応じて移動後の位置を算出
    void SetTargetPosition()
    {

        prevPos = target;

        if (Input.GetKey("right"))
        {
            target = transform.position + MOVEX;
            SetAnimationParam(1);
            return;
        }
        if (Input.GetKey("left"))
        {
            target = transform.position - MOVEX;
            SetAnimationParam(2);
            return;
        }
        if (Input.GetKey("up"))
        {
            target = transform.position + MOVEY;
            SetAnimationParam(3);
            return;
        }
        if (Input.GetKey("down"))
        {
            target = transform.position - MOVEY;
            SetAnimationParam(0);
            return;
        }
    }

    // WalkParam  0;下移動 1;右移動 2:左移動 3:上移動
    void SetAnimationParam(int param)
    {
        switch (param)
        {
            case 0:
                this.animator.SetTrigger("FrontTrriger");
                break;
            case 1:
                this.animator.SetTrigger("RightTrriger");
                break;
            case 2:
                this.animator.SetTrigger("LeftTrriger");
                break;
            case 3:
                this.animator.SetTrigger("BackTrriger");
                break;
        }
    }

    // ③ 目的地へ移動する
    void Move()
    {
        transform.position = Vector3.MoveTowards(transform.position, target, step * Time.deltaTime);
    }
}


イメージ説明
イメージ説明
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sakura_hana

    2018/05/30 14:09

    OKです、ありがとうございます。が、正直何故そう動くのか分かっていません……どの方向に動いた時も発生しますか? 細かい発生条件はありますか?(すごく高速にキー切り替えすると起こるとか)

    キャンセル

  • sena14

    2018/05/30 14:27

    どの方向でも発生します。速さ自体は関係なさそうなんですが、同一方向に続けて移動させた後に発生するようです。右右左などで最終的に右を向いてしまう

    キャンセル

  • sena14

    2018/05/30 16:08

    修正方法でなくてもより安定して動く方法があれば教えていただきたいです。

    キャンセル

回答 1

checkベストアンサー

0

可能性があるとしたら、2つのキーが同時に押されているパターンです。
例えば右と左が同時に押されている場合、

  1. target = transform.position + MOVEX;
  2. this.animator.SetTrigger("RightTrriger");
  3. target = transform.position - MOVEX;
  4. this.animator.SetTrigger("LeftTrriger");

となり、最終的なtargetはtransform.position - MOVEX;
RightTrrigerとLeftTrrigerが同時に発動する為にRightに一瞬遷移した後Leftへ遷移(もしくは逆)、
という動きになります。

また、「違う方向のキーを押したのに、元の向きのまま元の方向へ動く」「1フレーム間に2つのキーを順次入力」で発生するならまだ分かります。
(SetTargetPositionに入れていない、Trrigerでの遷移前に別の遷移が割り込みしていると推測出来る為)

ですが今回はどれも違うとのことなので、根本的な解決方法は分からないです……

とりあえずアニメーションについてはTriggerではなくIntによる分岐にすると良いかもしれません。
(Triggerは2つ以上同時にtrueになるがIntだと必ず1つの値を取るので、これが原因の不具合は無くなるかと)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 15:18

    Intによる分岐とのことですが
    やってみた結果上下では必ず下向きのアニメーションが再生されてしまい、左右では高速でいろいろな方向のアニメーションが再生されてしまっているように見えます。
    それぞれconditionsのところの数値を変えたのですがやり方が間違っているのでしょうか?

    キャンセル

  • 2018/05/31 16:09 編集

    conditionsのところ、「Greater」になっていますがこれだと「〜より大きい(move>3)」なのでおかしくなります。
    「Equals」にしてみてください。

    キャンセル

  • 2018/05/31 17:16

    無事問題なく動きました。
    これからはIntの分岐でやっていこうと思います。

    キャンセル

同じタグがついた質問を見る

  • C#

    7687questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    4397questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity2D

    975questions