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 Data
とPlayer 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/14 06:31