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

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

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

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

Unity

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

Q&A

解決済

3回答

2125閲覧

UnityC#でキャラクターが歩いている途中でアニメーションをうまく切り替えるにはどうしたら良いでしょうか?

tot_

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2020/06/25 07:49

編集2020/06/30 02:28

前提・実現したいこと

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

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

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

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

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

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

sakura_hana

2020/06/25 08:52

Walk()を呼ぶタイミングがタイマーが0になったフレームしかありません。 暫く呼び続ける必要があるかと思いますので、if文を適宜修正してみてください。
tot_

2020/06/25 08:56

た、確かに!見落としてました m(_ _。)m ありがとうございます!!!
guest

回答3

0

自己解決

原因が分かって、コードを修正したらいけました!
単純に条件分岐の考慮が足らずでしたm(_ _。)m

原因:
左右に向かって歩いている途中で正面に向かって止まると
どっちの方向に向かっていたかがわからなくなって position だけ実行されてしまっていた分岐になっていたことが原因でした。

対応:
左右に切り替えるタイミングをフラグで保持したままにして
途中で止められても向いていた方向がわかるように修正

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 = false; 11 bool right = true; 12 float timer; 13 public float stopTime = 3.0f; 14 15 void Start() 16 { 17 animator = GetComponent<Animator>(); 18 timer = stopTime; 19 } 20 21 void Update() 22 { 23 if (walkStop) animator.Play("FaceForword"); // 正面向いて止まる 24 else Walk(); // 左右に歩く 25 26 // 時間が経ったら止まるか歩くかのフラグを切り替え ーーーー 27 timer -= Time.deltaTime; 28 if (timer < 0) 29 { 30 timer = stopTime; // タイマーリセット 31 if (walkStop) walkStop = false; 32 else walkStop = true; 33 } 34 } 35 36 void Walk() 37 { 38 Vector3 pos = transform.position; 39 pos.x += move; 40 41 // 左右の端に来たら向きのフラグを切り替え ーーーーーー 42 if (pos.x < -2.0f) 43 { 44 right = true; 45 move = 0.01f; 46 } 47 if (pos.x > 2.0f) 48 { 49 right = false; 50 move = -0.01f; 51 } 52 53 if (right) animator.Play("Right"); 54 else animator.Play("Left"); 55 56 transform.position = pos; 57 } 58}

投稿2020/06/30 02:33

tot_

総合スコア2

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

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

0

BlendTreeの使用を検討してみてはいかがでしょうか。

これを使えば、animator.SetFloat()などを使って指定した値をもとに複数のアニメーションを任意のタイミングで切り替えることができます。

止まっている状態については、Animation Layerを使ってあげると管理が楽になるかもしれません。

また、アニメーション等で扱う数値はMathf.SmoothDamp()などを使うと楽に滑らかに数値変更ができると思います。

投稿2020/06/29 13:51

Kayun1102

総合スコア9

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

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

tot_

2020/06/30 00:49

ありがとうございます!実は、BlendTreeを公式のチュートリアル(https://learn.unity.com/project/ruby-s-2d-rpg)をみながらはじめに試してうまくいかず結構長時間はまっていたので、コード側でなんとかする路線にきってみたところでした。。もう一度、似たチュートリアルを探して 慣れてから試してみようかなと思います。
guest

0

Animator Controller に Parameter と Transition を設定しているみたいですね。
2D のスプライトアニメーションをそういう感じで再生したいなら、SetTrigger 関数ではなく Animator.Play("ステートの名前") 関数を使って、再生したいステートを直接再生した方が楽だと思いますよ。

https://gomafrontier.com/unity/44#AnimatorPlay

投稿2020/06/25 10:57

bboydaisuke

総合スコア5270

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

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

tot_

2020/06/25 11:08

おおおお!こんな簡単に呼べたのですね。ありがとうございます!!✨
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問