前提・実現したいこと
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
> // 確認用
> Debug.DrawLine(leftStartPoint, endPoint);
> Debug.DrawLine(rightStartPoint, endPoint);
デバッグ用に当たり判定を線で表示しているようですが、どう表示されますか?
探して見たところ見つかりませんでした。
> Debug.DrawLine(leftStartPoint, endPoint, Color.red);
> Debug.DrawLine(rightStartPoint, endPoint, Color.red);
視認性の問題かと思い色を赤にしてみたりもしたのですが、駄目でした。
※追伸
このやり方以外のおすすめの接地判定取得のやり方があれば教えて下さい。
>視認性の問題かと思い色を赤にしてみたりもしたのですが、駄目でした。
裏に描画されているのかも?
ゲーム実行中に、スプライトレンダラーのチェックを外せば見れるのでは?
丁寧にありがとうございました。もう少し試してみて最悪やり方を変えてみます。
回答1件
あなたの回答
tips
プレビュー