前提・実現したいこと
初心者です。プレイヤーの左右移動・ジャンプ(空中)・着地・攻撃のアニメーションをアニメーターで動くよう設定し、押されたキーボードによってパラメーターが切り替わるようC#スクリプトも書いたのですが、”プレイヤーが右向きで、空中で攻撃モーションを実行した後”のスプライト反転がうまくいきません。
空中に居るときはDキーAキーを押しているかでSpriteレンダラーをコードでいじっており、狙い通りに動いています。しかし、右向きで攻撃アニメーションに切り替わった直後の1フレームだけ、なぜかジャンプアニメーションが左を向き、次のフレームで右向きに戻る、という動作が起こってしまいました。この1フレームの逆向きを直したいです。
プレイヤー左向きで、空中で攻撃モーションを実行したときは正常に動くのですが、右向きだけなぜかそうなります。(スプライトは1フレームずつRecorderで確認しました。)
該当のソースコード
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { Rigidbody2D rb; Animator animator; SpriteRenderer sr; BoxCollider2D bc; //水平方向の速度(インスペクターから変更) public float movespeed; //垂直方向の速度 public float JampSpeed; bool Right = false; bool Left = false; bool Space = false; bool Enter = false; bool IsGround = true; int direction = 1; int forceY = 0; //水平方向の変数 float x = 0; //垂直方向の変数 float y = 0; float resistance = 0; public float Test = 0; //歩きアニメーションの変数 int anime = 0; //攻撃インターバルの時間 int AttackInterbal = 0; void Start() { rb = GetComponent<Rigidbody2D>(); this.animator = GetComponent<Animator>(); this.sr = GetComponent<SpriteRenderer> (); this.bc = GetComponent<BoxCollider2D>(); } void Update() { Right = Input.GetKey(KeyCode.D); Left = Input.GetKey(KeyCode.A); Space = Input.GetKeyDown(KeyCode.Space); Enter = Input.GetKeyDown(KeyCode.Return); //入力に合わせてアニメーションを変えるための変数 x = 0; anime = 0; if(IsGround) { sr.flipX = false; if(animator.GetCurrentAnimatorStateInfo(0).IsName("Tyakuti")) { Space = false; } Horizontal(); if(Space) { y = 3; if(animator.GetCurrentAnimatorStateInfo(0).IsName("PlayerAttackRight") || animator.GetCurrentAnimatorStateInfo(0).IsName("PlayerAttack")) { }else { animator.SetTrigger("Jamp"); } } }else if(IsGround == false) { JampHorizontal(); JampAnimation(); } //アニメーターをセット animator.SetInteger("X",anime); animator.SetInteger("ForceY",forceY); animator.SetInteger("Direction",direction); if(animator.GetCurrentAnimatorStateInfo(0).IsName("PlayerAttackRight") || animator.GetCurrentAnimatorStateInfo(0).IsName("PlayerAttack")) { Enter = false; sr.flipX = false; }else { if(Enter && AttackInterbal >=15) { animator.SetTrigger("Attack"); AttackInterbal = 0; sr.flipX = false; } } } void FixedUpdate() { AttackInterbal += 1; if(rb.velocity.y < 0f) { forceY = -1; }else if(rb.velocity.y > 0f) { forceY = 1; } if(IsGround == false) { resistance = Test; y = y-resistance; } //プレイヤーを動かす Vector2 force = new Vector2(x*movespeed,y*JampSpeed); rb.velocity = force; } void LateUpdate() { if(IsGround) { if(animator.GetCurrentAnimatorStateInfo(0).IsName("Tyakuti") || animator.GetCurrentAnimatorStateInfo(0).IsName("Player Jamp")) { JampAnimation(); } } PlayerBoxCollider2D(); } void JampAnimation() { if(animator.GetCurrentAnimatorStateInfo(0).IsName("PlayerAttackRight") || animator.GetCurrentAnimatorStateInfo(0).IsName("PlayerAttack")) { sr.flipX = false; }else { if(direction == 1) { sr.flipX = true; }else if(direction == -1) { sr.flipX = false; } } } void PlayerBoxCollider2D() { if(animator.GetCurrentAnimatorStateInfo(0).IsName("Stand Left")) { bc.offset = new Vector2(-0.2648673f,4.789154f); bc.size = new Vector2(4.811014f,9.569521f); }else if(animator.GetCurrentAnimatorStateInfo(0).IsName("Left")) { bc.offset = new Vector2(-0.5853982f,4.789154f); bc.size = new Vector2(4.752741f,9.569521f); }else if(animator.GetCurrentAnimatorStateInfo(0).IsName("Player Jamp")) { if(sr.flipX == false) { bc.offset = new Vector2(-0.5929848f,4.789154f); bc.size = new Vector2(5.175585f,9.569521f); }else if(sr.flipX == true) { bc.offset = new Vector2(0.5929848f,4.789154f); bc.size = new Vector2(5.175585f,9.569521f); } }else if(animator.GetCurrentAnimatorStateInfo(0).IsName("TarnLeft")) { bc.offset = new Vector2(0.3882649f,4.789154f); bc.size = new Vector2(4.748553f,9.569521f); } else if(animator.GetCurrentAnimatorStateInfo(0).IsName("JampDown")) { if(sr.flipX == false) { //左向き降下中 bc.offset = new Vector2(-0.5477571f,4.789154f); bc.size = new Vector2(5.099566f,9.569521f); }else if(sr.flipX == true) { //みぎむき降下中 bc.offset = new Vector2(0.5477571f,4.789154f); bc.size = new Vector2(5.099566f,9.569521f); } } else if(animator.GetCurrentAnimatorStateInfo(0).IsName("Tyakuti")) { if(sr.flipX == false) { //左向き着地 bc.offset = new Vector2(-0.7525125f,4.26058f); bc.size = new Vector2(5.509076f,8.512373f); }else if(sr.flipX == true) { //みぎむき着地 bc.offset = new Vector2(0.7525125f,4.26058f); bc.size = new Vector2(5.509076f,8.512373f); } } else if(animator.GetCurrentAnimatorStateInfo(0).IsName("Stand")) { bc.offset = new Vector2(0.2648673f,4.789154f); bc.size = new Vector2(4.811014f,9.569521f); } else if(animator.GetCurrentAnimatorStateInfo(0).IsName("Right")) { bc.offset = new Vector2(0.5853982f,4.789154f); bc.size = new Vector2(4.752741f,9.569521f); }else if(animator.GetCurrentAnimatorStateInfo(0).IsName("TarnRight")) { bc.offset = new Vector2(0.1882649f,4.789154f); bc.size = new Vector2(4.748553f,9.569521f); }else if(animator.GetCurrentAnimatorStateInfo(0).IsName("PlayerAttack")) { } } //地面との衝突判定 void OnCollisionStay2D(Collision2D collision) { if (collision.gameObject.tag == "FloorObject") { IsGround =true; resistance = 0; forceY = 0; } } void OnCollisionExit2D(Collision2D collision) { if (collision.gameObject.tag == "FloorObject") { IsGround =false; } } void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.tag == "FloorObject") { y = 0; animator.SetTrigger("Tyakuti"); } } void Horizontal() { if(Right && Left) { x = 0; anime = 0; } else if(Right) { x = 1; anime = 1; direction = 1; }else if(Left) { x = -1; anime = -1; direction = -1; } } void JampHorizontal() { if(Right && Left) { x = 0; anime = 0; } else if(Right) { x = 0.6f; anime = 1; direction = 1; }else if(Left) { x = -0.6f; anime = -1; direction = -1; } } }
試したこと
攻撃アニメーションになったら変数に1を代入し、ジャンプアニメーションでその変数が1ならスプライトを本来とは逆に反転させて変数を0にする、という感じでむりやり動かそうとしましたが他のアニメーションもおかしくなりました。調べても調べても分かりません。
有識者から見ればコードも訂正するところだらけで、回答するための情報も足りてないかもですが、解決策をいただけると大変ありがたいです。
補足情報(FW/ツールのバージョンなど)
2020.3.19f1
あなたの回答
tips
プレビュー