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

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

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

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

Q&A

解決済

2回答

2047閲覧

ジャンプアニメーションの遷移に関わる問題

ITATI

総合スコア14

Unity

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

0グッド

0クリップ

投稿2018/12/29 01:48

編集2019/02/23 11:51

マリオのような高さ(滞空時間)が変わるジャンプにアニメーションを対応させるため、
上昇、滞空状態、下降の3種類のループするアニメーションを切り替えて表現したいと考えています。
現在座標から1フレーム前の座標をVector2 thrustとして取得し、Y座標を取得、この数値によって切り替える仕組みです。

①thrust = CharacterPosition - beforeCharacterPosition;の計算が始まるまでに5-6フレームかかるようで、アニメーションの切り替わりにも影響する様です。
またVector2 thrustで取得した値が壁や床に衝突すると、想定から外れた数値が表示されます。
例-0.20665759>5.114079e-05

②animator.SetTrigger("Jump");だったものをanimator.SetFloat("JumpHight", thrust.y);に変えた所、まともにアニメーションが切り替わらなくなりました。おかしな切り替わり方をします。

何か解決策、あるいは適した手法があればご教示お願い致します。

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

'Player' AnimationEvent has no function name specified! Parameter 'Jump1' does not exist. UnityEngine.Animator:SetTrigger(String) PlayerController:ActionJump() (at Assets/GameData/Script/PlayerController.cs:170)

該当のソースコード

c#

