unity中使用SetActive()和gameobject实例化的陷坑总结

  gameobject.SetActive()用于激活或禁用gameobject,常用判断当在A情况下时SetActive(ture)、在B情况下时SetActive(false)。自己多次给自己挖坑,解决办法是public gameobject进行实例化。

1. 临时实例化的gameobject在SetActive(false)后无法再SetActive(ture)

Bug:

   int TapFlag = 1; 
   private void OnTap()
    {
        GameObject canvas = GameObject.Find("canvas3");
        if (TapFlag == 1)
        {
            canvas.SetActive(false);            
            TapFlag = 0;
        }
        else {
            canvas.SetActive(true);
            TapFlag = 1;
        }

修改:将需要SetActive()的gameobject设为public,在Inspector中进行实例化

    public GameObject canvas;
    int TapFlag = 1;
    // Use this for initialization  
    void Start()
    {

    }

    // Update is called once per frame  
    void Update()
    {

    }

    private void OnTap()
    {
        if (TapFlag == 1)
        {
           canvas.SetActive(false);
           TapFlag = 0;
        }
        else {
            canvas.SetActive(true);
            TapFlag = 1;
        }
       
    }


2. public GameObject的好处:同一个脚本控制多个对象的相同类别的childobject/component 时,将脚本分别附给多个对象,在对象自己的Inspector中实例化相应的GameObject。


eg:

这段用于Hololens的代码实现的功能:当视线投射于/离开某个物体时,显示/隐藏该物体的UI信息,场景中有多个带有自己UI信息的物体。

最开始自己将此功能写在GazeManager脚本中,用HitInfo.transform.CompareTag()来判断视线投射的物体以激活响应的UI,蠢哭。

现在是把该脚本附给每一个物体,在各自脚本下实例化各自SetActive的子物体。毕竟拖拽比一个个写CompareTag()或者GameObjcet.Find()简单多了。

public GameObject cchild;

        void Update()
        {
            if (GazeManager.Instance.Hit && this.name == GazeManager.Instance.HitInfo.transform.name)
                {
                    cchild.SetActive(true);
                }
                else
                {
                    cchild.SetActive(false);
                }
           
        }


另:有看到说GameObject.SetActive的CPU开销大,目前自己还了解其它激活/显示物体的方法,有待学习。

你可能感兴趣的:(unity,Hololens)