前提・実現したいこと
Unity 2D でキャラクター育成ゲームを作っています。
キャラクターが画面の中で左右に歩いたり、途中で止まって正面を向いたりするような
動きを実装したいと思ったのですが、次のコードで左右にキャラクターが動かない原因が分からず困っています。
Unity C# チュートリアルをやったばかりの初心者です。
実現したい仕様:
キャラクターが画面の中で左右に歩かせ、
特定の時間が立つと正面を向き、また時間が立つと歩くように切り替えたい
発生している問題・エラーメッセージ
エラーは特にでていません。
アニメーションは切り替わるものの、左右に動かない。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CharacterController : MonoBehaviour 6{ 7 Animator animator; 8 9 float move = 0.01f; 10 bool walkStop; 11 12 float timer; 13 public float changeTime = 8.0f; 14 15 void Start() 16 { 17 animator = GetComponent<Animator>(); 18 timer = changeTime; 19 walkStop = false; 20 Walk(); 21 } 22 23 void Update() 24 { 25 timer -= Time.deltaTime; //設定した時間を毎フレームごとに経った時間を減らしていく 26 27 //設定した時間になったら ーーーーーーーーーーーーーーーーーーーーーーーー 28 if (timer < 0) 29 { 30 timer = changeTime; // タイマーをリセット 31 Debug.Log("チェンジ!"); 32 33 if (walkStop == true) // 歩くのを止めるのであれば 34 { 35 animator.SetTrigger("FaceForwordTrigger"); //前へ向くアニメーション 36 walkStop = false; //フラグを変えて 次タイマーじかんになったら歩き始めるように 37 } 38 else //歩くのを止めないのであれば 39 { 40 Walk(); // 歩き続ける 41 walkStop = true; //次のタイマー時にはストップするようにフラグ切り替え 42 43 } 44 } 45 // ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 46 } 47 48 void Walk() 49 { 50 Vector3 pos = transform.position; 51 pos.x += move; 52 53 if (pos.x < -2.0f) 54 { 55 animator.SetTrigger("RightTrigger"); //右へ向いて歩くアニメーション 56 move = 0.01f; // 右へ少し 57 } 58 if (pos.x > 2.0f) 59 { 60 animator.SetTrigger("LeftTrigger"); //左へ向いて歩くアニメーション 61 move = -0.01f; //左へ少し 62 } 63 transform.position = pos; 64 } 65}
追記:
↓↓↓
Walk()実行を毎フレームでフラグ判定するよう修正してみました!
次は、アニメーションが切り替わる前に移動が左右への実行されてしまうようで困っています。。
c#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CharacterController : MonoBehaviour 6{ 7 Animator animator; 8 9 float move = 0.01f; 10 bool walkStop; 11 12 float timer; 13 public float changeTime = 5.0f; 14 15 void Start() 16 { 17 animator = GetComponent<Animator>(); 18 timer = changeTime; 19 walkStop = false; 20 } 21 22 void Update() 23 { 24 if (walkStop) animator.Play("FaceForword"); // 正面向いて止まる 25 else Walk(); // 左右に歩く 26 27 // 設定した時間になったら正面を向くか歩くかのフラグを切り替え ーーーーーーー 28 timer -= Time.deltaTime; 29 if (timer < 0) 30 { 31 timer = changeTime; // タイマーリセット 32 if (walkStop) walkStop = false; 33 else walkStop = true; 34 } 35 } 36 37 void Walk() 38 { 39 Vector3 pos = transform.position; 40 pos.x += move; 41 42 if (pos.x < -2.0f) 43 { 44 Debug.Log("右へ"); 45 animator.Play("Right"); 46 move = 0.01f; 47 } 48 if (pos.x > 2.0f) 49 { 50 Debug.Log("左へ"); 51 animator.Play("Left"); 52 move = -0.01f; 53 } 54 // TODO:右か左かのAnimationがPlayされる前に移動を開始してしまうのを改善したい 55 transform.position = pos; 56 } 57}
試したこと
- Debug.logで時間カウントが有効かなどを確認
- 事前にWalkのコードだけをupdateで呼ぶなら左右に動くことを確認
補足情報(FW/ツールのバージョンなど)
Unity 2019.4.0f1
回答3件
あなたの回答
tips
プレビュー