当前位置:   article > 正文

Unity3D-场景中3D物体添加点击事件_unity3d球体内部添加事件

unity3d球体内部添加事件

鼠标点击3D物体触发,Unity从本质上来说有两种:一种是通过事件(event)触发,一种是通过射线(ray)判断穿过的物体触发。这两种触发的原理是不同的,不论哪种触发都必须满足触发的要求才可以,既然原理不同,触发的要求也不一样,下面详细说明一下3种不同的方式。

Unity版本 5.6.2f Unity API版本 2019.1

参考 Unity API:https://docs.unity3d.com/ScriptReference/EventSystems.EventSystem.html

一、通过事件,实现接口IPointerClickHandler

先了解下接口IPointerClickHandler,这个接树关系是 UnityEngine.EventSystems.Interfaces.IPointerClickHandler,下面看下它还有哪些可以实现的接口
在这里插入图片描述
这里用IPointerClickHandler举例(api中这样解释):
在这里插入图片描述
也就是在我们的被点击的类中实现了接口后,在实现方法OnPointerClick,在这个方法里操作点击后的处理。

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

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

在这里插入图片描述

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

在这里插入图片描述
点击 Add Default… 后出现如图:
在这里插入图片描述

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

在这里插入图片描述
到这里,需要我们开发的只有一个脚本,Demo里的EventClick.cs

using UnityEngine;
using UnityEngine.EventSystems;

public class EventClick : MonoBehaviour,IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
       print("点击了::"+this.name);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运行点击cube:
在这里插入图片描述

二、通过事件,附加脚本EventTrigger

这里也是同过事件来实现的,也要按照 一 里满足事件触发的要求(不懂!往上翻看下):

  1. 给场景中的Camera添加PhysicsRaycaster脚本。
  2. 在场景中添加事件系统EventSystem;

完成以上两步后,注意也要带触发器(Collider),3就和一里的不一样了。

  1. 这里有两种做法,分别是4 和 5 ,只是在用法上不同,原理是一样的。 首先给被点击的物体添加EventTrigger脚本。
    在这里插入图片描述
  2. 是静态添加事件触发

给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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

到这里,静态添加事件就完成了,运行效果:

在这里插入图片描述

  1. 是动态添加事件触发

动态触发,在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");
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

运行结果:

在这里插入图片描述

三、通过射线,RayCastHitControl

这个方法主要是通过,射线发射,判断射线穿过的物体,根据特定的标志来判断是否点击到了该物体(比如:物体的标签Tag,还有物体的名称)
这里只需要3d物体,并且有明确的唯一标识,再加上我们开发的ClickRayCastHitControl.cs就可以。
在这里插入图片描述

  1. 在场景中创建一个物体(Cube),然后点击Inspector面板下Tag - AddTag…- 在Tags列表中,点击+,输入你要添加的Tag名称就可以。创建Tag完成后,回到场景给这个Cube选择刚才创建的Tag。

在这里插入图片描述

  1. 在创建一个Cube,demo中起名(BeiJiChaun),这个名字就是射线穿过判断的标识,这个物体就创建完成了。

在这里插入图片描述

  1. 创建单独层,挂载我们开发的脚本即可。

在这里插入图片描述
运行结果:

在这里插入图片描述
完整代码:

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);
             }
          }
      }
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/101047
推荐阅读
相关标签
  

闽ICP备14008679号