こちらのサイトを参考にキャラを動かすスクリプトを作っています。Aが入力された時一度目は押した方向を向くのですが二度目は逆を向いてしまいます、解決方法ありましたらお願いします。
using
1using System.Collections.Generic; 2using UnityEngine; 3 4public class PlayerController : MonoBehaviour { 5 6 Rigidbody2D rb;//rigidbodyの取得 7 Animator animator;//animatorの取得 8 9 [SerializeField] 10 private float jumpForce;//jumpで加える力 11 12 [SerializeField] 13 private float jumpThreshold;//jump中か判定するしきい値 14 15 [SerializeField] 16 private float runForce;//走るときの初速 17 18 [SerializeField] 19 private float runSpeed;//走る速さ 20 21 [SerializeField] 22 private float runThreshold;//速度切り替えを判定するしきい値 23 24 [SerializeField] 25 private bool isGround;//地面かどうかを判定する 26 27 private float key = 0;//入力の管理 28 29 private string state;//状態の管理 30 private string prevState;//前の状態の保存 31 private float stateEffect = 1;//状態に応じて横移動速度を変えるためのもの 32 33 34 void Start () 35 { 36 //それぞれの取得 37 rb = GetComponent<Rigidbody2D>(); 38 animator = GetComponent<Animator>(); 39 } 40 41 42 void Update () 43 { 44 GetInputKey();//入力取得 45 ChangeState();//状態遷移 46 ChangeAnimation();//状態によってアニメーションを変える 47 Move();//キャラを動かす 48 } 49 50 /// <summary> 51 /// キー入力を取得する 52 /// </summary> 53 private void GetInputKey() 54 { 55 56 57 key = Input.GetAxisRaw("Horizontal"); 58 } 59 60 /// <summary> 61 /// 状態遷移 62 /// </summary> 63 private void ChangeState() 64 { 65 //ジャンプしたとき 66 if (Mathf.Abs(rb.velocity.y) > jumpThreshold) 67 { 68 isGround = false; 69 } 70 //地面にいる 71 if (isGround) 72 { 73 //走っている 74 if(key != 0) 75 { 76 state = "RUN"; 77 } 78 //止まってる 79 else 80 { 81 state = "IDLE"; 82 } 83 84 } 85 //空中にいるとき 86 else 87 { 88 //上昇 89 if (rb.velocity.y > 0) 90 { 91 state = "JUMP"; 92 } 93 //下降 94 else if(rb.velocity.y<0) 95 { 96 state = "FALL"; 97 } 98 } 99 100 101 } 102 /// <summary> 103 /// アニメーションを変える 104 /// </summary> 105 private void ChangeAnimation() 106 { 107 //状態遷移した時だけやる 108 if (prevState != state) 109 { 110 switch (state) 111 { 112 case "JUMP": 113 animator.SetBool("isJump", true); 114 animator.SetBool("isFall", false); 115 animator.SetBool("isRun", false); 116 animator.SetBool("isIdle", false); 117 stateEffect = 0.5f; 118 break; 119 120 case "FALL": 121 animator.SetBool("isJump", false); 122 animator.SetBool("isFall", true); 123 animator.SetBool("isRun", false); 124 animator.SetBool("isIdle", false); 125 stateEffect = 0.5f; 126 break; 127 128 case "RUN": 129 animator.SetBool("isJump", false); 130 animator.SetBool("isFall", false); 131 animator.SetBool("isRun", true); 132 animator.SetBool("isIdle", false); 133 stateEffect = 1.0f; 134 135 transform.localScale = new Vector3(gameObject.transform.localScale.x * key, gameObject.transform.localScale.y, gameObject.transform.localScale.z); 136 137 break; 138 139 default: 140 animator.SetBool("isJump", false); 141 animator.SetBool("isFall", false); 142 animator.SetBool("isRun", false); 143 animator.SetBool("isIdle", true); 144 stateEffect = 1.0f; 145 break; 146 } 147 //状態を保存 148 prevState = state; 149 } 150 151 } 152 153 private void Move() 154 { 155 //地面にいるとき 156 if (isGround) 157 { 158 if (Input.GetKeyDown(KeyCode.Space))//ジャンプする 159 { 160 rb.AddForce(transform.up * jumpForce); 161 isGround = false; 162 } 163 } 164 165 166 transform.position += new Vector3(runSpeed * Time.deltaTime * key * stateEffect, 0, 0); 167 168 } 169 170 //着地判定する 171 private void OnCollisionEnter2D(Collision2D col) 172 { 173 if(col.gameObject.tag == "Ground") 174 { 175 if (!isGround) 176 isGround = true; 177 } 178 } 179 180 private void OnCollisionStay2D(Collision2D col) 181 { 182 if (col.gameObject.tag == "Ground") 183 { 184 if (!isGround) 185 isGround = true; 186 } 187 } 188} 189 190コード
タイトルと質問内容との関連性があまり見えないのですが、なるべく質問内容に寄せたタイトルにしていただけますか?
回答1件
あなたの回答
tips
プレビュー