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

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

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

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

Unity

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

Q&A

解決済

1回答

1933閲覧

[Unity][C#]地面の端でしかジャンプが出来なくなってしまった。

TENNEKO

総合スコア6

C#

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

Unity

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

0グッド

1クリップ

投稿2020/08/23 04:05

前提・実現したいこと

Unityで2Dアクションゲームを作成しています。

発生している問題・エラーメッセージ

地面の端にいるとき以外はジャンプが出来なくなってしまいました。

該当のソースコードイメージ説明

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerManager : MonoBehaviour 6{ 7 [SerializeField] GameManager gameManager; 8 [SerializeField] LayerMask blockLayer; 9 10 public enum DIRECTION_TYPE 11 { 12 STOP, 13 LEFT, 14 RIGHT, 15 } 16 DIRECTION_TYPE direction = DIRECTION_TYPE.STOP; 17 float speed; 18 Rigidbody2D rigidbody2D; 19 20 Animator animator; 21 22 float jumpPower = 550; 23 24 void Start() 25 { 26 rigidbody2D = GetComponent<Rigidbody2D>(); 27 animator = GetComponent<Animator>(); 28 } 29 30 void Update() 31 { 32 float x = Input.GetAxis("Horizontal"); 33 animator.SetFloat("speed", Mathf.Abs(x)); 34 35 if (x == 0) 36 { 37 direction = DIRECTION_TYPE.STOP; 38 } 39 else if (x > 0) 40 { 41 direction = DIRECTION_TYPE.RIGHT; 42 } 43 else if (x < 0) 44 { 45 direction = DIRECTION_TYPE.LEFT; 46 } 47 48 if (IsGround()) 49 { 50 Debug.Log("接地判定"); 51 if (Input.GetKeyDown("space")) 52 { 53 Debug.Log("ジャンプ関数の呼び出し"); 54 Jump(); 55 } 56 else 57 { 58 Debug.Log("ジャンプアニメーションの終了"); 59 animator.SetBool("isJumping", false); 60 } 61 } 62 } 63 void FixedUpdate() 64 { 65 switch (direction) 66 { 67 case DIRECTION_TYPE.STOP: 68 speed = 0; 69 break; 70 case DIRECTION_TYPE.RIGHT: 71 speed = 4; 72 transform.localScale = new Vector3(1, 1, 1); 73 break; 74 case DIRECTION_TYPE.LEFT: 75 speed = -4; 76 transform.localScale = new Vector3(-1, 1, 1); 77 break; 78 } 79 rigidbody2D.velocity = new Vector2(speed, rigidbody2D.velocity.y); 80 } 81 82 void Jump() 83 { 84 //Debug.Log("ジャンプ"); 85 rigidbody2D.AddForce(Vector2.up * jumpPower); 86 animator.SetBool("isJumping", true); 87 } 88 89 bool IsGround() 90 { 91 Debug.Log("接地判定の取得"); 92 Vector3 leftStartPoint = transform.position - Vector3.right * 0.3f; 93 Vector3 endPoint = transform.position - Vector3.up * 0.1f; 94 Vector3 rightStartPoint = transform.position + Vector3.right * 0.3f; 95 96 // 確認用 97 Debug.DrawLine(leftStartPoint, endPoint); 98 Debug.DrawLine(rightStartPoint, endPoint); 99 100 return Physics2D.Linecast(leftStartPoint, endPoint, blockLayer) || Physics2D.Linecast(rightStartPoint, endPoint, blockLayer); 101 } 102 103 private void OnTriggerEnter2D(Collider2D collision) 104 { 105 if (collision.gameObject.tag == "Trap") 106 { 107 Debug.Log("ゲームオーバー"); 108 gameManager.GameOver(); 109 } 110 if (collision.gameObject.tag == "Finish") 111 { 112 Debug.Log("クリア"); 113 gameManager.GameClear(); 114 } 115 if (collision.gameObject.tag == "Item") 116 { 117 //アイテム取得 118 collision.gameObject.GetComponent<ItemManager>().GetItem(); 119 } 120 if (collision.gameObject.tag == "Enemy") 121 { 122 EnemyManager enemy = collision.gameObject.GetComponent<EnemyManager>(); 123 if (this.transform.position.y + 0.2f > enemy.transform.position.y) 124 { 125 //上から踏んだら 126 rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, 0); 127 Jump(); 128 enemy.DestroyEnemy(); 129 } 130 else 131 { 132 // 横からぶつかったら 133 Destroy(this.gameObject); 134 gameManager.GameOver(); 135 } 136 } 137 } 138}

試したこと

ソースコード内のDebug.Logで91行目「接地判定の取得」のところは正常に動作していました。しかし、48行目「接地判定」ところは地面の端っこに立っているとき以外は動作していませんでした。

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

いつの間にかこんな動作をするようになっていました。正常に動作していた時期もありました。
Unity:2019.3.12

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

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

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

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

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

ikadzuchi

2020/08/24 15:29

> // 確認用 > Debug.DrawLine(leftStartPoint, endPoint); > Debug.DrawLine(rightStartPoint, endPoint); デバッグ用に当たり判定を線で表示しているようですが、どう表示されますか?
TENNEKO

2020/08/25 09:43 編集

探して見たところ見つかりませんでした。 > Debug.DrawLine(leftStartPoint, endPoint, Color.red); > Debug.DrawLine(rightStartPoint, endPoint, Color.red); 視認性の問題かと思い色を赤にしてみたりもしたのですが、駄目でした。 ※追伸 このやり方以外のおすすめの接地判定取得のやり方があれば教えて下さい。
CodeLab

2020/08/27 08:04

>視認性の問題かと思い色を赤にしてみたりもしたのですが、駄目でした。 裏に描画されているのかも? ゲーム実行中に、スプライトレンダラーのチェックを外せば見れるのでは?
TENNEKO

2020/08/30 09:27

丁寧にありがとうございました。もう少し試してみて最悪やり方を変えてみます。
guest

回答1

0

ベストアンサー

接地判定はぱっと見正しそうに見えるのですが…。

ただ、ルールとして、GetKeyDown()の処理はUpdate()メソッドで物理演算系はFixedUpdate()メソッドに書かなければいけないそうです。
下記が詳しい
参考[Unity] InputとFixedUpdateと物理演算の関係を整理しよう

Jump処理がUpdate()メソッドで書かれているのでそのあたりに原因があるかもしれません。

Update()でキーを押したかどうかのフラグだけ変更して、Jump()はFixedUpdate()で呼ぶようにするか、FixedUpdate()内でGetKey()でジャンプ判定をするように変更してみてはいかがでしょうか?

もう1点。タイルマップの地面が別のレイヤーになってたりはしないでしょうか?

このやり方以外のおすすめの接地判定取得のやり方があれば教えて下さい。

・コライダを足元に追加してOnTriger=ONに。OnTrigerで接地判定
・Physics2D.OverlapArea()を使う方法
私は1番目の方法をよく使います。
コライダを3つ使った、こちらのブログの方法が完璧だなと個人的に思っています。
2Dキャラの精密な接地判定

投稿2020/08/27 08:31

編集2020/08/27 08:35
CodeLab

総合スコア1939

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

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

TENNEKO

2020/08/30 09:26

コライダを足元に追加してやってみます。丁寧にどうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問