我有一个脚本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。
为什么我的实例没有保存?我的错误是什么?谢谢!
答案 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>();