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

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

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

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

Unity

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

Q&A

解決済

1回答

4595閲覧

UnityアニメーターのIntパラメータが更新されない

krnimoon

総合スコア13

C#

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

Unity

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

0グッド

0クリップ

投稿2019/02/01 08:31

前提・実現したいこと

Int型"State"が1と等しければ歩行アニメ、0と等しければ直立アニメを再生するようにしたい。
代わりにfloat型や他のパラメータも検討しましたが。
管理のしやすさから"~と等しい"という条件が使えるint型をできれば採用したいのです。
どなたかご指導よろしくお願いします。

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

アニメータのInt型パラメータ"State"が0から1には切り替わるが、その後0に戻らないため常に歩行アニメをしてしまいます。
他のパラメーターではそのようなことはありませんでした。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4public class PlayerMove : MonoBehaviour 5{ 6 sbyte inpXY,inpY; 7 int staCont; 8 float plyX,plyY; 9 float spdX = 0.40f; 10 float spdY = 0.30f; 11 float spdXa = 0.34f; 12 float spdYa = 0.25f; 13 float spdPw = 0.05f; 14 Animator animator; 15 16 void start() 17 { 18 } 19 20 void Update() 21 { 22 InputKey(); 23 CharacterStateList(); 24 } 25 void FixedUpdate() 26 { 27 MoveCharacter(); 28 CharacterAnime(); 29 } 30 31 32 /*##################################// 33 // Function List // 34 ####################################*/ 35 36 void CharacterAnime() 37 { 38 animator = GetComponent<Animator>(); 39 //Character Revers 40 if (Input.GetKey(KeyCode.RightArrow)) {transform.localScale = new Vector3( 1,1,1);} 41 else if (Input.GetKey(KeyCode.LeftArrow)) {transform.localScale = new Vector3(-1,1,1);} 42 //CaracterAnimaset 43 if(inpXY > 0) {animator.SetInteger("State",staCont);} 44 } 45 46 void CharacterStateList() 47 { 48 if(inpXY == 0) 49 { 50 animator.SetBool("Stand",true); 51 animator.SetBool("Walk",false); 52 staCont = 0; //stand 53 animator.SetFloat("Flo",0.0f); 54 animator.SetTrigger("Trg2"); 55 } 56 else 57 { 58 animator.SetBool("Walk",true); 59 animator.SetBool("Stand",false); 60 staCont = 1; //walk 61 animator.SetFloat("Flo",99.9f); 62 animator.SetTrigger("Trg"); 63 } 64 } 65 66 void InputKey() 67 { 68 //InputKey 69 if (Input.GetKey(KeyCode.LeftArrow)) {inpXY = 1;} 70 else if (Input.GetKey(KeyCode.RightArrow)) {inpXY = 2;} 71 else {inpXY = 0;} 72 if (Input.GetKey(KeyCode.UpArrow)) {inpY = 4;} 73 else if (Input.GetKey(KeyCode.DownArrow)) {inpY = 8;} 74 else {inpY = 0;} 75 inpXY += inpY; 76 } 77 78 void MoveCharacter() 79 { 80 plyX = this.transform.position.x; 81 plyY = this.transform.position.y; 82 83 switch(inpXY) 84 { 85 case 0://Neutral 86 break; 87 case 1://Left 88 plyX -= (spdX * spdPw); 89 break; 90 case 2://Right 91 plyX += (spdX * spdPw); 92 break; 93 case 4://Up 94 plyY += (spdY * spdPw); 95 break; 96 case 5://LeftUp 97 plyX -= (spdXa * spdPw); 98 plyY += (spdYa * spdPw); 99 break; 100 case 6://RightUp 101 plyX += (spdXa * spdPw); 102 plyY += (spdYa * spdPw); 103 break; 104 case 8://Dawn 105 plyY -= (spdY * spdPw); 106 break; 107 case 9://LeftDown 108 plyX -= (spdYa * spdPw); 109 plyY -= (spdXa * spdPw); 110 break; 111 case 10://RightDown 112 plyX += (spdXa * spdPw); 113 plyY -= (spdYa * spdPw); 114 break; 115 default: 116 break; 117 } 118 this.transform.position = new Vector3(plyX,plyY,0.0f); 119 120 } 121} 122

試したこと

ケース1:デバックプレイを開始して、スクリプト上の"staCont"とアニメータパラメータの"State"を比較しました。
結果1:スクリプト上は問題なく変数の変化を確認できており、パラメータ"State"は変化しませんでした。

ケース2:bool型"Walk"と"Stand"を設定して、歩くときはWalk=true/Stand=false、止まるときはWalk=false/Stand=trueと記述した。アニメーターの変遷条件をそれぞれのtrueのときアニメが変わるようにした。
結果2:想定道理の動作をしてくれた、アニメーションの切り替えもスムーズだった。

ケース3:float型"Flo"を設定して、歩くときは99.9f、止まるときは0.0fを記述した、アニメーターの変遷条件を50より下なら止まる/50より上なら歩くと設定した。
結果3:想定道理の動作をしてくれた、アニメーション切り替えも問題ない。

ケース4:Trigger型"Trg"と"Trg2"を設定して、歩くとき"Trg"を呼び出し、止まるときは"Trg2"を呼び出すようにした。アニメーションの変遷条件は、それぞれが有効になっているときに変遷するようにした。
結果4:動作はするが入力からの遅延があるように感じる、即座にトリガーが無効にならないのでアニメーション動作に違和感がある。

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

Unity 2018.3.0f2 Personal

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

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

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

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

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

guest

回答1

0

ベストアンサー

CharacterAnime()で
if(inpXY > 0) {animator.SetInteger("State",staCont);}
としてるんで、inpXYが0の時はanimator.SetIntegerが呼ばれず、
結果的にStateの値が1から0に変わらないことになりますね。

Updateの時とFixedUpdateの時でinpXYの値に差がある想定かもしれませんが、
他パラメータと同じようにCharacterStateList()でSetIntegerするなり、
if(inpXY > 0)の条件文を取るか調節すればとりあえずは動くんじゃないかと思います。

投稿2019/02/01 09:19

sakura_hana

総合スコア11427

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

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

krnimoon

2019/02/01 09:52

なるほど、指摘されれば実に単純なミスでしたね。 指摘された通りまずはif文を外して動作させようと思います。 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問