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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

1331閲覧

アニメーションが上手く遷移しない

.com

総合スコア8

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/05/04 11:25

前提・実現したいこと

UnityのアニメーションでIdle(何もしていない状態)、Run(走っている状態)、Jump(ジャンプ)、Push(押せる障害物に当たっている時)、Clear(クリアした時)の5つのアニメーションを付けています。
そこで、左スティックを倒しIdleからRunに行く時、Runに行ったら直ぐIdleになり、また直ぐにRunになり。という風にIdleとRunの間を行ったり来たりしてしまいます。

また、RunとIdleを行き来している状態から左スティックから離すとIdleに遷移してIdleのアニメーションを続けてくれるのですが、そこから左スティックを倒すとRunに遷移してくれません。(ジャンプすると何故かRunに遷移できます)

以上の2点をスティックを倒した時は常にRun、離したら常にIdle、Idleから倒したらちゃんとRunに遷移という正常なアニメーションを作りたいです。

発生している問題・エラーメッセージ

Idle、Run、Jump間でのアニメーション遷移が上手くできていない。
詳しくは上述。

該当のソースコード

アニメーションの遷移を作る上で参考にしたサイト。
・アニメーション遷移はこれから作りました。
https://xr-hub.com/archives/8808

・下の"試したこと"に書いてあるコードはここから学びました。
https://gametukurikata.com/animationanimator/behaviour

・↓はプレイヤーのアニメーションのコードです。
コピペしたらかなり長かったのでアニメーション以外(今回の質問の問題とは関係なさそうな所)は消して上げています。そのため、使っていない変数とか関数が消し忘れていたりします。ご理解お願いします。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5// 必要なコンポーネントの列記 6[RequireComponent(typeof(AudioSource))] 7public class PlayerController : MonoBehaviour 8{ 9 // Rigidbodyを変数に入れる 10 private Rigidbody rb; 11 // 移動スピード 12 private float f_Speed = 15.0f; 13 // ジャンプ力 14 public float f_JumpForce = 400.0f; 15 // Animatorを入れる変数 16 private Animator animator; 17 // 地面に接触しているか否か 18 bool b_Ground = true; 19 int n_Key = 0; 20 21 string state; 22 string prevState; 23 24 bool isStopTime = false; //時間停止 25 int n_JumpDirection = 0; //ジャンプした時の進行方向 bool値の様なもの 26 27 float hori; //Input.GetAxis("Horizontal") 28 29 float StopTime = 0.0f; // コルーチンで止まっている時間 30 31 private void Awake() 32 { 33 audioSource = GetComponent<AudioSource>(); // AudioSourceコンポーネントの設定 34 } 35 36 void Start() 37 { 38 // Rigidbodyを取得 39 rb = GetComponent<Rigidbody>(); 40 // プレイヤーのAnimatorにアクセスする 41 animator = GetComponent<Animator>(); 42 // プレイヤーの現在より少し前の位置を保存 43 v_PlayerPos = transform.position; 44 } 45 46 void Update() 47 { 48 PlayerControl(); // プレイヤーの制御 49 50 if (isStopTime) 51 { 52 StartCoroutine("StageRotTimeStop"); //コルーチン 53 } 54 else 55 { 56 rb.isKinematic = false; //重力を付ける 57 animator.speed = 1; //アニメーションの再開 58 59 ChangeAnimation(); 60 GetInputKey(); 61 ScaffoldFlag(); 62 ChangeState(); 63 Move(); 64 } 65 if (Input.GetKeyDown("joystick button 1")) 66 { 67 isStopTime = true; 68 } 69 } 70 IEnumerator StageRotTimeStop() //ステージを回転させているときのプレイヤーの時間を止める 71 { 72 rb.isKinematic = true; //重力を止める 73 animator.speed = 0; //アニメーションの一時停止 74 75 yield return new WaitForSeconds(0.45f); 76 77 GetInputKey(); 78 ChangeState(); 79 ChangeAnimation(); 80 ScaffoldFlag(); 81 Move(); 82 83 isStopTime = false; 84 } 85 void GetInputKey() 86 { 87 hori = Input.GetAxis("Horizontal"); 88 89 if (hori < 0) //左 90 { 91 n_Key = -1; 92 state = "RUN"; 93 94 //directionのX軸とZ軸の方向を向かせる 95 transform.rotation = Quaternion.LookRotation(new Vector3(-90, 0, 0)); 96 } 97 if (hori > 0) //右 98 { 99 n_Key = 1; 100 state = "RUN"; 101 102 //directionのX軸とZ軸の方向を向かせる 103 transform.rotation = Quaternion.LookRotation(new Vector3(90, 0, 0)); 104 } 105 else 106 { 107 state = "IDLE"; 108 } 109 } 110 111 // プレイヤーの状態を変える 112 void ChangeState() 113 { 114 if (b_Ground) 115 { 116 if (n_Key != 0) 117 { 118 state = "RUN"; 119 } 120 else 121 { 122 state = "IDLE"; 123 } 124 } 125 else 126 { 127 state = "JUMP"; 128 } 129 } 130 131 // プレイヤーのアニメーションを変える 132 void ChangeAnimation() 133 { 134 if (prevState != state) 135 { 136 switch (state) 137 { 138 case "JUMP": 139 animator.SetTrigger("Jump"); 140 break; 141 case "RUN": 142 animator.SetFloat("Run", 1.0f); 143 break; 144 case "PUSH": 145 animator.SetTrigger("Push"); 146 break; 147 case "CLEAR": 148 animator.SetFloat("Clear", 1.0f); 149 animator.SetFloat("Run", 0.0f); 150 break; 151 default: 152 animator.SetFloat("Run", 0.0f); 153 break; 154 } 155 prevState = state; 156 } 157 } 158 159 // 動き 160 void Move() 161 { 162 if (b_Ground) 163 { 164 if (Input.GetKeyDown("joystick button 0")) 165 { 166 //jumpForceの分だけ上方に力がかかる 167 rb.AddForce(transform.up * f_JumpForce); 168 state = "JUMP"; 169 b_Ground = false; 170 171 if (n_Key < 0) 172 { 173 n_JumpDirection = -1; 174 } 175 if (n_Key > 0) 176 { 177 n_JumpDirection = 1; 178 } 179 180 if ((int)hori == 0) //垂直跳び時 181 { 182 n_JumpDirection = 0; 183 } 184 } 185 } 186 187 if (b_Ground == true) 188 { 189 // 現在の位置+入力した数値の場所に移動する 190 rb.MovePosition(transform.position + new Vector3(Input.GetAxisRaw("Horizontal") * Time.deltaTime * f_Speed, 0, 0)); 191 } 192 else //ジャンプ中 193 {文字数オーバーにより割愛 194 } 195 196 //プレイヤーの位置を更新する 197 v_PlayerPos = transform.position; 198 } 199 200 void ScaffoldFlag() 201 { 202 if (Input.GetKeyDown("joystick button 1")) 203 { 204 n_ScaffoldCount++; 205 206 if (n_ScaffoldCount == 1) //裏の時 207 { 208 isUpScaffold = false; 209 isDownScaffold = true; 210 } 211 212 if (n_ScaffoldCount == 2) //表の時 213 { 214 n_ScaffoldCount = 0; 215 isUpScaffold = true; 216 isDownScaffold = false; 217 } 218 } 219 } 220 221 void OnCollisionEnter(Collision col) 222 { 223 if (col.gameObject.tag == "Wall") 224 { 225 //hori = 0.0f; 226 227 if (n_JumpDirection == -1) 228 { 229 n_JumpDirection = -2; 230 } 231 if (n_JumpDirection == 1) 232 { 233 n_JumpDirection = 2; 234 } 235 } 236 237 if (col.gameObject.tag == "Carry") 238 { 239 state = "PUSH"; 240 animator.SetFloat("Run", 0.0f); 241 242 } 243 244 if (col.gameObject.tag == "Goal") 245 { 246 state = "CLEAR"; 247 animator.SetFloat("Run", 0.0f); 248 } 249 } 250}

