美文网首页
在Unity中的UI交互中,如何避免与UI背后的对象接触?

在Unity中的UI交互中,如何避免与UI背后的对象接触?

作者: f229e9496244 | 来源:发表于2019-03-06 15:20 被阅读0次

    Youtube上的一个视频阐述了一共有三种解决方案:
    https://www.youtube.com/watch?time_continue=75&v=EVZiv7DLU6E

    创建如下图所示的场景:


    在Cube上的脚本片段如下所示:

    private bool IsRed;
    private Color oldColor;
    
    public void Start()
    {
        oldColor = GetComponent<Renderer>().material.color;
    }
    
    public void OnMouseDown()
    {
        IsRed = !IsRed;
        if (IsRed)
        {
            GetComponent<Renderer>().material.color = Color.red;
        }
        else
        {
            GetComponent<Renderer>().material.color = oldColor;
        }
    }
    

    运行程序,当鼠标点击方块时,方块颜色变红:


    但是,透过UI也会让方块变红,有些时候,我们不希望这样,下面有三种解决方案:

    方法一:使用Unity.Event来处理

    在鼠标的点击触发代码块中,加上一条判断语句,这条语句可以判断当前是否点击到UI元素上:

    public void OnMouseDown()
    {
        //添加判断语句
        if (!EventSystem.current.IsPointerOverGameObject())
        {
           IsRed = !IsRed;
           if (IsRed)
           {
               GetComponent<Renderer>().material.color = Color.red;
           }
           else
           {
               GetComponent<Renderer>().material.color = oldColor;
           }
        }
    }
    

    其结果如下:


    方法二:使用EventTrigger来处理

    在交互的物体上添加Event Trigger组件,但是源代码中不再使用mono脚本的回调函数OnMouseDown():

    private bool IsRed;
    private Color oldColor;
    
    
    public void MouseDown()  //这里是自定义的一个返回值为空的函数,不再使用回调函数
    {
        IsRed = !IsRed;
        if (IsRed)
        {
            GetComponent<Renderer>().material.color = Color.red;
        }
        else
        {
            GetComponent<Renderer>().material.color = oldColor;
        }
    }
    

    同时在cube上添加Event Trigger组件,配置如下:


    接着需要在相机上添加一个Physics Raycaster组件:



    最终 效果和1相同;

    方法三:应该是最好的办法了,使用 Event System Interfaces

    同样,也是需要引用UnityEngine.EventSystems;
    让脚本实现相关接口,代码如下:

    public class test : MonoBehaviour,IPointerClickHandler  //实现接口
    {
        private bool IsRed;
    
        private Color oldColor;
    
        private IPointerClickHandler _pointerClickHandlerImplementation;
    
        // Start is called before the first frame update
        void Start()
        {
            oldColor = GetComponent<Renderer>().material.color;
        }
    
        //将变红功能的代码块放在这个函数中
        public void OnPointerClick(PointerEventData eventData)
        {
            IsRed = !IsRed;
            if (IsRed)
            {
                GetComponent<Renderer>().material.color = Color.red;
            }
            else
            {
                GetComponent<Renderer>().material.color = oldColor;
            }
        }
    }
    

    同时,还需要在相机组件上添加 Physics Raycaster组件,完成。

    参考文章:
    http://www.arkaistudio.com/blog/2016/05/19/unity-ugui-%E5%8E%9F%E7%90%86%E7%AF%87%E5%9B%9B%EF%BC%9Aevent-system-manager-%E4%BA%8B%E4%BB%B6%E8%88%87%E8%A7%B8%E7%99%BC/

    相关文章

      网友评论

          本文标题:在Unity中的UI交互中,如何避免与UI背后的对象接触?

          本文链接:https://www.haomeiwen.com/subject/bjatpqtx.html