提示コードの下部のvoid Jump()関数ですが画像のアニメーションですがidleには何もアニメーションを設定していません。
jumpにはjumpするアニメーションを設定しています。質問ですがアニメーターコンポーネントをプレイヤーにアタッチして以下のスクリプトをアタッチしてゲームを実行するとプレイヤー動かないのですがこれは何が原因なのでしょうか?
色々デバッグしたのですが原因がわかりません。またAnimatorコンポーネントを無効にすると動きます。一体なぜでしょうか?
※移動はキャラクターコントローラーで行っています。
参考サイト https://gametukurikata.com/basic/questions
PlayerControl.cs
cs
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5namespace Player 6{ 7 8 /* 9 * ################################################# 10 * プレイヤーコントロール 11 * ################################################# 12 */ 13 14 public class Control : MonoBehaviour 15 { 16 17 [SerializeField] const float walkSpeed = 10; //移動速度 18 [SerializeField] const float fallSpeed = 15; //落下速度 19 [SerializeField] GameObject weapon; //武器 20 private Vector3 moveSpeed; 21 private CharacterController controller; 22 private Vector3 moveVector = new Vector3(); 23 24 25 void Start() 26 { 27 controller = GetComponent<CharacterController>(); 28 } 29 30 void Update() 31 { 32 Animation(); 33 Move(); 34 Attack(); 35 Jump(); 36 } 37 38 /*########################################## アニメーション ##########################################*/ 39 private void Animation() 40 { 41 Vector3 move = Vector3.Scale(moveSpeed, new Vector3(1, 0, 1)); 42 GetComponent<CharacterController>().Move(moveSpeed * Time.deltaTime); //移動 43 44 moveVector = move.normalized; //移動向き 45 } 46 47 48 /*########################################## 移動 ##########################################*/ 49 private void Move() 50 { 51 float inputHorizontal = Input.GetAxis("Horizontal"); 52 float inputVertical = Input.GetAxis("Vertical"); 53 54 Quaternion horizontalRotation = Quaternion.AngleAxis(Camera.main.transform.eulerAngles.y,Vector3.up); 55 Vector3 velocity = horizontalRotation * new Vector3(inputHorizontal, 0, inputVertical).normalized; 56 57 if (velocity.magnitude > 0.3f) 58 { 59 transform.rotation = Quaternion.LookRotation(velocity, transform.up); 60 moveSpeed.x = (velocity * walkSpeed).x; 61 moveSpeed.z = (velocity * walkSpeed).z; 62 63 } 64 else 65 { 66 moveSpeed.x = 0; 67 moveSpeed.z = 0; 68 } 69 70 moveSpeed.y = -20; //落下重力 71 } 72 73 74 private void Attack() 75 { 76 if(Input.GetButtonDown("Circle") == true) 77 { 78 weapon.GetComponent<Animator>().SetTrigger("Attack"); 79 } 80 } 81 82 83 private void Jump() 84 { 85 if (Input.GetButtonDown("Cross") == true) 86 { 87 GetComponent<Animator>().SetTrigger("Jump"); 88 } 89 } 90 91 92 93 } 94}
自分で書いたコードではないんですよね。
出典を明示してください。
いえ、自分で書いたコードです。
ではなぜ自分が書いたコードに対して赤の他人に説明求めるんですか?
どういう意味でしょうか?原因がわからないので質問しているのですが
「そう動くように書かれているから」が他人に言えることです。
もしかして、自身で書いたコードを何も説明できないということですか?
言い換えれば「自分で書いて、理解しているならデバッグも多少はできるはず」という意味です。まさかここまでのコードを自分で書ける人が、デバッグを全くできないわけがないですから。
ただ、質問内容からするとデバッグを全く進めていないようなので、「自分で理解して書いていない」とこちらは理解しました。
とりあえず「void Update()」を「void LateUpdate()」にするとどうなりますか?
(これで直った場合は後で詳細書きます)
>色々デバッグしたのですが
「色々」で伝わる情報量はゼロなので、具体的に。
「原因」は単純に「Unity のアニメーション機能によりキャラクターそのものの座標を制御(固定)してしまっているから、スクリプトから何をしようと動かない」なんでしょうけどね。Unity としては FAQ と言える問題だと思います。
LateUpdateにしたら治りましたが、LateUpdateとは` Update 関数が呼び出された後に実行されます`という説明がありますがアニメーションによって座標が変更された後に呼び出されるから動くのでしょうか?
回答1件
あなたの回答
tips
プレビュー