🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

2回答

657閲覧

OnTriggerEnter2D内の記述の分け方について

kanata_02

総合スコア25

C#

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

Unity

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

0グッド

0クリップ

投稿2019/10/11 14:20

現在Unityにてキャラクターを移動させ、落ちてきたアイテムを拾いスコアを稼ぐゲームを作成しています。
この落ちてくるアイテムがほかのオブジェクトに接触したときの記述を、 OnTriggerEnter2Dを利用してプレイヤーにアタッチしているスクリプトとアイテムにアタッチしているスクリプトに二分して書いているのですが、どうにもまとまりがないコードになってしまっているように感じます。
どれも落ちてきたアイテムに関する記述なのでアイテム側のスクリプトにまとめて書いてしまったほうがいいのでしょうか?
それとも、当たり判定に関する処理だけを記述した他クラスを作ったほうが良いのでしょうか?

その他こうしたほうが分かりやすい、というやり方がありましたらアドバイスいただけますと幸いです。何卒よろしくお願いいたします。

C#

1//プレイヤーにアタッチしているスクリプト 2void OnTriggerEnter2D(Collider2D collision) 3 { 4 //プレイヤーがゲームオーバーになっていなければアイテムとの当たり判定を取る 5 if (!_gameOver) 6 { 7 if (collision.gameObject.tag == "Meron") 8 { 9 _meron.PlayOneShot(_meron.clip); 10 //メロンのアイテムと当たったらスコア加算 11 StartCoroutine(uiController.PlusScoreSetActive(10)); 12 scorecontroller.ScorePlus(collision.gameObject); 13 Destroy(collision.gameObject); 14 } 15 16 if (collision.gameObject.tag == "SpecialMeron") 17 { 18 _specialMeron.PlayOneShot(_specialMeron.clip); 19 StartCoroutine(uiController.PlusScoreSetActive(100)); 20 scorecontroller.ScorePlus(collision.gameObject); 21 modeManager.MaxMode = true; 22 modeManager.ItemDrop = false; 23 Destroy(collision.gameObject); 24 } 25 } 26 }

C#

1//アイテムにアタッチしているクリプト 2void OnTriggerEnter2D(Collider2D collision) 3 { 4 //床より下に行ったら削除 5 if (collision.gameObject.tag == "DestroyFloor") 6 { 7 Destroy(gameObject); 8 } 9 10 switch (_item_type) 11 { 12 case ITEM_TYPE.MERON_TYPE: 13 //アイテムが床についたらゲームオーバー 14 if(!_modeManager.MaxMode && _modeManager.ItemDrop ) { 15 if (collision.gameObject.tag == "Floor") 16 { 17 _bad.PlayOneShot(_bad.clip); 18 _playerController.GameOver = true; 19 } 20 } 21 break; 22 case ITEM_TYPE.ONIGIRI_TYPE: 23 //プレイヤーに当たったらゲームオーバー 24 if (collision.gameObject.tag == "Player") 25 { 26 _bad.PlayOneShot(_bad.clip); 27 _playerController.GameOver = true; 28 } 29 //床についたら削除 30 if (collision.gameObject.tag == "Floor") 31 { 32 Destroy(gameObject); 33 } 34 break; 35 } 36 }

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

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

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

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

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

guest

回答2

0

ベストアンサー

恐らくですが、

if (collision.gameObject.tag == "Meron")

みたいな感じで、これから落下物が増えていくと、無為にif文判定が増える事を危惧してるように見受けられます。
そのために、落下物1つに対し、1スクリプトを作る事をおすすめします。

仮に落下物がゲーム性に合わないため、削除するとしたときに、そのスクリプト内だけに影響範囲を留めてしまえば、他ソースとの依存関係が無くなるので、廃棄が楽になります。
廃棄が楽=依存性が少ない=保守が楽になる。という感じです。

投稿2019/10/11 14:47

hermit19901127

総合スコア368

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

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

kanata_02

2019/10/12 11:42

確かにスクリプトを分けたほうが変更の際便利ですね。今回はアイテムの数も少ないためそのようにしてみます。 scorecontrollerなどの部分がどこからでもアクセスできるようになっていないため、このあたりのスクリプトの在り方も考え直してみたいと思います。 大変親切に回答してくださいましてありがとうございました!
hermit19901127

2019/10/16 16:37

だいぶ手遅れかもしれませんが… どこからでもアクセスしたい場合、 「シングルトン」を用いる方法があります。 http://albatrus.com/main/unity/7517 これ以外にも、似たような概念をUnityの設定で条件に合うC#スクリプトに付与する機能があった気がします(自信はない…)ですが、そこは失念いたしました…
guest

0

ソースを見る限り
・メロン(Meron.cs)
・スペシャルメロン(SpMeron.cs)
・オニギリ(Onigiri.cs)

の3種類のアイテムがあるように見受けられるので、
ソースは増えますが、これら3つのスクリプトを、右記の通りのCS名で個別に作るのはどうか?と提案します。

そのうえで、
・scorecontroller
・modeManager
これらが、「どこからでもアクセスできる」ものであれば、
プレイヤー部分で現状判定してる処理を、上記3つのスクリプトに隔離したほうが、
「メロンがプレイヤー接触を感知した」
「スペシャルメロンがプレイヤー接触を感知した」
「おにぎりがプレイヤー接触を管理した」
と、ファイル事にプレイヤーの接触処理を分けられるので、見通しがよくなるかもしれないです。

投稿2019/10/11 14:32

hermit19901127

総合スコア368

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問