Unity OnMouseXXX触发事件优化


前言

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();
        // 自己代码
    }
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

璐璐怪

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值