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组件,完成。
网友评论