MouseEvent

Unity自带的鼠标事件OnMouseEnter等有时会出现灵敏度的问题,可自己用射线重写
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// unity自带的OnMouseEnter,Exit等鼠标事件在移出移入过于密集时不够灵敏,这种情况可以用这个类来做
/// </summary>
public class MouseEvent : MonoBehaviour {
    private Ray ray;
    private RaycastHit hitInfo;

    private Vector3 oldCameraPosition;
    private Vector3 curCameraPosition;
    private Vector3 oldMousePosition;
    private Vector3 curMousePosition;
    private Camera mainCamera;
    private bool cameraFlag;
    private bool mouseFlag;

    GameObject oldObj;
    GameObject curObj;

    public GameObject highLight;

    private void Start()
    {
        mainCamera = Camera.main;
        cameraFlag = false;
        mouseFlag = false;
    }

    private void Update()
    {
        //只有在鼠标移动或者是镜头移动时鼠标对应的物体才会发生改变,通过这两个判断减少射线发射次数
        MosueState();
        CameraState();

        if(mouseFlag != false || cameraFlag != false)
        {
            SenRay();
        }
    }

    private void SenRay()
    {
        ray = mainCamera.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hitInfo, float.MaxValue, LayerMask.GetMask("Cylinder", "UnitRay")))
        {
            //鼠标进入
            

        }
        else if (curObj != null)
        {
            //鼠标移除
            
        }
    }

    #region 判断鼠标位置
    //获取相机状态
    private void CameraState()
    {
        curCameraPosition = mainCamera.transform.position;
        if (curCameraPosition != oldCameraPosition)
        {
            oldCameraPosition = curCameraPosition;
            cameraFlag = true;
        }
        else
        {
            cameraFlag = false;
        }
    }

    //获取相机状态
    private void MosueState()
    {
        curMousePosition = Input.mousePosition;
        if (curMousePosition != oldMousePosition)
        {
            oldMousePosition = curMousePosition;
            mouseFlag = true;
        }
        else
        {
            mouseFlag = false;
        }
    }
    #endregion

    //鼠标进入
    protected virtual void OnMovuseIn()
    {

    }
    //鼠标移出
    protected virtual void OnMovuseOut()
    {

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值