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

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

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

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

Q&A

解決済

1回答

1521閲覧

unity ゴール地点でのアニメーション再生を一度きりにしたい

choya3

総合スコア1

C#

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

0グッド

0クリップ

投稿2021/08/11 23:42

現在unityで2Dゲームを作成中なのですが、ゴール地点でのアニメーション再生がリピートして起きてしまうので困っています。
ゴール地点では地面に就いた状態で触れると一度だけのアニメーション再生になるのですが、ジャンプしてゴール地点に触れると判定があるのかゴール地点の上でずっと跳ねます。

OnCollisionEnter2Dで設定してみたり初めにbool型で指定して一度判定したら外すということもやってみたのですが上手くいきませんでしたので助言がございましたらお願いします。
バージョンはUnity Hub2.4.3 Unity 2020.3.13f1です。

C+

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerController : MonoBehaviour 6{ 7 Rigidbody2D rbody; //Rigidbody2D型の変数 8 float axisH = 0.0f; //入力 9 public float speed = 4.0f; //移動速度 10 11 public float jump = 9.0f; //ジャンプ力 12 public LayerMask groundLayer; //着地できるレイヤー 13 bool goJump = false; //ジャンプ開始フラグ 14 bool onGround = false; //地面に立っているフラグ 15 16 //アニメーション対応 17 Animator animator; //アニメーター 18 public string stopAnime = "PlayerStand"; 19 public string moveAnime = "PlayerMove"; 20 public string attackAnime = "PlayerAttack"; 21 public string jumpAnime = "PlayerJump"; 22 public string goalAnime = "PlayerGoal"; 23 string nowAnime = ""; 24 string oldAnime = ""; 25 26 public static string gameState = "playing"; 27 28 // Start is called before the first frame update 29 void Start() 30 { 31 //Rigidbody2Dを取ってくる 32 rbody = this.GetComponent<Rigidbody2D>(); 33 //Animator を撮ってくる 34 animator = GetComponent<Animator>(); 35 nowAnime = stopAnime; 36 oldAnime = stopAnime; 37 38 gameState = "playing"; //ゲーム中にする 39 40 } 41 42 // Update is called once per frame 43 void Update() 44 { 45 if (gameState != "playing") 46 { 47 return; 48 } 49 50 //水平方向の入力をチェックする 51 axisH = Input.GetAxisRaw("Horizontal"); 52 //向きの調整 53 if(axisH > 0.0f) 54 { 55 //右移動 56 Debug.Log("右移動"); 57 transform.localScale = new Vector2(-1, 1); 58 } 59 else if(axisH < 0.0f) 60 { 61 //左移動 62 Debug.Log("左移動"); 63 transform.localScale = new Vector2(1, 1); //左右反転させる 64 } 65 //キャラクターをジャンプさせる 66 if(Input.GetButtonDown("Jump")) 67 { 68 Jump(); //ジャンプ 69 } 70 71 } 72 73 void FixedUpdate() 74 { 75 if (gameState != "playing") 76 { 77 return; 78 } 79 80 81 //地上判定 82 onGround = Physics2D.Linecast(transform.position, 83 transform.position - (transform.up * 0.1f), 84 groundLayer); 85 86 if(onGround || axisH != 0) 87 { 88 //地面の上or速度が0ではない 89 //速度を更新する 90 rbody.velocity = new Vector2(speed * axisH, rbody.velocity.y); 91 92 } 93 if(onGround && goJump) 94 { 95 //地面の上でジャンプキーが押された 96 //ジャンプさせる 97 Debug.Log("ジャンプ"); 98 Vector2 jumpPw = new Vector2(0, jump); //ジャンプさせるベクトルを作る 99 rbody.AddForce(jumpPw, ForceMode2D.Impulse); //瞬間的な力を加える 100 goJump = false; //ジャンプフラグを下す 101 } 102 if (onGround) 103 { 104 //地面の上 105 if(axisH == 0) 106 { 107 nowAnime = stopAnime; //停止中 108 } 109 else 110 { 111 nowAnime = moveAnime; //移動 112 } 113 } 114 else 115 { 116 //空中 117 nowAnime = jumpAnime; 118 } 119 120 if(nowAnime != oldAnime) 121 { 122 oldAnime = nowAnime; 123 animator.Play(nowAnime); //アニメーション再生 124 } 125 126 } 127 //ジャンプ 128 public void Jump() 129 { 130 goJump = true; //ジャンプフラグを立てる 131 Debug.Log("ジャンプボタンを押しました"); 132 } 133 134 //接触開始 135 private void OnTriggerEnter2D(Collider2D collision) 136 { 137 if(collision.gameObject.tag == "Goal") 138 { 139 Goal(); //ゴールメソッド実行 140 } 141 else if(collision.gameObject.tag == "Dead") 142 { 143 GameOver(); //ゲームオーバーメソッド実行 144 } 145 } 146 147 // ゴール 148 public void Goal() 149 { 150 gameState = "gameclear"; 151 GameStop(); // ゲーム停止 152 // プレイヤーを上に少し跳ね上げる演出 153 rbody.AddForce(new Vector2(0, 5), ForceMode2D.Impulse); 154 //ジャンプで上に乗るとぴょんぴょん跳ねてしまう 防ぐには 155 //ゴールの判定を無くす? OntriggerSt~で設定したがダメだった 156 animator.Play(goalAnime); 157 Debug.Log("ピョン"); 158 } 159 // ゲームオーバー 160 public void GameOver() 161 { 162 //animator.Play(deadAnime); 163 164 gameState = "gameover"; 165 GameStop(); // ゲーム停止 166 // ===================== 167 // ゲームオーバー演出 168 // ===================== 169 // プレイヤー当たりを消す 170 GetComponent<CapsuleCollider2D>().enabled = false; 171 172 } 173 // ゲーム停止 174 void GameStop() 175 { 176 // Rigidbody2D を取ってくる 177 Rigidbody2D rbody = GetComponent<Rigidbody2D>(); // 速度を 0 にして強制停止 178 rbody.velocity = new Vector2(0, 0); 179 } 180 181 182} 183 184

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

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

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

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

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

masayuki07

2021/08/15 01:06

bool型で指定して一度判定したら外す とありますがそちらの方法で可能では無いでしょうか? private bool actionCheck;//追加 //接触開始 private void OnTriggerEnter2D(Collider2D collision) { if(collision.gameObject.tag == "Goal" && actionCheck == false) { Goal(); //ゴールメソッド実行 } else if(collision.gameObject.tag == "Dead") { GameOver(); //ゲームオーバーメソッド実行 } actionCheck = true }
guest

回答1

0

自己解決

すみません、回答していただいてありがとうございました。
試してみたのですが上手くいかなかったので、
Animation Clip での設定でLoop Timeのチェックをオフにしましたら上手く1度きりになりました。

投稿2021/08/15 20:14

choya3

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問