unity点击3D物体

目录

一.OnMouse

二.射线检测(首先物体要有Collider 然后挂载脚本)

三.游戏物体 EventTrigger 物体动态事件监听

3.1 静态添加事件触发

 3.2 动态添加事件触发

 四.通过事件,实现接口IPointerClickHandler


一.OnMouse

  1. 添加一个脚本组件到你的3D物体上,这个脚本将处理点击事件并返回物体信息。例如,你可以命名这个脚本为ObjectInfo
  2. 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界面上或进行其他逻辑处理 } 
}
  1. 保存脚本并返回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

既然是事件,首先满足事件触发的要求:

  1. 给场景中的Camera添加PhysicsRaycaster脚本

  2. 在场景中添加事件系统EventSystem,如图操作: 

  3.  设置被点击物体(3D)物体,一定要带触发器(Collider),然后把点击后处理的脚本挂在被点击的物体上。

    到这里,需要我们开发的只有一个脚本,Demo里的EventClick.cs 

    using UnityEngine;
    using UnityEngine.EventSystems;
    
    public class EventClick : MonoBehaviour,IPointerClickHandler
    {
        public void OnPointerClick(PointerEventData eventData)
        {
           print("点击了::"+this.name);
        }
    }

    运行点击cube:

    Unity3D-场景中3D物体添加点击事件

猜你喜欢

转载自blog.csdn.net/2302_76830411/article/details/131449395
今日推荐