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

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

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

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

Q&A

解決済

1回答

482閲覧

スプライト反転がうまくいかない場合がある

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2019/01/22 15:47

編集2019/01/23 06:27

リンク内容

こちらのサイトを参考にキャラを動かすスクリプトを作っています。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コード

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

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

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

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

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

m.ts10806

2019/01/23 00:54

タイトルと質問内容との関連性があまり見えないのですが、なるべく質問内容に寄せたタイトルにしていただけますか?
guest

回答1

0

ベストアンサー

ChangeAnimation中のRUNのケースでgameObject.transform.localScale.x * keyと記述された部分があります。
これだと、おそらく1回目に「A」を押した際にはスケールXが反転してマイナスになり正しく左を向きますが、2回目に「A」が押された際にはスケールXもマイナス、keyもマイナスのためスケールがプラスに戻り、ふたたび反転して右を向いてしまうんじゃないかと思います。

たとえばMathf.Abs(gameObject.transform.localScale.x) * keyのような風に、スケール値として常にプラスの値を使うようにしてみてはいかがでしょうか?

投稿2019/01/22 22:13

Bongo

総合スコア10807

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

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

退会済みユーザー

退会済みユーザー

2019/01/26 04:18

押した方向を向くようにできました!たまに上手くいきませんが…そこはほかのやり方がないか調べてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問