前言
OnMouse事件非常方便好用,但是也存在一些问题
例如:两个对象重叠导致只能点击box在前面的对象,官方方法是将其他对象层级设置为:Ignore Ratycast
但是,如果存在很多个时,就非常麻烦,而且很多时候他们是不能随便乱改。因此我这边重写了他的方法,可以指定层级交互
提示:以下是本篇文章正文内容,下面案例可供参考
使用步骤
1.定义脚本
代码如下(示例):
/*
*脚本名称: OnMouseOverride.cs
*公司名称:
*作者: ChenXiang
*创建时间: 2022-03-07-11:09:26
*Unity版本: 2019.4.16f1
*描述: 重写 OnMouse事件
*
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class OnMouseOverride : MonoBehaviour
{
public LayerMask layerMask;
#region 私有的
private GameObject hitObj;
private RaycastHit hit;
// 进入状态
private bool isEnter;
// 停留状态
private bool isOver;
// 拖拽转态
private bool isDrap;
#endregion
#region 鼠标事件
public virtual void OnMouseEnterOverride()
{
}
public virtual void OnMouseExitOverride()
{
}
public virtual void OnMouseOverOverride()
{
}
public virtual void OnMouseDragOverride()
{
}
public virtual void OnMouseDownOverride()
{
}
public virtual void OnMouseUpOverride()
{
}
public virtual void OnMouseUpAsButtonOverride()
{
}
#endregion
public virtual void Update()
{
// 发出射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// 如果第一次进入,射线对象null
// 射线检测对象是当前对象
if (Physics.Raycast(ray, out hit, 100, layerMask) && hitObj == null)
{
if (hit.transform == transform)
{
hitObj = hit.transform.gameObject;
isEnter = true;
}
}
// 鼠标进入
if (isEnter && hitObj)
{
//Debug.Log("鼠标进入");
OnMouseEnterOverride();
// 设置停留
isOver = true;
isEnter = false;
}
// 鼠标停留
if (isOver && hitObj)
{
// 如果射线检测目标null,则鼠标退出,对象null
// 如果对象存在,并且鼠标持续按下。则设置拖拽
if (Physics.Raycast(ray, out hit, 100, layerMask))
{
// Debug.Log("鼠标停留");
OnMouseOverOverride();
hitObj = hit.transform.gameObject;
// 鼠标持续按下
if (Input.GetMouseButton(0))
{
isDrap = true;
}
if (Input.GetMouseButtonDown(0))
{
//Debug.Log("鼠标按下");
OnMouseDownOverride();
}
if (Input.GetMouseButtonUp(0))
{
//Debug.Log("鼠标在碰撞器上抬起");
OnMouseUpAsButtonOverride();
}
isOver = true;
}
else
{
//Debug.Log("鼠标退出");
OnMouseExitOverride();
hitObj = null;
isOver = false;
}
}
// 鼠标拖拽
if (isDrap)
{
// Debug.Log("鼠标拖拽");
OnMouseDragOverride();
if (Input.GetMouseButtonUp(0))
{
//Debug.Log("鼠标抬起");
OnMouseUpOverride();
isDrap = false;
}
}
}
}
2.创建自己脚本
代码如下(示例):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : OnMouseOverride
{
// 重写OnMousexxx
public override void OnMouseEnterOverride()
{
base.OnMouseEnterOverride();
Debug.Log("进入");
// 自己代码
}
// 重写Update
public override void Update()
{
base.Update();
// 自己代码
}
}