【问题标题】:Cant find component after instantiation实例化后找不到组件
【发布时间】: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 中的代码。它实际上就是实例化。从一开始,它也不是一个很大的项目。让我知道我是否应该提供更好的东西。
  • 如果你正在实例化一个带有Record MonoBehaviour 的对象,它应该会在你调用GetComponent 时立即返回。这将返回 null 的唯一原因是,如果您实例化的对象没有附加脚本。这意味着以下两件事之一:1. 这是 Unity 中的一个严重问题,或者 2. 您在此过程中遗漏了一些东西。我敢打赌它是#2;在任何地方添加调试行并确保您正在实例化并获得正确的预制件。还要确保 Record 行为直接在预制件上设置,而不是添加到脚本中

标签: c# unity3d gameobject


【解决方案1】:

我有两个名为 Record 的类,这就是问题所在。实例化过程是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多