如何保持检查游戏对象是否会在层次结构中统一实例化?

时间:2018-10-19 09:39:12

标签: c# unity3d instantiation

我想一直检查一个游戏对象是否会被实例化,我所拥有的只是游戏对象的名字说'Model'。如果模型在层次结构中处于活动状态,我想做些事情。问题最初是游戏对象不可用。以后只有它会被实例化。如何检查具有名称的游戏对象是否存在于将作为克隆的层次结构中。

if(gameobject.name=="Model(Clone)") { //Do something }

这将返回 null值,因为它最初并未实例化。一段时间后,它将被实例化。

4 个答案:

答案 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;

  • 当尚未实例化Model时,逻辑断言将返回false

    if (Model != null && Model.name == "Model(Clone)"){//return false
        //Do Something
    }
    

  • 使用名称实例化游戏对象。
    Gameobject Model = Instantiate (somePrefab);

  • if需要放置在void update()内,或者像invoke()这样的循环对象中,它将不断检查条件。

  • 当Gameobject Model不为null且游戏对象名为Model(Clone)

    时,它将检查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的功能远不止于此,但这只是帮助您开始使用它的要旨。祝你好运!