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

unity,Hololens 专栏收录该内容
1 篇文章 0 订阅

  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开销大,目前自己还了解其它激活/显示物体的方法,有待学习。

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

wdear0401

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值