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

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

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

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

Unity

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

Q&A

解決済

3回答

1626閲覧

Unity2Dアクションゲーム・スクリプト・条件分離について

TENNEKO

総合スコア6

C#

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

Unity

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

0グッド

0クリップ

投稿2020/08/14 04:36

前提

Unityで上下左右にダッシュジャンプのようなものができるような2Dアクションゲームを作っています。
条件分離が上手く行きません。

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

Assets\Scripts\PlayerManager.cs(36,49): error CS1513: } expected Assets\Scripts\PlayerManager.cs(37,26): error CS1002: ; expected Assets\Scripts\PlayerManager.cs(44,50): error CS1513: } expected Assets\Scripts\PlayerManager.cs(45,25): error CS1002: ; expected

該当のソースコード

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 float jumpdashPower = 400; 21 22 void Start() 23 { 24 rigidbody2D = GetComponent<Rigidbody2D>(); 25 } 26 27 void Update() 28 { 29 float x = Input.GetAxis("Horizontal"); 30 if (x == 0) 31 { 32 direction = DIRECTION_TYPE.STOP; 33 } 34 else if (Input.GetKey("space") && (x > 0)) 35 { 36 direction = DIRECTION_TYPE.LEFTJUMP; 37 else (x < 0) 38 { 39 direction = DIRECTION_TYPE.LEFT; 40 } 41 } 42 else if (Input.GetKey("space") && (x < 0)) 43 { 44 direction = DIRECTION_TYPE.RIGHTJUMP; 45 else (x > 0) 46 { 47 direction = DIRECTION_TYPE.RIGHT; 48 } 49 } 50 51 if (Input.GetKey("up")) 52 { 53 if (Input.GetKeyDown("space")) 54 { 55 Jump(); 56 } 57 } 58 if (Input.GetKey("down")) 59 { 60 if (Input.GetKeyDown("space")) 61 { 62 DownJump(); 63 } 64 } 65 } 66 67 void FixedUpdate() 68 { 69 switch (direction) 70 { 71 case DIRECTION_TYPE.STOP: 72 speed = 0; 73 break; 74 case DIRECTION_TYPE.RIGHT: 75 speed = 3; 76 transform.localScale = new Vector3(1, 1, 1); 77 break; 78 case DIRECTION_TYPE.LEFT: 79 speed = -3; 80 transform.localScale = new Vector3(-1, 1, 1); 81 break; 82 case DIRECTION_TYPE.RIGHTJUMP: 83 speed = 30; 84 transform.localScale = new Vector3(1, 1, 1); 85 break; 86 case DIRECTION_TYPE.LEFTJUMP: 87 speed = -30; 88 transform.localScale = new Vector3(-1, 1, 1); 89 break; 90 } 91 rigidbody2D.velocity = new Vector2(speed, rigidbody2D.velocity.y); 92 } 93 94 void Jump() 95 { 96 rigidbody2D.AddForce(Vector2.up * jumpPower); 97 } 98 void DownJump() 99 { 100 rigidbody2D.AddForce(Vector2.down * jumpPower); 101 } 102 103 104 bool IsGround() 105 { 106 Vector3 leftStartPoint = transform.position - transform.right * 0.3f; 107 Vector3 endPoint = transform.position - transform.up * 0.1f; 108 Vector3 rightStartPoint = transform.position + transform.right * 0.3f; 109 110 // 確認用 111 Debug.DrawLine(leftStartPoint, endPoint); 112 Debug.DrawLine(rightStartPoint, endPoint); 113 114 return Physics2D.Linecast(leftStartPoint, endPoint, blockLayer) || Physics2D.Linecast(rightStartPoint, endPoint, blockLayer); 115 } 116}

実現したいこと

方向キー+スペースキーでその方向にダッシュジャンプのようなものを行えるようにしたいです。
また、設置判定を用いて地面にいる際に行うジャンプと空中にいる際のジャンプを分けて実行し、モーションなどを分けたいです。

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

初めは上下左右のジャンプと同じように↓

void Jump() { rigidbody2D.AddForce(Vector2.up * jumpPower); } void DownJump() { rigidbody2D.AddForce(Vector2.down * jumpPower); }

左右のダッシュジャンプも行おうと思っていたのですがx軸はrigidbodyを使わずにプレイヤーを動かしているため↓

rigidbody2D.velocity = new Vector2(speed, rigidbody2D.velocity.y);

上手く動作してくれず左右の移動と同じような形で瞬間的にspeedを上げる方法にすることにしました。

Unityのバージョンは2019.3.12
初心者なので優しく教えていただけると嬉しいですm(__)m

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

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

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

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

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

Yukirr4_

2020/08/14 05:08

エラーを見てみるとコンパイラエラーに見えるのですが、 ゲームはプレイできる状態なのでしょうか。
TENNEKO

2020/08/15 00:19

出来ない状況です。
guest

回答3

0

コンソール上で、エラーをダブルクリックするとそのエラー箇所まで誘導してくれます。

コード中に};をつけ忘れているので、修正する必要があります。

とりあえず、エラー文をダブルクリック→選択された部分を確認→;がなければ追加、という流れで治せると思います。

投稿2020/08/15 01:30

Yukirr4_

総合スコア728

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

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

0

ベストアンサー

基本的な文法を学習してください。
例えば下記の部分ですが

C#

