目录
一.OnMouse
二.射线检测(首先物体要有Collider 然后挂载脚本)
三.游戏物体 EventTrigger 物体动态事件监听
3.1 静态添加事件触发
3.2 动态添加事件触发
四.通过事件,实现接口IPointerClickHandler
一.OnMouse
- 添加一个脚本组件到你的3D物体上,这个脚本将处理点击事件并返回物体信息。例如,你可以命名这个脚本为
ObjectInfo
。 - 在
ObjectInfo
脚本中,添加以下代码:
using UnityEngine;
public class ObjectInfo : MonoBehaviour {
private void OnMouseDown()
{ // 当鼠标点击物体时触发
// 获取物体的信息
string objectName = gameObject.name;
Vector3 objectPosition = gameObject.transform.position;
// 输出物体信息到控制台 Debug.Log("物体名称:" + objectName); Debug.Log("物体位置:" + objectPosition); // 在这里你可以对物体信息进行自定义操作,比如将其显示在UI界面上或进行其他逻辑处理 }
}
- 保存脚本并返回Unity编辑器。将
ObjectInfo
脚本添加到你想要获取信息的3D物体上。确保这个物体具有碰撞体组件(例如Box Collider)以便能够检测到鼠标点击事件。
现在,当你运行游戏并点击所选的3D物体时,物体的名称和位置信息将会显示在Unity控制台中。你可以根据需要,将这些信息发送到UI界面、存储到变量中,或进行其他自定义处理。
二.射线检测(首先物体要有Collider 然后挂载脚本)
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 物体动态事件监听
使用方法
3.1 静态添加事件触发
给EventTrigger添加事件类型,根据需要选择,
Demo里选择点击事件PointerClick
这里的执行函数,是下面我们开发的类ClickEventTrigger.cs,把这个脚本添加到被点击的物体上即可。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ClickEventTrigger : MonoBehaviour
{
public void OnClick()
{
print("MyOnClick 点击了::" + this.name);
}
}
到这里,静态添加事件就完成了,运行效果:
3.2 动态添加事件触发
动态触发,在Unity编辑器中操作就方便多了,只需要在被点击物体上添加EventTrigger就可以了,然后再把我们的脚本ClickEventTrigger.cs添加到被点击物体上,剩下的都在代码中完成。
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class ClickEventTrigger2 : MonoBehaviour
{
// Start is called before the first frame update
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的各种枚举(比如鼠标点击,滑动,拖动等)
entry.eventID = EventTriggerType.PointerEnter;
//注册代理
UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(OnEventTrigger);
//添加代理事件到EventTrigger.Entry
entry.callback.AddListener(callback);
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");
}
}
运行结果:
四.通过事件,实现接口IPointerClickHandler
既然是事件,首先满足事件触发的要求:
-
给场景中的Camera添加PhysicsRaycaster脚本
-
在场景中添加事件系统EventSystem,如图操作:
-
设置被点击物体(3D)物体,一定要带触发器(Collider),然后把点击后处理的脚本挂在被点击的物体上。
到这里,需要我们开发的只有一个脚本,Demo里的EventClick.cs
using UnityEngine; using UnityEngine.EventSystems; public class EventClick : MonoBehaviour,IPointerClickHandler { public void OnPointerClick(PointerEventData eventData) { print("点击了::"+this.name); } }
运行点击cube:文章来源:https://www.toymoban.com/news/detail-729135.html
文章来源地址https://www.toymoban.com/news/detail-729135.html
到了这里,关于unity点击3D物体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!