【问题标题】:C#/Unity Instantiating class creating copies with same instance ID of 0C#/Unity 实例化类创建具有相同实例 ID 0 的副本
【发布时间】:2021-06-25 22:01:01
【问题描述】:

下面的函数应该创建SolarSystem_Manager 的新实例并将其添加到列表中,但是当var clone = Instantiate(_solar) 运行时,它会返回nullreference 错误。当我创建多个时,_solar 的所有实例都具有相同的 ID,这是 0,并且更改一个的变量也会更改其他的变量。你知道我做错了什么吗?

private void createSolarSystem()
         {
             SolarSystem_Manager _solar = new SolarSystem_Manager();
             _solar.solarSystem = new SolarSystem(transform.GetComponent<Galaxy>(), Random.Range(9, 10), new List<LQPlanetManager>(), new SunManager());
             var clone = Instantiate(_solar);
             solarSystems.Add(clone);
         }

【问题讨论】:

  • 请提供更多关于您的其他课程的详细信息。太阳能系统管理器是 UnityEngine.Object 吗?实例化仅适用于 UnityEngine.Object 类型。至于更改所有“副本”中的变量更改,这些副本必须使用相同的 ref 实例来存储数据。
  • 如果SolarSystem_ManagerUnityEngine.Object(我猜是MonoBehaviour)类型你不能使用new 来创建它!你应该得到一个警告

标签: c# class unity3d nullreferenceexception instantiation


【解决方案1】:

您不应该使用 new 关键字来实例化 Unity 对象。您应该在编辑器中制作 SolarSystem_Manager 的预制件并将其存储在某个变量中:

  1. 将此添加到您的课程中:

    [SerializeField] private GameObject _solarSystemManagerPrefab;

  2. 在编辑器中,创建一个预制件并将其拖放到_solarSystemManagerPrefab

  3. 现在您可以像这样实例化您的预制件:

    GameObject clone = Instantiate(_solarSystemManagerPrefab)

【讨论】:

    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多