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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

5239閲覧

unity2Dで無限ジャンプさせないようにしたい

take_m

総合スコア5

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/02/14 18:30

前提・実現したいこと

Unityで2Dゲームを作るにあたり、キャラクターが接地している場合のみジャンプするようにしたいのですが、空中でもジャンプしてしまいます。修正点がわからず、質問させていただきました。接地判定のコードも載せさせていただきます。
始めたばかりで見難いコードとは思いますが宜しくお願いいたします。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerController : MonoBehaviour 6{ 7 Rigidbody2D rigid2D; 8 float jumpforce = 600.0f; 9 10 public GroundCheck ground; 11 private bool isGround = false; 12 13 void Start() 14 { 15 this.rigid2D = GetComponent<Rigidbody2D>(); 16 } 17 void Update() 18 { 19 isGround = ground.IsGround();//接地判定スクリプトのIsGroundメソッドの呼び出し 20 21 if (Input.GetKeyDown(KeyCode.Space) && isGround) 22 { 23 this.rigid2D.AddForce(transform.up * this.jumpforce); 24 isGround = false; 25 } 26 } 27} 28 29以下は接地判定のスクリプトです。 30 31---省略--- 32 private string GroundTag = "Ground"; 33 private bool isGround = false; 34 private bool isGroundEnter, isGroundStay, isGroundExit; 35 36 public bool IsGround() 37 { 38 if(isGroundEnter || isGroundStay) 39 { 40 isGround = true; 41 }else if(isGroundExit) 42 { 43 isGround = false; 44 } 45 isGroundEnter = false; 46 isGroundStay = false; 47 isGroundExit = false; 48 return isGround; 49 } 50 51 private void OnTriggerEnter2D(Collider2D collision) 52 { 53 if (collision.tag == GroundTag). 54 { 55 isGroundEnter = true; 56 } 57 58 } 59 private void OnTriggerStay2D(Collider2D collision) 60 { 61 if(collision.tag == GroundTag) 62 { 63 isGroundStay = true; 64 } 65 66 } 67 private void OnTriggerExit2D(Collider2D collision) 68 { 69 if(collision.tag == GroundTag) 70 { 71 isGroundExit = true; 72 73 } 74 75 } 76 77} 78 79

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答1

0

ベストアンサー

結論だけ述べるとIsGround()内の論理式を訂正すれば期待動作をするのですが、それで終わっては理解に繋がらないと判断します。

private bool isGroundEnter, isGroundStay, isGroundExit;

まず接地しているかどうかの情報だけで3つも変数を持たせてややこしくありませんか?
isGround一つだけの構成で問題が無いのであればそうすべきです。問題があるかどうかはあなたの掲載内容から読み取れなかったので、無いと仮定いたします。

private void OnTriggerEnter2D(Collider2D collision) { if (collision.tag == GroundTag). { isGround = true; } } private void OnTriggerStay2D(Collider2D collision) { if(collision.tag == GroundTag) { isGround= true; } } private void OnTriggerExit2D(Collider2D collision) { if(collision.tag == GroundTag) { isGround= false; } }

これで「接地しているかどうかに難解な論理式はいらない」という考え方を持っていただけると幸いなのですが、いかがでしょうか。

public bool IsGround() { return isGround; }

投稿2020/02/15 03:29

cider0318

総合スコア135

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

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

take_m

2020/02/15 15:43 編集

回答いただきありがとうございます! ご提示いただいたコードで試した所、空中ジャンプはせず理想の動きをしてくれました。 私のコードは色々調べながら書いたのですが難しく考えすぎても良くないのですね、大変勉強になりました。 もしよろしければ、""IsGround()内の論理式を訂正すれば期待動作をする""の訂正点について教えていただけますでしょうか?
cider0318

2020/02/16 01:57

私の読みが甘かったようです。 IsGround()内を訂正して解決するには、isGroundEnterとisGroundExitが同時にtrueになりえる状況を排除することが前提のように見えます。 また標準で用意されているUpdate()やOnTriggerEnter2D()などはそれぞれ実行タイミングが異なるため、IsGround()メソッド、つまりその呼び出し元であるUpdate()の実行タイミングと、IsGround()内でフラグをリセットするような処理を結びつけると、予期せぬ動作を招きそうです。 イベント関数の実行順序 https://docs.unity3d.com/ja/2018.4/Manual/ExecutionOrder.html よって質問時点でのIsGround()内の訂正で完全な期待動作は難しいかもしれません。
take_m

2020/02/16 05:28

回答頂き有難うございます。 Update()と実行タイミングの異なるOnTriggerEnter2D()等と結びついたisGroundEnter,Stay,ExitのリセットをIsGround()内で行っていたのが何かしらの不具合を起こした可能性があるということですね。 現状では漠然と、ではありますが今回の問題を理解できたと思います。 大変分かりやすい説明で助かりました、有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問