試したこと

・↓を使ってRunのアニメーションが終わったら0になるようにした。これを付けていない時はRunが終わったらIdle、Runが終わったらIdleという繰り返しが常に行われます。なのでRunの他にもClearやPushにも付けていますが、これが原因で変なアニメーションをしているのかもしれません。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerRun : StateMachineBehaviour 6{ 7 // OnStateExit is called when a transition ends and the state machine finishes evaluating this state 8 override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) 9 { 10 float hori = Input.GetAxis("Horizontal"); 11 if (hori == 0) 12 { 13 animator.SetFloat("Run", 0.0f); 14 } 15 } 16} 17

・それぞれの変数(Parameter)を全て(Idleも)Floatにしてみたり、全てTriggerにしてみたりする。
→アニメーションが不自然なことに変わりありませんでした。

補足情報(FW/ツールのバージョンなど)

・今回の質問に該当するAnimatorの写真
IdleからRun
RunからIdle
RunからJump
JumpからRun
JumpからIdle
IdleからJump

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

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

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

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

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

guest

回答1

0

自己解決

Float型にして、スクリプトをちゃんを書き直したら大体ちゃんと動いてくれるようになりました。
たまに挙動が可笑しい時もあります。(ジャンプしていないのにジャンプのアニメーションが入ったり)ですが、基本的にはちゃんとした意図したものと同じ挙動をしてくれるようになりました。

投稿2021/05/25 14:02

.com

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問