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

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

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

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

Unity

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

Q&A

解決済

2回答

1097閲覧

Unity C# 次のようなエラーが出ています。 error, ',' expected

kakashi4310

総合スコア11

C#

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

Unity

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

0グッド

0クリップ

投稿2021/08/09 06:19

編集2021/08/09 06:27

Unityを勉強し始めたばかりの初心者です。
被弾したときに左右に振動するというコードを書いてみたのですが、次のようなエラーが出ました。

Assets\Script\Enemy1System.cs(15,40): error CS1003: Syntax error, ',' expected

コードは下記のようなものです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Enemy1System : MonoBehaviour 6{ 7 public GameObject target; 8 [SerializeField] float speed; 9 10 public GameObject effectPrefab; 11 public int enemyHP; 12 13 private IEnumerator shakeCoroutine() 14 { 15 while (OnTriggerEnter(Collider other) | OnTriggerStay(Collider other)) 16 { 17 Vector3 pos = this.gameObject.transform.position; 18 this.gameObject.transform.position = new Vector3(pos.x + 1, pos.y, pos.z); 19 20 21 for (int waitLoop = 0; waitLoop < 1.0f; waitLoop++) 22 { 23 yield return new WaitForFixedUpdate(); 24 } 25 26 Vector3 pos = this.gameObject.transform.position; 27 this.gameObject.transform.position = new Vector3(pos.x - 1, pos.y, pos.z); 28 29 30 for (int waitLoop = 0; waitLoop < 1.0f; waitLoop++) 31 { 32 yield return new WaitForFixedUpdate(); 33 } 34 } 35 } 36 37 private void Start() 38 { 39 40 } 41 42 private void OnTriggerEnter(Collider other) 43 { 44 if (other.gameObject.CompareTag("Beam")) 45 { 46 StartCoroutine(shakeCoroutine()); 47 48 enemyHP -= 1; 49 50 if (enemyHP == 0) 51 { 52 Destroy(transform.root.gameObject); 53 54 } 55 } 56 } 57 58 private void OnTriggerStay(Collider other) 59 { 60 if (other.gameObject.CompareTag("Beam")) 61 { 62 StartCoroutine(shakeCoroutine()); 63 64 enemyHP -= 1; 65 66 if (enemyHP == 0) 67 { 68 Destroy(transform.root.gameObject); 69 } 70 } 71 } 72 73 void Update() 74 { 75 transform.position = Vector3.MoveTowards(transform.position, target.transform.position, speed); 76 } 77}

どこを直せばよいか分からず困っています。直すべきところを教えてほしいです。

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

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

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

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

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

y_waiwai

2021/08/09 06:24

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、いらぬ翻訳省略しないで、出たそのママをコピペで提示してください
guest

回答2

0

ベストアンサー

前回の質問を理解されなかったみたいですね。
まあ、私が教えるのが下手なのもあるので、威張って言うことではないですが。

C#

1 while (OnTriggerEnter(Collider other) | OnTriggerStay(Collider other))

そもそも、OnTriggerEnter()やOnTriggerStay()はこのように呼び出すものではありません。
これらの関数は、接触されたときに自動に呼ばれる関数です。

また、OnTriggerStay()でのStartCoroutine(shakeCoroutine());は不要どころか、正しくありません。
これだと、接触中はOnTriggerStay()が呼び出され続けるので、その度にshakeCoroutine()が開始され、大量のshakeCoroutine()が実行されることになります。

私が前回の回答で意図したところは、以下の通りですが、全く出来ていません。

  1. OnCollisionEnter()が呼び出されたときにisCollisionをtrueにしてshakeCoroutine()を開始させる
  2. isCollisionがtrueの間、shakeCoroutine()が常に実行され続ける
  3. OnCollisionExit()が呼び出されたときにisCollisionをfalseにする
  4. isCollisionがfalseになったので、ループから抜け、shakeCoroutine()は終了する

OnCollisionEnter()やOnCollisionExit()については、OnTriggerEnter()などでも同じです。
なので、whileの中身はisCollisionですし、StartCoroutine(shakeCoroutine());もOnCollisionEnter()のみでOnCollisionStay()では呼び出していません。

さらに、waitLoopの指定は秒数ではなく(FixedUpdate()での)フレーム数です。

「コードで書いてあるからコピペでいいや」ではなく、できるだけ中身を理解してから使うようにしてください。

投稿2021/08/09 07:00

fiveHundred

総合スコア10152

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

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

0

そのエラー解決だけで終わらなそうですが、
該当エラーだけを解決したい場合は15行目の下記の部分を書き換えて下さい。

C#

1while (OnTriggerEnter(Collider other) | OnTriggerStay(Collider other))

C#

1while (OnTriggerEnter(other) | OnTriggerStay(other))

補足

上記で質問のエラーは解消されると思いますが新たに下記の問題が出てきます

・otherがメンバー・ローカルに定義されていないのでThe name 'other' does not exist in the current contextの様なエラーが出る

・そもそもOnTriggerEnterOnTriggerStayはboolを返さない上、接触時に自動で実行される関数なのでこういう使い方は出来ない

OnTriggerEnterOnTriggerStayでのshakeCoroutine呼び出しが複数回実行される可能性があるので過度の処理負荷とバグが予想される

一つ前の質問の内容を実装されているとは思いますが内容を理解した上で改変していくか、
判らない場合は出来るだけ書き換えないよう実装していくと良いと思います

投稿2021/08/09 07:04

編集2021/08/09 07:10
Hawn

総合スコア1222

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

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

Hawn

2021/08/09 07:15

ほぼ同じ回答を書いてしまったので細かい修正があるようならfiveHundredさんに聞いて貰った方が良いです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問