원본 주소 : HTTP : //blog.sina.com.cn/s/blog_c3e21e750102yfnm.html
Unity3D- 3D는 클릭 이벤트를 추가하는 장면에서 객체
![이 블로그는 사진을 포함](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
Unity3D - 3D는 마우스 클릭 이벤트를 추가하는 장면에서 객체
개체를 클릭하는 3D 마우스가 본질적으로, 유니티를 실행하는 데, 두 가지가있다 : 하나 하나가 객체 (선) 판단을 통과하는 방사선에 의해 트리거, 트리거 이벤트 (이벤트)을 통해서이다. 이 두 가지 원칙 트리거는 트리거하기 전에 트리거가 다른 원칙 때문에, 요구 사항 트리거는 세 가지 방법의 상세한 설명, 동일하지 않습니다, 충족해야하는지에 상관없이, 차이가 없습니다.
유니티 버전 5.6.2f 유니티 API 버전 2019.1
먼저, 이벤트를 통해, 인터페이스 IPointerClickHandler를 구현
인터페이스 IPointerClickHandler 처음에 달성 할 수있는 다른 어떤 인터페이스 아래에 보면,이 나무의 관계가 UnityEngine.EventSystems.Interfaces.IPointerClickHandler이며, 이해
이 이벤트이기 때문에, 우선은 이벤트 트리거의 요구 사항을 충족 :
1. 장면 카메라에 PhysicsRaycaster 스크립트를 추가합니다.
작동 2. 그림과 같이, 현장에서의 EventSystem 시스템 이벤트를 추가 :
그림은 기본 추가를 클릭 한 후 나타납니다 ... :
3. 여기에 초점이 설정은 객체 (3D) 개체를 클릭 플립 플롭 (충돌 장치)를 가지고, 다음을 클릭 물체에 매달려 스크립트를 클릭해야합니다.
using UnityEngine;
using UnityEngine.EventSystems;
public class EventClick : MonoBehaviour,IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
print("点击了::"+this.name);
}
}
运行点击cube:
二、通过事件,附加脚本EventTrigger
这里也是同过事件来实现的,也要按照 一 里满足事件触发的要求(不懂!往上翻看下):
1.给场景中的Camera添加PhysicsRaycaster脚本。
2.在场景中添加事件系统EventSystem;
完成以上两步后,3就和一里的不一样了。
3.这里有两种做法,分别是3.1 和 3.2 ,只是在用法上不同,原理是一样的。
首先给被点击的物体添加EventTrigger脚本。
3.1,是静态添加事件触发
给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);
}
}
到这里,静态添加事件就完成了,运行效果:
3.2,是动态添加事件触发
动态触发,在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");
}
}
运行结果:
三、通过射线,RayCastHitControl
这个方法主要是通过,射线发射,判断射线穿过的物体,根据特定的标志来判断是否点击到了该物体(比如:物体的标签Tag,还有物体的名称)
这里只需要3d物体,并且有明确的唯一标识,再加上我们开发的ClickRayCastHitControl.cs就可以。
1.在场景中创建一个物体(Cube),然后点击Inspector面板下Tag - AddTag...- 在Tags列表中,点击+,输入你要添加的Tag名称就可以。创建Tag完成后,回到场景给这个Cube选择刚才创建的Tag。
2.在创建一个Cube,demo中起名(BeiJiChaun),这个名字就是射线穿过判断的标识,这个物体就创建完成了。
3.创建单独层,挂载我们开发的脚本即可。
运行结果:
完整代码:
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);
}
// 레이블로
경우 (obj.tag == "ClicObj")
{
debug.log를 ( "포인트"+ obj.name);
}
}
}
}
}