コード ```### 前提・実現したいこと unityで敵と衝突した際にレイヤーを移動して無敵判定をつけて、さらにその間ダメージを受けたことを表現するアニメーションが再生されるようにしたいと考えています。 ### 発生している問題・エラーメッセージ 一度アニメーションが再生されるとデフォルトのアニメーションに戻らなくなり、また無敵判定とフラグ管理にコルーチンを利用したところ敵と衝突した際に100%フリーズするようになってしまいました。 もう一週間ほどこのエラーに苦しんでいて、エラーメッセージが見られずコンパイルエラーも確認できないため原因が全くわかりません。
エラーメッセージ
### 該当のソースコード ```C# Animator anim = null; Animation anime; private Rigidbody2D rb = null; private string enemyTag = "Enemy"; SpriteRenderer sr; private float dashTime; void Start() { //コンポーネントのインスタンスを捕まえる anim = GetComponent<Animator>(); anime = GetComponent<Animation>(); rb = GetComponent<Rigidbody2D>(); sr = GetComponent<SpriteRenderer>(); } /// <summary> /// X成分で必要な計算をし、速度を返す。 /// </summary> /// <returns>The x.</returns> private float SetX() { float xSpeed; float horizontalKey = Input.GetAxis("Horizontal"); if (horizontalKey > 0) { transform.localScale = new Vector3(1, 1, 1); isRun = true; xSpeed = speed; dashTime += Time.deltaTime; } else if (horizontalKey < 0) { transform.localScale = new Vector3(-1, 1, 1); isRun = true; xSpeed = -speed; dashTime += Time.deltaTime; } else { isRun = false; xSpeed = 0.0f; dashTime = 0.0f; } if (horizontalKey > 0 && beforeKey < 0) { dashTime = 0.0f; } else if (horizontalKey < 0 && beforeKey > 0) { dashTime = 0.0f; } xSpeed *= dashCurve.Evaluate(dashTime); beforeKey = horizontalKey; return xSpeed; } void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.tag == "Enemy") { StartCoroutine("Damage"); GManager.instance.heartNum(HPを格納した変数です) -= 1; } } IEnumerator Damage() { isDown(敵と衝突したフラグ) = true; yield return null; sr.sortingLayerID = (10); yield return new WaitForSeconds(4); sr.sortingLayerID = (8); isDown = false; } void DamageMotion(){ if(isDown == true){ anim(animationのインスタンスです).Play("Damage"); } else { anime(animatorのインスタンスです).Stop("Damage"); } } ソースコード
試したこと
アニメーションについてはPlay関数で動かしたものが戻らないのは何故かと考え、isDownがFalseになるとデフォルトモーションが再生されるようにしたり、animatorクラスのStopメソッドを利用したりしました。
Stopメソッドについては現在フリーズするようになっているためこれで希望通りに動くのかは分かっていません。
animation.Playの対になるanimation.Stopを本当は使いたかったのですが、非推奨ということで何故かコンパイルエラーが起きます。
それからフリーズについては、else文を付け足して無限ループを防ごうとしたりしましたが、正直お手上げです。
どうしたらいいのか全くわかりません。
どうかご助力よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
unityのバージョンは2019,1,10f1というやつのpersonalです。
その他足りない情報などあれば随時付け足させていただくのでどうぞお申し付けください。
よろしくお願いいたします。
追記
DamageMotion()はフレームごとにisDownのif文で判定を行って実行されるものと認識していました。
Fixedやawakeやstartがつかない関数は全てupdateと同じ扱いになると聞いていたので。
もし違うのであれば、UpdateやFixedで別途呼び出したほうがよろしいのでしょうか。
質問に質問で返す無知をお許しください。
回答としてはUpdateと同じくフレームごとに呼び出されていると認識しているものの、もし違うのであれば呼び出せていませんということになります。
特にソースコードの外でUpdateやFixedUpdateで呼び出していたりはしません。
すみません。
アニメーションの素材です
デフォルト、立って停止している状態
https://imgur.com/MlkXxpP.png
ダメージを受けた状態(isDown==trueの際にPlayしているもの)
https://imgur.com/MVzawhE.png
歩きモーションです
https://imgur.com/flkVvzf.png
https://imgur.com/qKi6B6y.png
ソースコードについてisDownまわりとアニメーション関連に絞りました。
もしこれでも不十分でしたら、マナー違反でないのならGitで管理しているプロジェクトをこの場に出すようなことをさせていただいてもよろしいでしょうか?
それはともかく、幾度もの不手際重ねてお詫び申し上げます。
どうぞご鞭撻のほどよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー