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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1034閲覧

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

sena14

総合スコア109

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/05/29 10:40

編集2018/05/31 06:14

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

修正画像

修正コード

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); } }

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakura_hana

2018/05/30 04:44

AnimatorController(モーションの遷移条件)の問題のように思います。スクリーンショットを貼るかTransition条件を記載してください。
sena14

2018/05/30 04:50

AnimatorControllerとはこの画像で大丈夫ですか?
sakura_hana

2018/05/30 04:57

Right→Front間の矢印と、Front→Right間の矢印の詳細(条件設定)も載せて頂けますか?
sena14

2018/05/30 05:02 編集

条件設定とは?これで大丈夫でしょうか?
sakura_hana

2018/05/30 05:09

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

2018/05/30 05:27

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

2018/05/30 07:08

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

回答1

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 04:40

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sena14

2018/05/31 06:18

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

2018/05/31 07:10 編集

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

2018/05/31 08:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問