【发布时间】:2020-02-25 21:44:30
【问题描述】:
下面的代码给了我一个错误,因为在 prefab 中没有找到 Record,GetComponent 返回 null。但是在这个方法运行之后,游戏对象无论如何都会出现在层次结构中,我可以看到它上面有一个记录脚本。它附加到预制件的根游戏对象。它没有孩子。
// SETUP CLASS
private void LoadTracksAndSpawnRecords()
{
var tracks = TrackAndRecordLoading.Load ( PathToAudio, SettingsFile, () => gameObject.AddComponent<Track> () );
var records = TrackAndRecordLoading.GetRecordPrefabs ( tracks );
trackManager = new TrackManager ( tracks );
}
// LOADER CLASS
public static List<GameObject> GetRecordPrefabs( List<Track> tracks )
{
var recordPrefabs = new List<GameObject> ();
foreach ( var track in tracks )
{
// This returns the correct prefab
var prefab = SpawnPrefab.Instance.Spawn ( Prefabs.DynamicRecord );
// This is null. Even though the inspector shortly after this line shows
// the GO in hierarchy and it has Record script
var record = prefab.GetComponent<Record> ();
record.track = track;
recordPrefabs.Add ( prefab );
}
return recordPrefabs;
}
// INSTANTIATE
public GameObject Spawn( string PrefabName )
{
// This returns the correct prefab
var prefab = Resources.Load<GameObject> ( Prefabs.PathToPrefabsFolder + PrefabName );
// This returns an clone. When visible in inspectors it has the "(Clone)" added // to its name
return GameObject.Instantiate ( prefab, new Vector3 ( 0, 0, 0 ), Quaternion.identity );
}
【问题讨论】:
-
是预制件上的记录还是有另一个添加记录组件的脚本?
-
记录在预制件上。所以什么都不需要做。我是否正确理解了 Instantiate 被调用和执行的那一刻,它应该可以从下一行获得?
-
好吧.. 即使对点使用 converttoentity,我也可以生成一些东西并在下一行获取组件,所以,是的,你需要提供一个 minimal reproducible example 来重新创建这个以说明原因它不工作
-
我已经更新了 OP 中的代码。它实际上就是实例化。从一开始,它也不是一个很大的项目。让我知道我是否应该提供更好的东西。
-
如果你正在实例化一个带有
RecordMonoBehaviour 的对象,它应该会在你调用GetComponent时立即返回。这将返回 null 的唯一原因是,如果您实例化的对象没有附加脚本。这意味着以下两件事之一:1. 这是 Unity 中的一个严重问题,或者 2. 您在此过程中遗漏了一些东西。我敢打赌它是#2;在任何地方添加调试行并确保您正在实例化并获得正确的预制件。还要确保Record行为直接在预制件上设置,而不是添加到脚本中
标签: c# unity3d gameobject