美文网首页
在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