Unityでprefabを設定する方法(C#)

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • アリの最短経路探索をシミュレートしたい
  • エサが食べられて、なくなってしまった場合ランダムな座標に生成させ、補充したい

前提

ここに質問の内容を詳しく書いてください。
アリの探索経路のシミュレーションをするコードを書いています。
ファイルを超えてインスタンス化した関数を用いようとしたら、その関数の中のInstantiateの引数のprefabがNULLになってしまいました。
どうすれば参照できるようになりますか。

発生している問題・エラーメッセージ

ArgumentException: The Object you want to instantiate is null. UnityEngine.Object.Instantiate (UnityEngine.Object original, UnityEngine.Vector3 position, UnityEngine.Quaternion rotation) (at <10871f9e312b442cb78b9b97db88fdcb>:0) UnityEngine.Object.Instantiate[T] (T original, UnityEngine.Vector3 position, UnityEngine.Quaternion rotation) (at <10871f9e312b442cb78b9b97db88fdcb>:0) FeedGenerator.GenerateRandomFeeds (System.Int32 count) (at Assets/Scripts/FeedGenerator.cs:52) FeedController.SetAmount (System.Single amount) (at Assets/Scripts/FeedController.cs:40) CollisionDetection.OnTriggerEnter (UnityEngine.Collider collider) (at Assets/Scripts/CollisionDetection.cs:19)

該当のソースコード

FeedController.cs

C#

1using System.Collections;2using System.Collections.Generic;3using UnityEngine;4 5public class FeedController : MonoBehaviour 6{7 public float Amount { get; set; }8 public int FeedCount = 5;9 private int eatCount;10 private int id = -1;11 private int DetectorLayer { get; set; }12 private FeedGenerator feedGenerator;13 14 15 16 17 18 [Header("debug"),Multiline(3)]public string debugText = "No Data";19 20 GameObject filelogObject;21 FileLog filelog;22 23 void Start() {24 DetectorLayer = LayerMask.NameToLayer("Dectector");25 eatCount = 0;26 filelogObject = GameObject.Find("FileLog");27 filelog = filelogObject.GetComponent<FileLog>();28 feedGenerator = new FeedGenerator();29 30 }31 32 public void SetAmount(float amount) {33 Amount = amount;34 transform.localScale = new Vector3(Amount / 2.0f, 2.0f, Amount / 2.0f); //大きさは質量に比例35 debugText = $"amount = {amount}\neat num = {eatCount}\n";36 37 if(Amount < 0.0f) {//餌が一定回数食べられたら、餌を削除する38 Destroy(this.gameObject, 1.0f);39 //FeedPrefab = 40 feedGenerator.GenerateRandomFeeds(1);//★41 }42 }43 44 public void AddEatCount(){//餌の食べられた回数を増やす45 eatCount++;46 }47 48 public void SetId(int id){49 this.id = id;50 }51 52 public void OutputToLog(){53 filelog.WriteFeedData(id,eatCount,Time.frameCount);54 }55}56

FeedGenerator.cs

C#

1using System;2using System.Collections;3using System.Collections.Generic;4using UnityEngine;5 6public class FeedGenerator : MonoBehaviour 7{8 [Header("Feed Settings"), SerializeField] private List<FeedItem> feeds = new List<FeedItem>();9 private List<FeedItem> Feeds => feeds;10 //[Header("Feed Settings")]: [Header] 属性はUnityのインスペクタ(Inspector)11 //ウィンドウ内で表示される変数セクションのタイトルを指定します12 13 //SerializeField で、feeds リストをInspectorウィンドウで表示し変更できるようにしています。14 15 [SerializeField] public FeedController FeedPrefab; 16 private int id = 0;17 [SerializeField] private int minFeedsOnField = 5; //フィールド上にあるべき最低のエサの数18 FeedController instance = new FeedController();19 20 void Start()21 {22 GenerateRandomFeeds(minFeedsOnField);23 UnityEngine.Debug.Log(FeedPrefab);24 }25 26 27 void Update(){28 if (instance.FeedCount < minFeedsOnField) 29 {30 GenerateRandomFeeds(1);31 UnityEngine.Debug.Log("エサが追加された");32 }33 }34 35 //★36 public void GenerateRandomFeeds(int count)37 {38 for (int i = 0; i < count; i++)39 {40 Vector3 randomPos = new Vector3(UnityEngine.Random.Range(0f, 150f), 2.36f, UnityEngine.Random.Range(0f, 150f)); //(x,z)が(0,0)~(150,150)のフィールド41 var feed = Instantiate(FeedPrefab, randomPos, Quaternion.identity);42 feed.SetAmount(6.0f); //ここでエサの大きさ!43 feed.SetId(id);44 id++;45 46 FeedItem newFeedItem = new FeedItem 47 {48 prefab = feed,49 transform = feed.transform,50 amount = 6.0f //ここでエサの大きさ!51 };52 53 Feeds.Add(newFeedItem);54 }55 }56 57 58 59 [Serializable]60 private class FeedItem 61 {62 public FeedController prefab = null;63 public Transform transform = null;64 public float amount = 3.0f; //餌の分量。数字が大きいほど餌が多い。65 }66}67

試したこと

[SerializeField] public FeedController FeedPrefab;

これがFeedGenerator.csに記述されているとFeedGeneratorのvoid Startでは関数が機能する。そのため、FeedController.csでも同じようにすれば良いのだろうと思ったが、知識が足りず質問に至っています。

補足情報(FW/ツールのバージョンなど)

Unity 2022.3.8f1

コメントを投稿

0 コメント