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

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

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

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

Q&A

解決済

1回答

2313閲覧

Unity2D ジャンプアクションゲームでブロックの横に当たると二段ジャンプを禁止するコードを組みたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2019/03/24 10:04

ジャンプしてブロックの上にのぼるりそこでもまたジャンプすると思うのですがそのジャンプするときに四角いブロックの両端のにコライダーが擦り当たってるとその地点からまたジャンプ出来てしますがその動作はゲーム上変なのでブロックの上にいたときだけジャンプできブロックの両端ではジャンプできない仕様にしたいのですがどうすればいいのでしょうか?教えてくれますでしょうか?

player.cs

1public class PlayerController : MonoBehaviour { 2 3 public float JumpForce = 200.0f; 4 public float speed = 0.5f; 5 private bool isJump; 6 private bool isRun; 7 private bool isGround; 8 private Animator animator; 9 10 11 // Use this for initialization 12 void Start () { 13 14 15 animator = GetComponent<Animator>(); 16 isJump = false; 17 isRun = false; 18 isGround = false; 19 } 20 21 22 // Update is called once per frame 23 void Update () { 24 int key = 0; 25 26 //if(transform.position.y < ) 27 28 if(Input.GetKey(KeyCode.Space)) 29 { 30 31 if (!isJump) 32 { 33 GetComponent<Rigidbody2D>().AddForce(new Vector2(0, JumpForce)); 34 animator.SetBool("Jump",true); 35 isJump = true; 36 } 37 } 38 39 if(isJump == false) 40 { 41 animator.SetBool("Jump",false); 42 } 43 44 if (Input.GetKey(KeyCode.RightArrow)) 45 { 46 key = 1; 47 transform.Translate(Vector3.right * speed); 48 49 if(isRun == false && isJump == false) 50 { 51 animator.SetBool("Run",true); 52 53 } 54 } 55 56 57 58 if (Input.GetKey(KeyCode.LeftArrow)) 59 { 60 key = -1; 61 transform.Translate(Vector3.left * speed); 62 63 if(isRun == false && isJump == false) 64 { 65 animator.SetBool("Run",true); 66 } 67 } 68 69 if(key == 0 || isJump == true) 70 { 71 isRun = false; 72 animator.SetBool("Run",false); 73 } 74 75 76 if(key != 0) 77 { 78 transform.localScale = new Vector3(key,1,1); 79 } 80 81 82 } 83 84 private void OnCollisionEnter2D(Collision2D collision) 85 { 86 isJump = false; 87 isGround = true; 88 89 } 90} 91

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

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

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

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

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

guest

回答1

0

ベストアンサー

プレイヤーの位置から足元にむかってRayを飛ばして地面があるかどうかをチェックするとかのやり方もあるですが
今回については、単純にコライダーが足元であたってるかどうかをチェックするのが手軽そうです。

参考:Raycastを使わず地面に接触しているか判定する

#考え方

  1. コライダーの当たり方に対して、プレイヤーの下方向にのみフィルターをかける
  2. Collider2DIsTouchingを使って、フィルターをかけた上での接触をチェック
  3. プレイヤーの下方向にコライダーがあれば地面にいると考える

下記スクリプトをアタッチしてプレイヤーのインスペクターを開き
[filter2d]の項目から[UseNormal Angle]にチェックを入れます。
その後、[Min Normal Angel]に70、[Max Normal Angle]に110を入れます。これでコライダーのこの角度(足元)だけ接触判定を取るようになります。

C#

1public class PlayerController : MonoBehaviour { 2 3 public float JumpForce = 200.0f; 4 public float speed = 0.5f; 5 private bool isJump; 6 private bool isRun; 7 private bool isGround; 8 private Animator animator; 9 [SerializeField] ContactFilter2D filter2d; // コライダーのフィルター 10 11 // Use this for initialization 12 void Start () { 13 14 15 animator = GetComponent<Animator>(); 16 isJump = false; 17 isRun = false; 18 isGround = false; 19 } 20 21 22 // Update is called once per frame 23 void Update () { 24 int key = 0; 25 26 //if(transform.position.y < ) 27 28 if(Input.GetKey(KeyCode.Space)) 29 { 30 31 if (!isJump) 32 { 33 GetComponent<Rigidbody2D>().AddForce(new Vector2(0, JumpForce)); 34 animator.SetBool("Jump",true); 35 isJump = true; 36 } 37 } 38 39 if(isJump == false) 40 { 41 animator.SetBool("Jump",false); 42 } 43 44 if (Input.GetKey(KeyCode.RightArrow)) 45 { 46 key = 1; 47 transform.Translate(Vector3.right * speed); 48 49 if(isRun == false && isJump == false) 50 { 51 animator.SetBool("Run",true); 52 53 } 54 } 55 56 57 58 if (Input.GetKey(KeyCode.LeftArrow)) 59 { 60 key = -1; 61 transform.Translate(Vector3.left * speed); 62 63 if(isRun == false && isJump == false) 64 { 65 animator.SetBool("Run",true); 66 } 67 } 68 69 if(key == 0 || isJump == true) 70 { 71 isRun = false; 72 animator.SetBool("Run",false); 73 } 74 75 76 if(key != 0) 77 { 78 transform.localScale = new Vector3(key,1,1); 79 } 80 81 //接地チェック 82 if(GetComponent<Rigidbody2D>().IsTouching(filter2d)){ 83 isJump = false; 84 isGround = true; 85 } 86 87 88 } 89 90}

参考:Collider2D.IsTouching

投稿2019/03/25 01:49

hogefugapiyo

総合スコア3302

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

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

退会済みユーザー

退会済みユーザー

2019/03/26 06:16

http://tsubakit1.hateblo.jp/entry/2018/04/07/234028 こちらのサイトを参考に調べていたのですがこの角度の部分を視覚化したいのですが方法はありますでしょうか?またunitychanの2D画像を使っているのですがこの画像は縦長なのですがこの場合は四角画像と違って45度と入れても四角画像と違って範囲は変わるのでしょうか?
退会済みユーザー

退会済みユーザー

2019/03/26 06:20

自己解決しました失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問