前提・実現したいこと
Unityを用いて上下左右に無限にジャンプが出来るような
2Dアクションゲームを作っています。
そのジャンプ機能の実装中にエラーが発生しました。
発生している問題・エラーメッセージ
All compiler errors have to be fixed before you can enter playmode!
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerManager : MonoBehaviour 6{ 7 [SerializeField] LayerMask blockLayer; 8 9 public enum DIRECTION_TYPE 10 { 11 STOP, 12 LEFT, 13 RIGHT, 14 } 15 DIRECTION_TYPE direction = DIRECTION_TYPE.STOP; 16 float speed; 17 Rigidbody2D rigidbody2D; 18 19 float jumpPower = 400; 20 21 void Start() 22 { 23 rigidbody2D = GetComponent<Rigidbody2D>(); 24 } 25 26 void Update() 27 { 28 float x = Input.GetAxis("Horizontal"); 29 30 if (x == 0) 31 { 32 direction = DIRECTION_TYPE.STOP; 33 } 34 else if (x > 0) 35 { 36 direction = DIRECTION_TYPE.RIGHT; 37 } 38 else if (x < 0) 39 { 40 direction = DIRECTION_TYPE.LEFT; 41 } 42 43 if (Input.GetKey("up")) 44 { 45 if (Input.GetKeyDown("space")) 46 { 47 Jump(); 48 } 49 } 50 if (Input.GetKey("right")) 51 { 52 if (Input.GetKeyDown("space")) 53 { 54 RightJump(); 55 } 56 } 57 if (Input.GetKey("left")) 58 { 59 if (Input.GetKeyDown("space")) 60 { 61 LeftJump(); 62 } 63 } 64 if (Input.GetKey("down")) 65 { 66 if (Input.GetKeyDown("space")) 67 { 68 DownJump(); 69 } 70 } 71 } 72 73 void FixedUpdate() 74 { 75 switch (direction) 76 { 77 case DIRECTION_TYPE.STOP: 78 speed = 0; 79 break; 80 case DIRECTION_TYPE.RIGHT: 81 speed = 3; 82 transform.localScale = new Vector3(1, 1, 1); 83 break; 84 case DIRECTION_TYPE.LEFT: 85 speed = -3; 86 transform.localScale = new Vector3(-1, 1, 1); 87 break; 88 } 89 rigidbody2D.velocity = new Vector2(speed, rigidbody2D.velocity.y); 90 } 91 92 void Jump() 93 { 94 rigidbody2D.AddForce(Vector2.up * jumpPower); 95 } 96 void RightJump() 97 { 98 rigidbody2D.AddForce(Vector2.right * jumpPower); 99 100 void LeftJump() 101 { 102 rigidbody2D.AddForce(Vector2.left * jumpPower); 103 } 104 void DownJump() 105 { 106 rigidbody2D.AddForce(Vector2.down * jumpPower); 107 } 108 109 110 bool IsGround() 111 { 112 Vector3 leftStartPoint = transform.position - transform.right * 0.3f; 113 Vector3 endPoint = transform.position - transform.up * 0.1f; 114 Vector3 rightStartPoint = transform.position + transform.right * 0.3f; 115 116 // 確認用 117 Debug.DrawLine(leftStartPoint, endPoint); 118 Debug.DrawLine(rightStartPoint, endPoint); 119 120 return Physics2D.Linecast(leftStartPoint, endPoint, blockLayer) || Physics2D.Linecast(rightStartPoint, endPoint, blockLayer); 121 } 122}
試したこと
空中ジャンプ関連のコードをコメントアウトすると正常に動くことを確認しました。
補足情報(FW/ツールのバージョンなど)
Unityのバージョンは2019.3.12です。
最終的には地面の上にいるときのジャンプと空中でのジャンプのモーションを分けようと思っているので接地判定を設けました。
しかし、その分岐の前を作る前にエラーが出てしまったために設置判定はまだ使われていません。
Unityでゲームを作り出してから間もない初心者なので分かりやすく教えていただけると嬉しいです。
※このコードをもとに改変して作成しています↓
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerManager : MonoBehaviour 6{ 7 [SerializeField] LayerMask blockLayer; 8 9 public enum DIRECTION_TYPE 10 { 11 STOP, 12 LEFT, 13 RIGHT, 14 } 15 DIRECTION_TYPE direction = DIRECTION_TYPE.STOP; 16 float speed; 17 Rigidbody2D rigidbody2D; 18 19 float jumpPower = 400; 20 21 void Start() 22 { 23 rigidbody2D = GetComponent<Rigidbody2D>(); 24 } 25 26 void Update() 27 { 28 float x = Input.GetAxis("Horizontal"); 29 30 if (x == 0) 31 { 32 direction = DIRECTION_TYPE.STOP; 33 } 34 else if (x > 0) 35 { 36 direction = DIRECTION_TYPE.RIGHT; 37 } 38 else if (x < 0) 39 { 40 direction = DIRECTION_TYPE.LEFT; 41 } 42 43 if (IsGround() && Input.GetKeyDown("space")) 44 { 45 Jump(); 46 } 47 } 48 void FixedUpdate() 49 { 50 switch (direction) 51 { 52 case DIRECTION_TYPE.STOP: 53 speed = 0; 54 break; 55 case DIRECTION_TYPE.RIGHT: 56 speed = 3; 57 transform.localScale = new Vector3(1, 1, 1); 58 break; 59 case DIRECTION_TYPE.LEFT: 60 speed = -3; 61 transform.localScale = new Vector3(-1, 1, 1); 62 break; 63 } 64 rigidbody2D.velocity = new Vector2(speed, rigidbody2D.velocity.y); 65 } 66 67 void Jump() 68 { 69 rigidbody2D.AddForce(Vector2.up * jumpPower); 70 } 71 72 bool IsGround() 73 { 74 Vector3 leftStartPoint = transform.position - transform.right * 0.3f; 75 Vector3 endPoint = transform.position - transform.up * 0.1f; 76 Vector3 rightStartPoint = transform.position + transform.right * 0.3f; 77 78 // 確認用 79 Debug.DrawLine(leftStartPoint, endPoint); 80 Debug.DrawLine(rightStartPoint, endPoint); 81 82 return Physics2D.Linecast(leftStartPoint, endPoint, blockLayer) || Physics2D.Linecast(rightStartPoint, endPoint, blockLayer); 83 } 84}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/12 10:40
2020/08/12 11:32
2020/08/12 16:48 編集
2020/08/13 23:58