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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

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

Q&A

解決済

3回答

8860閲覧

Unityで複数オブジェクトのふるまいを制御する時のベストプラクティス

gitalin

総合スコア24

Unity

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

0グッド

0クリップ

投稿2019/01/05 18:40

編集2019/01/05 18:47

こんにちわ。

Unity初心者(プログラム初心者)です。

たとえば、シーンにゲームオブジェクトが複数個あって、
UIのボタンをクリックしたら、

・Aタイプのオブジェクトは赤色になる
・Bタイプのオブジェクトは青色になって、星型になる。
・Cタイプのオブジェクトは緑色になって、回転のアニメーションをする
.
.
.

のように、いくつかのタイプに属したオブジェクトがそれぞれタイプに応じた
ふるまいをさせたいのですが、そんなときの効率の良い方法を教えていただきたいです。

初心者なので、とんちんかんな質問をしてしまっているかもしれませんが、
何卒、ご教授のほどお願いいたしますmm


個人的にBroadcastMessageだったり、UniRxだったりを調べてはみたのですが、
いまいちどういう書き方が良いのかがわかりません。

もちろん状況によりけりだとは思うのですが、一般的な定石のようなものがあれば幸いです。

どうかよろしくお願いします。


色々とすみません。

また、そういったUnity開発におけるデザインパターンみたいなものが
参照できるような書籍やサイトなどをご存知の方がいたらお教えいただきたいですmm

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

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

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

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

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

guest

回答3

0

オブジェクトの数が固定であれば、スクリプトで変数を作成しオブジェクトに紐づけてしまうのが一般的かなと思います。

public class Example : MonoBehaviour { GameObject objA; GameObject objB; GameObject objC;

オブジェクトの数が動的に変化する場合は、対象のオブジェクトを特定のオブジェクトの子オブジェクトとして配置し、下記のようにして取得する方法が一般的かと思います。(※動作確認はしていません)

foreach (Transform child in GameObject.Find("親オブジェクト名").transform) { Debug.Log(child.name); }

動的変動の場合は上記方法以外に、作成されたオブジェクトを配列で保持して管理する方法もあります。

投稿2019/01/05 20:38

uya

総合スコア52

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

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

0

ベストアンサー

ベストプラクティスかはわかりませんが,以下のような基底クラスを各タイプのクラスに継承させるのはどうでしょうか.

csharp

1public class ButtonReactObject : MonoBehaviour 2{ 3 [SerializeField] Button _button; 4 5 void Awake() 6 { 7 _button.OnClickAsObservable().Subscribe(_ => OnClick()); 8 } 9 10 protected virtual void OnClick(){} 11}

オブジェクトのタイプごとにクラスを作ってこれを継承し,OnClick()をオーバーライドしてそれぞれのふるまいを書けば,クリック時に全オブジェクトがそれを実行するはずです.

BroadcastMessageと比べると,クリックの検知とその反応をクラス内で完結できるため,オブジェクト管理用のクラスや親オブジェクトを作る必要がありません.また,メソッド名を打ち間違える心配もありません.
ただ,オブジェクトが大量にある場合はパフォーマンスが他の方法より劣るかもしれません(あまりUniRxに詳しくなくて...).

投稿2019/01/06 02:17

Takaya901

総合スコア181

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

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

0

異なる種類のオブジェクトには異なるスクリプトを書いてアタッチする、というのが最もシンプルだと思います。

何が定石か、何がベストプラクティスか、というのはそのプロジェクトの目的、要求や全体像次第ではないでしょうか。
たとえばABCタイプのオブジェクトにアタッチされたスクリプトを同時に取得したり動かしたりということを頻繁に行うなら、親クラスやインターフェースを使うのが便利かもしれません。しかし、たった3種類の、一度しか行わない処理なら、そこまでするのは過剰かもしれません。

さらに、「簡単に書きたい。さっさと作りたい」「読みやすく書きたい」「高速に処理させたい」「テストしやすくしたい」「他のプロジェクトでも流用したい」などの複数の観点もあり、お互いに対立したりします。
まずは自分の知っている方法で書いてみて、もっと〇〇にできないかという具体的な必要性を感じたときにひとつずつ調べて改善していくのがよいのではないでしょうか。

投稿2019/01/06 01:42

negitama

総合スコア943

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問