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

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

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

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

Unity

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

Q&A

解決済

2回答

2262閲覧

Unity アニメーション 上手く移行しない

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2018/08/13 16:22

イメージ説明

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerControlScript : MonoBehaviour { 6 7 MapGenerator mapGenerator; 8 GameObject cat; 9 Vector3 catpos; 10 private Vector3 nowpos; 11 private Animator animator; 12 13 // Use this for initialization 14 void Start() 15 { 16 cat = GameObject.Find("MapGen"); 17 mapGenerator = cat.GetComponent<MapGenerator>(); 18 animator = GetComponent<Animator>(); 19 } 20 21 // Update is called once per frame 22 void Update() 23 { 24 catpos = transform.position; 25 26 // 移動処理 27 Move(); 28 } 29 30 // 移動関数 31 void Move() 32 { 33 // 左キーを押し続けていたら 34 if (Input.GetKey("left")) 35 { 36 foreach (Vector3 pos in mapGenerator.listpos) 37 { 38 Vector3 left = new Vector3(catpos.x - 1, catpos.y, 0); 39 if (left == pos) 40 { 41 animator.SetTrigger("Left"); 42 Vector3 scale = transform.localScale; 43 scale.x = 1; 44 transform.localScale = scale; 45 nowpos = new Vector3(catpos.x - 1f, catpos.y + 0.5f, 0); 46 iTween.MoveTo(gameObject, nowpos, 0.2f); 47 } 48 } 49 } 50 51 if (Input.GetKey("right")) 52 { // 右キーを押し続けていたら 53 foreach (Vector3 pos in mapGenerator.listpos) 54 { 55 Vector3 right = new Vector3(catpos.x + 1, catpos.y - 1, 0); 56 if(right == pos) 57 { 58 animator.SetTrigger("Down"); 59 Vector3 scale = transform.localScale; 60 scale.x = -1; 61 transform.localScale = scale; 62 nowpos = new Vector3(catpos.x + 1f, catpos.y - 0.5f, 0); 63 iTween.MoveTo(gameObject, nowpos, 0.2f); 64 } 65 } 66 } 67 if (Input.GetKey("up")) 68 { // 上キーを押し続けていたら 69 foreach (Vector3 pos in mapGenerator.listpos) 70 { 71 Vector3 up = new Vector3(catpos.x + 1, catpos.y, 0); 72 if(up == pos) 73 { 74 animator.SetTrigger("Left"); 75 Vector3 scale = transform.localScale; 76 scale.x = -1; 77 transform.localScale = scale; 78 nowpos = new Vector3(catpos.x + 1f, catpos.y + 0.5f, 0); 79 iTween.MoveTo(gameObject, nowpos, 0.2f); 80 } 81 } 82 } 83 84 if (Input.GetKey("down")) 85 { // 下キーを押し続けていたら 86 foreach (Vector3 pos in mapGenerator.listpos) 87 { 88 Vector3 down = new Vector3(catpos.x - 1, catpos.y - 1, 0); 89 if(down == pos) 90 { 91 animator.SetTrigger("Down"); 92 Vector3 scale = transform.localScale; 93 scale.x = 1; 94 transform.localScale = scale; 95 nowpos = new Vector3(catpos.x - 1f, catpos.y - 0.5f, 0); 96 iTween.MoveTo(gameObject, nowpos, 0.2f); 97 } 98 } 99 } 100 101 } 102} 103

行動を終えたとき、DownIdleまたはLeftIdleに移行するようにしたいのですが、上手くいきません。

C#

1if (Input.GetKey("left")) 2 { 3 foreach (Vector3 pos in mapGenerator.listpos) 4 { 5 Vector3 left = new Vector3(catpos.x - 1, catpos.y, 0); 6 if (left == pos) 7 { 8 animator.SetTrigger("Left"); 9 Vector3 scale = transform.localScale; 10 scale.x = 1; 11 transform.localScale = scale; 12 nowpos = new Vector3(catpos.x - 1f, catpos.y + 0.5f, 0); 13 iTween.MoveTo(gameObject, nowpos, 0.2f); 14 } 15 } 16 } 17 else 18 { 19 animator.SetTrigger("LeftIdle"); 20 } 21 if (Input.GetKey("right")) 22 { // 右キーを押し続けていたら 23 foreach (Vector3 pos in mapGenerator.listpos) 24 { 25 Vector3 right = new Vector3(catpos.x + 1, catpos.y - 1, 0); 26 if(right == pos) 27 { 28 animator.SetTrigger("Down"); 29 Vector3 scale = transform.localScale; 30 scale.x = -1; 31 transform.localScale = scale; 32 nowpos = new Vector3(catpos.x + 1f, catpos.y - 0.5f, 0); 33 iTween.MoveTo(gameObject, nowpos, 0.2f); 34 } 35 } 36 } 37 else 38 { 39 animator.SetTrigger("DownIdle"); 40 }

というようにしていくと、LeftIdleとDownIdleが同時に起こるので、それ以外のアニメーションに移行しなくなります。

Input.GetKeyUpしたときのみ、LeftIdleもしくはDownIdleにしようとしましたが、立ち止まったり歩いたりという変な挙動になってしまいます。エラーなどではなく、GetKeyUpが思うように反応していないようです。

歩き終わったあとは、DownIdleまたはLeftIdleに切り替わり、方向キーを押せば、歩き出すようにしたいのですが、方法が思いつきません。やり方を教えてもらえるとありがたいです。

回答よろしくお願いします。

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

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

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

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

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

guest

回答2

0

Input.GetKeyUpは、なぜか上手くいかなかったので、スクリプトを書き換えました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerControlScript : MonoBehaviour 6{ 7 8 MapGenerator mapGenerator; 9 GameObject cat; 10 Vector3 catpos; 11 private Vector3 nowpos; 12 private Animator animator; 13 bool OK, OK2, OK3, OK4 = false; 14 public LayerMask TileLayer; 15 16 // Use this for initialization 17 void Start() 18 { 19 cat = GameObject.Find("MapGen"); 20 mapGenerator = cat.GetComponent<MapGenerator>(); 21 animator = GetComponent<Animator>(); 22 } 23 24 // Update is called once per frame 25 void Update() 26 { 27 catpos = transform.position; 28 29 // 移動処理 30 Move(); 31 } 32 33 // 移動関数 34 void Move() 35 { 36 if (Input.GetKey("left")) 37 { 38 39 foreach (Vector3 pos in mapGenerator.listpos) 40 { 41 Vector3 left = new Vector3(catpos.x - 1, catpos.y, 0); 42 if (left == pos) 43 { 44 animator.SetTrigger("Left"); 45 Vector3 scale = transform.localScale; 46 scale.x = 1; 47 transform.localScale = scale; 48 nowpos = new Vector3(catpos.x - 1f, catpos.y + 0.5f, 0); 49 iTween.MoveTo(gameObject, nowpos, 0.3f); 50 } 51 } 52 53 OK = true; 54 OK2 = false; 55 OK3 = false; 56 OK4 = false; 57 }else if(OK == true && OK2 == false && OK3 == false && OK4 == false) 58 { 59 animator.SetTrigger("LeftIdle"); 60 Vector3 scale = transform.localScale; 61 scale.x = 1; 62 transform.localScale = scale; 63 } 64 65 if (Input.GetKey("right")) 66 { // 右キーを押し続けていたら 67 foreach (Vector3 pos in mapGenerator.listpos) 68 { 69 Vector3 right = new Vector3(catpos.x + 1, catpos.y - 1, 0); 70 if(right == pos) 71 { 72 animator.SetTrigger("Down"); 73 Vector3 scale = transform.localScale; 74 scale.x = -1; 75 transform.localScale = scale; 76 nowpos = new Vector3(catpos.x + 1f, catpos.y - 0.5f, 0); 77 iTween.MoveTo(gameObject, nowpos, 0.3f); 78 } 79 } 80 OK = false; 81 OK2 = true; 82 OK3 = false; 83 OK4 = false; 84 } 85 else if (OK == false && OK2 == true && OK3 == false && OK4 == false) 86 { 87 animator.SetTrigger("DownIdle"); 88 Vector3 scale = transform.localScale; 89 scale.x = -1; 90 transform.localScale = scale; 91 } 92 93 if (Input.GetKey("up")) 94 { // 上キーを押し続けていたら 95 foreach (Vector3 pos in mapGenerator.listpos) 96 { 97 Vector3 up = new Vector3(catpos.x + 1, catpos.y, 0); 98 if(up == pos) 99 { 100 animator.SetTrigger("Left"); 101 Vector3 scale = transform.localScale; 102 scale.x = -1; 103 transform.localScale = scale; 104 nowpos = new Vector3(catpos.x + 1f, catpos.y + 0.5f, 0); 105 iTween.MoveTo(gameObject, nowpos, 0.3f); 106 } 107 } 108 OK = false; 109 OK2 = false; 110 OK3 = true; 111 OK4 = false; 112 } 113 else if (OK == false && OK2 == false && OK3 == true && OK4 == false) 114 { 115 animator.SetTrigger("LeftIdle"); 116 Vector3 scale = transform.localScale; 117 scale.x = -1; 118 transform.localScale = scale; 119 } 120 121 if (Input.GetKey("down")) 122 { // 下キーを押し続けていたら 123 foreach (Vector3 pos in mapGenerator.listpos) 124 { 125 Vector3 down = new Vector3(catpos.x - 1, catpos.y - 1, 0); 126 if (down == pos) 127 { 128 animator.SetTrigger("Down"); 129 Vector3 scale = transform.localScale; 130 scale.x = 1; 131 transform.localScale = scale; 132 nowpos = new Vector3(catpos.x - 1f, catpos.y - 0.5f, 0); 133 iTween.MoveTo(gameObject, nowpos, 0.3f); 134 } 135 } 136 OK = false; 137 OK2 = false; 138 OK3 = false; 139 OK4 = true; 140 } 141 else if (OK == false && OK2 == false && OK3 == false && OK4 == true) 142 { 143 animator.SetTrigger("DownIdle"); 144 Vector3 scale = transform.localScale; 145 scale.x = 1; 146 transform.localScale = scale; 147 } 148 } 149 150} 151

投稿2018/08/14 05:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

このコードだと、
「"left"が押されていない時、"right"の押され具合に関わらず"LeftIdle"オン」
「"right"が押されていない時、"left"の押され具合に関わらず"DownIdle"オン」
になります。(つまり"Left"と"DownIdle"が同時にオンになる可能性がある)
なのでタイミングによっては意図しない遷移が起こるのかと。

条件分岐を正しく設定すれば動くと思いますが、
Input.GetKeyのelseを使うと押されていない間ずっと発動し続けてしまうので、Input.GetKeyUpを使用します。

C#

1//コード例(移動用コードは省略しています) 2 3if (Input.GetKey("left")) { 4 animator.SetTrigger("Left"); 5} else if (Input.GetKey("right")) { 6 animator.SetTrigger("Down"); 7//↓ボタンが離れた時の処理もelseで連結することで正しい条件分岐をさせる 8} else if (Input.GetKeyUp("left")) { 9 animator.SetTrigger("LeftIdle"); 10} else if (Input.GetKeyUp("right")) { 11 animator.SetTrigger("DownIdle"); 12}

厳密には未検証ですがこれで概ね上手くいくのではないかと。

投稿2018/08/14 02:53

sakura_hana

総合スコア11425

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

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

退会済みユーザー

退会済みユーザー

2018/08/14 05:22

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問