Unity脚本之间未保存Unity实例

时间:2017-03-08 13:47:13

标签: c# unity3d

我有一个脚本Planet.cs,如:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class Planet : MonoBehaviour
{
    public string Name { get; set; } 
}

在自定义函数中,我需要生成多个行星,所以我创建了一个新的GameObject,我添加了组件Planet(我的脚本),并将My属性设置为:

        GameObject planet2 = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        planet2.AddComponent<Planet>();

        Planet planetCompo2 = planet2.GetComponent<Planet>();
        planetCompo2.Name = "Planet 2";

如果我检查我的功能结束,所有属性都被设置,如果我检查任何行星的属性名称就可以了。

我的问题是,在另一个脚本中,我试图从带有组件Planet的GameObject获取Planet,但我总是有一个空对象。

示例:this.gameObject.GetComponent<Planet>()this.GetComponent<Planet>()始终为null,其中this是带有Planet Component的GameObject。

为什么我的实例没有保存?我的错误是什么?谢谢!

2 个答案:

答案 0 :(得分:4)

this.gameObject.GetComponent<Planet>()this.GetComponent<Planet>()都是相同的东西,因为他们都试图从此GameObject获取Planet组件脚本附加到

这里需要注意的是this。你指的是这个脚本。当您从另一个脚本执行此操作时,您正在尝试执行Planet函数的此脚本中的GetComponent组件。如果此脚本没有Planet组件,则会获得null。我确信这就是发生的事情。

我建议命名刚刚创建的GameObject:

GameObject planet2 = GameObject.CreatePrimitive(PrimitiveType.Sphere);
planet2.AddComponent<Planet>();
//Name it
planet2.name = "Your Other GameObject";

现在,从另一个脚本中找到GameObject,然后从中访问Planet组件:

GameObject obj = GameObject.Find("Your Other GameObject");
//Now you can do 
Planet planetCompo2 = obj.GetComponent<Planet>();

由于您的Name脚本中已经有变量Planet,因此您可以使用GetComponent [s]编写所有Planet脚本,然后循环浏览它并检查哪个具有名称& #34; Planet 2 &#34;。

Planet planetCompo2 = null;

//Get all Planet components
Planet[] tempComPlanet = GetComponents<Planet>();

//Seatch for which one has the name "Planet 2"
for (int i = 0; i < tempComPlanet.Length; i++)
{
    if (tempComPlanet[i].Name == "Planet 2")
    {
        //Found. Store it to planetCompo2 then exit the loop
        planetCompo2 = tempComPlanet[i];
        break;
    }
}

答案 1 :(得分:1)

在其他脚本中使用关键字“this”将引用该对象,以查找附加到其上的Planet脚本。您应该查找附加了脚本的游戏对象,或者实例化一个。

使用行星脚本将 PlanetObject 等标记应用于您的游戏对象,并使用以下内容:

var planet = GameObject.FindWithTag("PlanetObject").GetComponent<Planet>();