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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

898閲覧

Findを多用するのは正しいか

stmon21811

総合スコア5

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2021/08/11 13:21

イメージ説明

画像のインスペクタにある各スクリプトをリンクする方法に迷っています(黄色い枠)

PLAYERはSECNEビューに初期配置しているGAMEOBJECT ENEMYはInstantiateで読み込んだGAMEOBJECTです

私はこの問題を今のところ GameObject.Find("GAMEOBJECT名")
で解決していますが、よく聞くのは多用するとロード時間が長くなる点や
公式のプログラムを拝見すると(「3D Game Kit)あまり使用していない点を置いても
FINDを使ってリンクするのは最適解ではないような気がしてきました

これからスクリプトをリンクする機会が膨大に増え
もしこの方法が間違っていたら取り返しがつかないので
今のうちに聞いておきたいと思いました

画像のようなケースで
みなさんならどうリンクしますか?

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Findが絶対悪というわけではないですが、多用するのは避けたいです。
また、Findは名前が変わったり対象が非アクティブだと見つけられないのでエラーの温床になる可能性もあります。

今回はEnemy側がPlayerへの参照を持ちたいということですかね?(すいません、画像からあんまり読み取れなかったので間違ってたら言ってください)

他のScriptの構成がわかりませんがInstantiateという記載があるので、EnemyはPrefabから生成される感じですかね? であれば、その生成する人がPlayerの参照を持つことができるかどうかを考えてみるのもよいかと思います。

よくあるのがGameDirectorみたいなのを作って、そいつがPlayerの参照を持ち
敵の生成とかも担当するというような担当窓口みたいな感じで処理を諸々やらせます。
そして、生成するタイミングで自分の知っているPlayerの参照をEnemyにも教えてあげます。

GameDirector.cs

cs

1 2public EnemyData enemyPrefab; 3Player player; 4 5void Start(){ 6 player= GameObject.Find("Player"); // Findじゃなくてもいいです。FindならStart時に1回だけにします 7} 8 9void EnemySpawn(){ 10 11 var _enemy = Instantiate(enemyPrefab); 12 _enemy.SetPlayer(player); // 自分の持っているPlayer参照を、Enemyに教えてあげます 13 14}

EnemyData.cs

cs

1Player player; 2 3public void SetPlayer(Player _player){ 4 player = _player; // 教えてもらった参照を記憶します 5}

あとはこれはやらなくてもいいんですが、Player DataPlayer Moveをうまくまとめられたら渡すデータを1個にできます。中身を統合しろというわけではなくて、上の2つを知っている窓口みたいなのがあれば楽になるかもという感じです。
仮に今後Player関係のComponentが増えたときもPlayer側がコントロールしてるなら問題ないよね的な考え方です

・Player
└ Player Data
└ Player Move

Player.cs

cs

1PlayerData playerData; 2PlayerMove playerMove; 3 4public PlayerData GetPlayerData(){ 5 return playerData; 6} 7 8public PlayerData GetPlayerMove(){ 9 return playerMove; 10} 11

こういう構造ならPlayerの参照さえもっておけば、Playerに「DataとMoveの参照先を教えてよ」とお願いすれば済むという考え方です。

投稿2021/08/12 01:48

編集2021/08/12 01:50
hogefugapiyo

総合スコア3302

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

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

stmon21811

2021/08/14 06:31

hogefugapiyo こちらこそ分かりにくい説明で申し訳ございません そういう観点で設計していくとは、とても為になります ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問