1BaseCharacterController.cs 2public class BaseCharacterController : MonoBehaviour 3{ 4 public Vector2 CharacterPosition; 5 public Vector2 beforeCharacterPosition; 6 public Vector2 thrust; 7} 8 9PlayerController.cs 10public class PlayerController : BaseCharacterController 11{ 12  protected override void FixedUpdateCharacter() 13  { 14   //推力の取得 15   CharacterPosition = transform.position; 16   thrust = CharacterPosition - beforeCharacterPosition; 17//-省略- 18  //キャラクターの現在座標の記録 19  beforeCharacterPosition= CharacterPosition; 20  } 21 22  public void ActionJump() 23 { 24 ladder_active = false; 25 stair_active = false; 26 movement_active = false; 27 28 switch (jumpCount) 29 { 30 case 0: 31 if (grounded)// 地面に接触した状態でのジャンプ 32 { 33 //animator.SetTrigger("Jump"); 34 //thrust.y・・・0.1:上昇 0.01-0.01:滞空 -0.1:下降 35 animator.SetFloat("JumpHight", thrust.y); 36 RB.velocity = Vector2.up * Jumphight; 37 jumpStartTime = Time.fixedTime; 38 jumped = true; 39 jumpCount++; 40 } 41 } 42//-省略- 43 } 44}

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

Unity2018.3.0f.2

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

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

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

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

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

guest

回答2

0

ベストアンサー


FixedUpdateCharacterはどこから呼ばれているのでしょうか?
こんな標準メソッドは存在しないと思うので自力実装しているのだと思いますが、そうなると「計算が始まるまで5-6フレームかかる」のもその辺が原因になると思います。

なおRigidbodyによる移動は瞬間的な埋まりや反発が発生します。
つまり壁や床にぶつかる際、その表面にピタッと止まる訳ではなく、
重力や慣性により若干埋まる→埋まりを修正する為に若干反発する→重力や慣性により更に物体方向に進む→物体表面に停止する
という動きが物理フレーム単位で行われています。
なのでマイナスの値や極小の値が発生するのはUnityの仕様通りの動きとなります。
(それが嫌なら衝突した瞬間に座標を強制固定する等が必要かと思います)


前述の通りthrustが信用おけない以上、animator.SetFloat("JumpHight", thrust.y);も信用出来ないと考えるべきでしょう。

それを差し置いても、今分かる範囲でanimator.SetFloat("JumpHight", thrust.y);が呼ばれているのは「jumpCountが0かつgroundedがtrueの時」です。
それ以外のタイミング(特にjumpCountが0ではない時)でanimator.SetFloat("JumpHight", thrust.y);が呼ばれていないなら、JumpHightの値の更新もされないので当然想定外の動きになるかと思います。

投稿2018/12/29 04:42

sakura_hana

総合スコア11427

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

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

ITATI

2018/12/29 13:32

アドバイスありがとうございます。 ①>FixedUpdateCharacterはどこから呼ばれているのでしょうか? 書籍「Unityではじめる2Dゲーム作り徹底ガイド」を参考にしており、 FixedUpdateの文字列が入っているので、同じ機能があると思っていました。 BaseCharacterController.csの中にそれらしい記述を見つけ、修正を行いました。 ``` protected virtual void FixedUpdate() { // 推力チェック・・・移動 CharacterPosition = transform.position; thrust = CharacterPosition - beforeCharacterPosition; // キャラクタ個別の処理 FixedUpdateCharacter(); -略-    //キャラクターの現在座標の記録・・・移動 beforeCharacterPosition = CharacterPosition; } ``` FixedUpdate() の中にFixedUpdateCharacter();があるので継承元のBaseCharacterController.csに修正しました。 ②確かにこの記述ではジャンプ開始時点のみですね・・・。  条件の指定を他の個所で行う必要があるようです。探してみます。 ご協力ありがとうございました。
sakura_hana

2018/12/30 04:28

参考までに。 ① FixedUpdate内から呼ばれているなら、設定や環境によっては5−6フレーム掛かるかもしれません。 (デフォ値だとFixedUpdateは0.02秒毎に呼ばれる=50fps相当です。実際のフレームレートがこれより上ならば物理演算の方が周期が遅いことになります。エディタ上だと100fpsとか出てしまうのでそれが影響しているのかもしれません) Fixed Timestep値(以下参照)とフレームレートを確認してみてください。 https://docs.unity3d.com/ja/2018.1/Manual/class-TimeManager.html ②雑な方法で言えば「条件分岐せず、常にJumpHightの値を更新し続ける(ジャンプ入力があったかどうかは別途SetTrigger等で判定する)」というのもあります。 この場合だとジャンプの他に、高い場所から落ちた時のモーションと兼用出来たりします。 ただこれはこれでAnimatorのステートマシンがややこしくなる可能性があるので、仕様に沿った形を検討して貰えればと思います。
ITATI

2019/01/03 01:55

ご協力ありがとうございました。次の処置で解決しました。 ①thrust = CharacterPosition - beforeCharacterPosition;の計算が始まるまでに5-6フレームかかる 環境の問題が原因の様です。再起動15分後位で試したところ誤差が3フレーム程度に縮みました。 日頃リファレンスを参考にするためにFirefoxを大量のタブで起動しているのが原因かと思います。 ②アニメーション切り替えの失敗 全く想定外でしたので記載しなかった「待機、歩行状態のアニメーション」が邪魔をしていたようです。 ですが落下に関しては構想前でしたので、非常に参考になりました。現在は落下アニメーションも動作に成功しています。 また、宜しくお願い致します。
guest

0

・アニメーション切り替えの失敗

着地時に切り替える為の「待機状態」「歩行状態」のアニメーションが邪魔をしていたようです。
トランジションのコンディションでの切り替え条件追加と、
スクリプトに条件式を追加したところアニメーションが正常に切り替わりました。

if (grounded ==true && air == false)//⇐追加条件例(地に足がついていて、滞空状態でない) { if (n != 0.0f) { dir = Mathf.Sign(n); speedVx = speed * n; animator.SetTrigger("Run");//歩行状態 } else { speedVx = 0; animator.SetTrigger("Idle");//待機状態 } }

蛇足ですが、ジャンプアニメーションは上昇、滞空状態、下降の3つより(上昇+滞空状態)、下降の2つで表現した方が切り替え時間が安定する為に見栄えが良かったです。

投稿2019/01/03 02:04

ITATI

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問