Unity 鼠标进入点击3D物体的3种方法

版权声明:记录上工作中的一些问题 https://blog.csdn.net/m0_37583098/article/details/82977523

第一种 OnMouse

在需要检测的物体上  首先物体要有Collider  添加脚本 使用OnMouse系列方法(脚本的enable不影响OnMouse的调用)


    //当鼠标悬停在网格上时,
    void OnMouseEnter()
    {
       
    } 

    // ...当鼠标悬浮在物体上
    void OnMouseOver()
    {
    
    } 

    // ...当鼠标移开时
    void OnMouseExit()
    {
       
    }
 // ...当鼠标点击
    void OnMouseDown()
    {
       
    }
 // ...当鼠标抬起
    void OnMouseUp()
    {
       
    }

//第二种方法 射线检测(首先物体要有Collider 然后挂载脚本)

/************************************************************
  Copyright (C), 2007-2017,BJ Rainier Tech. Co., Ltd.
  FileName: RayCastHitControl.cs
  Author:   Version :1.0       Date: 2018/8/15
  Description:  射线点击
************************************************************/

using UnityEngine;
using System.Collections;

public class RayCastHitControl : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
    Ray ray;
    RaycastHit hit;
    GameObject obj;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("点击鼠标左键");
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit))
            {
                Debug.Log(hit.collider.gameObject.name);
                obj = hit.collider.gameObject;
                //通过名字
                if (obj.name.Equals("BeiJiuChuan"))
                {
                    Debug.Log("点中"+obj.name);
                }
                //通过标签
                if (obj.tag == "move")
                {
                    Debug.Log("点中" + obj.name);
                }
            }
        }
    }
}

//第三种方法  游戏物体 EventTrigger 物体动态事件监听

先说一下 有哪些封装好的公共方法

OnBeginDrag 在拖动开始之前调用。
OnCancel 发生Cancel事件时由EventSystem调用。
OnDeselect 在选择新对象时由EventSystem调用。
ondragDown 每次在拖动期间移动指针时由EventSystem调用。
OnDrop 当对象接受丢弃时由EventSystem调用。
OnEndDrag 拖动结束后由EventSystem调用。
OnInitializePotentialDrag 在找到拖动时,但在有效开始拖动之前由EventSystem调用。
OnMove 发生Move事件时由EventSystem调用。
OnPointerClick 发生Click事件时由EventSystem调用。
OnPointerDown 发生PointerDown事件时由EventSystem调用。
OnPointerEnter 当指针进入与此EventTrigger关联的对象时由EventSystem调用。
OnPointerExit 当指针退出与此EventTrigger关联的对象时,由EventSystem调用。
OnPointerUp 发生PointerUp事件时由EventSystem调用。
OnScroll 当Scroll事件发生时由EventSystem调用。
ONSELECT 当Select事件发生时由EventSystem调用。
OnUpdateSelected 更新与此EventTrigger关联的对象时由EventSystem调用。

然后说一下使用方法

1.通过编辑器中添加

    在Inspector中添加EventTrigger的componnent组件,然后点击Add New Event Type按钮添加一个基本的事件

当我们选择一个事件的时候,就相当于将要于此事件绑定了,例如当我们选择Pointer Click的时候,绑定了这个组件的物体将接受Pointer Click 事件的消息,当我们在物体上按下鼠标的时候,(当然空间中的物体我们是无法通过鼠标点击的,但是当我们可以通过射线碰撞的方法,来实现Pointer Enter,Pointer Exit等事件的触发)这里我们用来绑定这个EventTrigger 的是一个UI Panel 这样便可以让它接受我们自定义的单击事件了

然后脚本方法

/************************************************************
  Copyright (C), 2007-2017,BJ Rainier Tech. Co., Ltd.
  FileName: OnClickMouseDown.cs
  Author:     Version :1.0       Date: 2018/8/15
************************************************************/

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using System.Collections.Generic;
using UnityEngine.Events;

public class OnClickMouseDown : MonoBehaviour
{
  
    void Start()
    {
        //获取或添加EventTrigger组件
        EventTrigger trigger = transform.GetComponent<EventTrigger>();
        if (trigger == null)
        {
            trigger = transform.gameObject.AddComponent<EventTrigger>();
        }
        //初始化EventTrigger.Entry的数组
        trigger.triggers = new List<EventTrigger.Entry>();
        //创建各种 EventTrigger.Entry的类型
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.PointerEnter;//设置Entry的eventID类型 即EventTriggerType的各种枚举(比如鼠标点击,滑动,拖动等)
        UnityAction<BaseEventData> callback =new UnityAction<BaseEventData>(OnEventTrigger);  //注册代理
        entry.callback.AddListener(callback);//添加代理事件到EventTrigger.Entry
        EventTrigger.Entry entry2 = new EventTrigger.Entry();
        entry2.eventID = EventTriggerType.PointerDown;
        UnityAction<BaseEventData> callback1 =new UnityAction<BaseEventData>(OnMouseDown);
        entry2.callback.AddListener(callback1);

        //在EventTrigger.Entry的数组添加EventTrigger.Entry
        trigger.triggers.Add(entry);
        trigger.triggers.Add(entry2);
    }

    private void OnMouseDown(BaseEventData arg0)
    {
        Debug.Log("OnMouseDown");
    }

    private void OnEventTrigger(BaseEventData arg0)
    {
        Debug.Log("OnEventTrigger");
    }
}

最后 别忘了 在摄像机下添加一个Physics Raycaster的组件,用来检测鼠标射线

猜你喜欢

转载自blog.csdn.net/m0_37583098/article/details/82977523