赞
踩
鼠标点击3D物体触发,Unity从本质上来说有两种:一种是通过事件(event)触发,一种是通过射线(ray)判断穿过的物体触发。这两种触发的原理是不同的,不论哪种触发都必须满足触发的要求才可以,既然原理不同,触发的要求也不一样,下面详细说明一下3种不同的方式。
Unity版本 5.6.2f Unity API版本 2019.1
参考 Unity API:https://docs.unity3d.com/ScriptReference/EventSystems.EventSystem.html
先了解下接口IPointerClickHandler,这个接树关系是 UnityEngine.EventSystems.Interfaces.IPointerClickHandler,下面看下它还有哪些可以实现的接口
这里用IPointerClickHandler举例(api中这样解释):
也就是在我们的被点击的类中实现了接口后,在实现方法OnPointerClick,在这个方法里操作点击后的处理。
既然是事件,首先满足事件触发的要求:
点击 Add Default… 后出现如图:
到这里,需要我们开发的只有一个脚本,Demo里的EventClick.cs
using UnityEngine;
using UnityEngine.EventSystems;
public class EventClick : MonoBehaviour,IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
print("点击了::"+this.name);
}
}
运行点击cube:
这里也是同过事件来实现的,也要按照 一 里满足事件触发的要求(不懂!往上翻看下):
完成以上两步后,注意也要带触发器(Collider),3就和一里的不一样了。
给EventTrigger添加事件类型,根据需要选择
Demo里选择点击事件PointerClick
给PointerClick添加触发后执行函数
这里的执行函数,是下面我们开发的类ClickEventTrigger.cs,把这个脚本添加到被点击的物体上即可。
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class ClickEventTrigger : MonoBehaviour
{
public void OnClick()
{
print("MyOnClick 点击了::"+this.name);
}
}
到这里,静态添加事件就完成了,运行效果:
动态触发,在Unity编辑器中操作就方便多了,只需要在被点击物体上添加EventTrigger就可以了,然后再把我们的脚本ClickEventTrigger.cs添加到被点击物体上,剩下的都在代码中完成。
using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; public class ClickEventTrigger : MonoBehaviour { // Use this for initialization void Start () { //获取或添加EventTrigger组件 EventTrigger trigger = transform.GetComponent(); if (trigger == null) { trigger = transform.gameObject.AddComponent(); } //初始化EventTrigger.Entry的数组 如果这里初始化了事件触发数组,那么在ide静态添加的事件会丢失 //trigger.triggers = new List(); //创建各种 EventTrigger.Entry的类型 EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = EventTriggerType.PointerEnter;//设置Entry的eventID类型 即EventTriggerType的各种枚举(比如鼠标点击,滑动,拖动等) UnityAction callback = new UnityAction(OnPointerEnter); //注册代理 entry.callback.AddListener(callback);//添加代理事件到EventTrigger.Entry EventTrigger.Entry entry2 = new EventTrigger.Entry(); entry2.eventID = EventTriggerType.PointerDown; UnityAction callback1 = new UnityAction(OnPointerDown); entry2.callback.AddListener(callback1); //在EventTrigger.Entry的数组添加EventTrigger.Entry trigger.triggers.Add(entry); trigger.triggers.Add(entry2); } private void OnPointerDown(BaseEventData arg0) { Debug.Log("OnPointerDown"); } private void OnPointerEnter(BaseEventData arg0) { Debug.Log("OnPointerEnter"); } }
运行结果:
这个方法主要是通过,射线发射,判断射线穿过的物体,根据特定的标志来判断是否点击到了该物体(比如:物体的标签Tag,还有物体的名称)
这里只需要3d物体,并且有明确的唯一标识,再加上我们开发的ClickRayCastHitControl.cs就可以。
运行结果:
完整代码:
using UnityEngine; public class ClickRayCastHitControl : MonoBehaviour { Ray ray; RaycastHit hit; GameObject obj; // Use this for initialization void Start () { } // Update is called once per frame 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("BeiJiChuan")) { Debug.Log("点中" + obj.name); } //通过标签 if (obj.tag == "ClicObj") { Debug.Log("点中" + obj.name); } } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。