我想一直检查一个游戏对象是否会被实例化,我所拥有的只是游戏对象的名字说'Model'。如果模型在层次结构中处于活动状态,我想做些事情。问题最初是游戏对象不可用。以后只有它会被实例化。如何检查具有名称的游戏对象是否存在于将作为克隆的层次结构中。
if(gameobject.name=="Model(Clone)")
{
//Do something
}
这将返回 null值,因为它最初并未实例化。一段时间后,它将被实例化。
答案 0 :(得分:1)
如果是我,我会做这样的事情。
List<GameObject> models = new List<GameObject>;
public GameObject baseModel; //Your model
private void CreateModel()
{
GameObject obj = GameObject.Instantiate(baseModel) as GameObject;
models.Add(obj);
}
那样您就可以使用它。
void Update()
{
if(models.Count > 0)
{
//Do Something
}
}
请记住,如果您要销毁该物体,请不要忘记这样做。
private void DestroyModel(GameObject obj)
{
models.Remove(obj);
Destroy(obj);
}
这是将GameObject分配到某处的好习惯。大声笑
答案 1 :(得分:1)
如果您的代码中有一个属性“ gameobject”,导致您提供的代码抛出null异常,请这样做
if(gameobject!=null && gameobject.name=="Model(Clone)")
{
//Do something
}
相反。
如果您无权访问该游戏对象,而只想检测它是否存在,请尝试
var go = GameObject.Find("Model(Clone)");
if(go!=null)
{
//Do something
}
或者如果您的游戏对象具有脚本组件MyScript,则可以
var gos = GameObject.FindObjectsOfType<MyScript>();
if(gos!=null && gos.Length > 0)
{
// foreach(var go in gos) {}
//Do something
}
答案 2 :(得分:1)
Gameobject Model;
if (Model != null && Model.name == "Model(Clone)"){//return false
//Do Something
}
Gameobject Model = Instantiate (somePrefab);
if
需要放置在void update()
内,或者像invoke()
这样的循环对象中,它将不断检查条件。
时,它将检查if并返回true。
if (Model != null && Model.name == "Model(Clone)"){//return true
//Do Something
}
答案 3 :(得分:1)
您最好的选择是使用UnityEvents。
基本上,当您要运行一段代码时,只需将其注册为UnityEvent的侦听器。因此,当您做某事时,说出Instantiate
一个对象,您可以在之后立即Invoke
该UnityEvent,它将运行您注册到它的所有侦听器,无论这些代码在您的何处项目。
首先,您需要立即编写Instantiates
游戏对象和Invokes
UnityEvent的代码(整个内容在一个.cs文件中,顺便说一句):
public class GameObjectSpawner : MonoBehaviour
{
public GameObject GameObjectPrefab;
public GameObjectEvent OnCreateObject;
private void Update()
{
// Everytime you click your left mouse button
// Only runs once per mouse click
if (Input.GetMouseButtonDown(0))
{
// Instantiate the gameobject...
GameObject go = Instantiate(GameObjectPrefab);
// Then immediately Invoke our event to run all the listeners
// and passing our gameobject to them.
OnCreateObject.Invoke(go);
}
}
}
// This is just so the code that 'listens' to the event can get access to the
// gameobject that just got instantiated.
public class GameObjectEvent : UnityEvent<GameObject> { }
因此,如果您的项目中有其他代码需要在游戏对象为Instantiated
时运行,则该代码仅在实例化游戏对象时才运行,而不是之前(除非您手动运行该代码)。将代码注册为OnCreateObject
事件的侦听器非常容易(可以将其保存在其他.cs文件中):
public GameObjectSpawner Spawner;
private void Start()
{
// You can place this anywhere you want to, but we're
// placing this here in Start just to make sure that
// we're already listening waaay before the gameobject
// is instantiated.
Spawner.AddListener(CheckHierarchy)
}
// It doesn't matter if this is public or private,
// as long as it's void and takes in a GameObject as a parameter.
private void CheckHierarchy(GameObject go)
{
// Now we can do all kinds of things to the newly instantiated
// gameobject, like check if it's active in the hierarchy!
if (go.activeInHierarchy == true)
{
Debug.Log("I LIVE!!!");
}
}
UnityEvents的功能远不止于此,但这只是帮助您开始使用它的要旨。祝你好运!