1 if (x == 0) 2 { 3 direction = DIRECTION_TYPE.STOP; 4 } 5 else if (Input.GetKey("space") && (x > 0)) 6 { 7 direction = DIRECTION_TYPE.LEFTJUMP; 8 else (x < 0) 9 { 10 direction = DIRECTION_TYPE.LEFT; 11 } 12 }

多分、
X = 0の時はdirection = DIRECTION_TYPE.STOP
スペースが押されていてx > 0の時はdirection = DIRECTION_TYPE.LEFTJUMP
スペースが押されていなくて、x > 0の時はdirection = DIRECTION_TYPE.LEFT
とするといったことを書きたかったのだと思います。

if文は

C#

1if(条件1) 2{ 3 // 条件1を満たした場合実行される 4} 5else if(条件2) 6{ 7 // 条件1を満たさず、条件2を満たした場合実行される 8} 9else if(条件3) 10{ 11 // 条件1、2を満たさず、条件3を満たした場合実行される 12} 13else 14{ 15 // 条件を全て満たさなかった場合に実行される 16}

という構文になります。

ですので、提示されたソースのelse ifの中にあるelseが突然出てくることになります。
elseifとセットで利用するものなのでエラーとなっています。
コードブロックについても学習された方がいいかもしれません。

また、条件をもっと簡潔に纏めるように整理した方がいいと思います。
多分書きたかったのは下記のような条件だと思います。

C#

1if (x == 0) 2{ 3 direction = DIRECTION_TYPE.STOP; 4} 5else if (Input.GetKey("space")) 6{ 7 if(x > 0) 8 { 9 direction = DIRECTION_TYPE.LEFTJUMP; 10 } 11 else 12 { 13 direction = DIRECTION_TYPE.RIGHTJUMP; 14 } 15} 16else 17{ 18 if (x > 0) 19 { 20 direction = DIRECTION_TYPE.LEFT; 21 } 22 else 23 { 24 direction = DIRECTION_TYPE.RIGHT; 25 } 26} 27

投稿2020/08/15 00:53

YAmaGNZ

総合スコア10222

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

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

TENNEKO

2020/08/15 02:09

親切にどうもありがとうございました。 理解できました。もう少し、学んでみます。
guest

0

エラーメッセージの通りです。
36行目と44行目に}がなく突然elseが、
37行目と45行目に末尾の;無しで式が書かれているためコンパイルエラーだと言っています。

elseifの書き間違いだったとしても、条件式はその箇所では絶対に成立することのないもの(外側のelse ifとxの符号が逆になっている)が書かれています。

投稿2020/08/14 05:57

編集2020/08/14 06:36
SHOMI

総合スコア4079

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

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

TENNEKO

2020/08/15 00:52 編集

具体的にはどのように修正すれば良いでしょうか。 }や;がない部分が見つけられなくて。 少し書き直してみたのですがやはり治りません。 void Update() { float x = Input.GetAxis("Horizontal"); if (x == 0) { direction = DIRECTION_TYPE.STOP; } else if (Input.GetKey("space") && (x > 0)) { direction = DIRECTION_TYPE.LEFTJUMP; } else if (Input.GetKey("space") && (x < 0)) { direction = DIRECTION_TYPE.RIGHTJUMP; } else (x < 0) { direction = DIRECTION_TYPE.LEFT; } else (x > 0) { direction = DIRECTION_TYPE.RIGHT; } if (Input.GetKey("up")) { if (Input.GetKeyDown("space")) { Jump(); } } if (Input.GetKey("down")) { if (Input.GetKeyDown("space")) { DownJump(); } } }
TENNEKO

2020/08/15 01:44

追伸 書き直してたら{や;のエラーは消えましたが、別のエラーが出ました。 Assets\Scripts\PlayerManager.cs(36,40): error CS0117: 'PlayerManager.DIRECTION_TYPE' does not contain a definition for 'LEFTJUMP' Assets\Scripts\PlayerManager.cs(40,40): error CS0117: 'PlayerManager.DIRECTION_TYPE' does not contain a definition for 'RIGHTJUMP' Assets\Scripts\PlayerManager.cs(81,33): error CS0117: 'PlayerManager.DIRECTION_TYPE' does not contain a definition for 'RIGHTJUMP' Assets\Scripts\PlayerManager.cs(85,33): error CS0117: 'PlayerManager.DIRECTION_TYPE' does not contain a definition for 'LEFTJUMP' void Update() { float x = Input.GetAxis("Horizontal"); if (x == 0) { direction = DIRECTION_TYPE.STOP; } else if (Input.GetKey("space") && (x > 0)) { direction = DIRECTION_TYPE.LEFTJUMP; } else if (Input.GetKey("space") && (x < 0)) { direction = DIRECTION_TYPE.RIGHTJUMP; } else if (x < 0) { direction = DIRECTION_TYPE.LEFT; } else if (x > 0) { direction = DIRECTION_TYPE.RIGHT; } else if (Input.GetKey("up")) { if (Input.GetKeyDown("space")) { Jump(); } } else if (Input.GetKey("down")) { if (Input.GetKeyDown("space")) { DownJump(); } } }
YAmaGNZ

2020/08/15 02:16

エラーメッセージを翻訳するなりして意味を理解するようにしましょう。 例えば、「'PlayerManager.DIRECTION_TYPE' does not contain a definition for 'LEFTJUMP'」を翻訳すると 「「PlayerManager.DIRECTION_TYPE」には「LEFTJUMP」の定義が含まれていません」となります。 LEFTJUMPはちゃんと定義していますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問