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

这篇具有很好参考价值的文章主要介绍了Unity3D-场景中3D物体添加点击事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

Unity3D - 场景中3D物体添加鼠标点击事件
鼠标点击3D物体触发,Unity从本质上来说有两种:一种是通过事件(event)触发,一种是通过射线(ray)判断穿过的物体触发。这两种触发的原理是不同的,不论哪种触发都必须满足触发的要求才可以,既然原理不同,触发的要求也不一样,下面详细说明一下3种不同的方式。
Unity版本 5.6.2f  Unity API版本 2019.1 
参考 Unity API: Redirect to... title of new-page
一、通过事件,实现接口IPointerClickHandler 
先了解下接口IPointerClickHandler,这个接树关系是  UnityEngine.EventSystems. Interfaces.IPointerClickHandler,下面看下它还有哪些可以实现的接口

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


这里用IPointerClickHandler举例(api中这样解释):

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


也就是在我们的被点击的类中实现了接口后,在实现方法OnPointerClick,在这个方法里操作点击后的处理。
既然是事件,首先满足事件触发的要求:
1.给场景中的Camera添加PhysicsRaycaster脚本。

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


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

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


 
点击 Add Default... 后出现如图:

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


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

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



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

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

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


 
二、通过事件,附加脚本EventTrigger
这里也是同过事件来实现的,也要按照 一 里满足事件触发的要求(不懂!往上翻看下):
1.给场景中的Camera添加PhysicsRaycaster脚本。
2.在场景中添加事件系统EventSystem;
完成以上两步后,3就和一里的不一样了。
3.这里有两种做法,分别是3.1 和 3.2 ,只是在用法上不同,原理是一样的。
首先给被点击的物体添加EventTrigger脚本。

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


 
3.1,是静态添加事件触发
给EventTrigger添加事件类型,根据需要选择,

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


 
Demo里选择点击事件PointerClick

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


 
给PointerClick添加触发后执行函数

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


 
这里的执行函数,是下面我们开发的类ClickEventTrigger.cs,把这个脚本添加到被点击的物体上即可。
 
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

public class ClickEventTrigger : MonoBehaviour 
{
public void OnClick()
    {
        print("MyOnClick 点击了::"+this.name);
    }
}
到这里,静态添加事件就完成了,运行效果:

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


 
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");
    }
}
运行结果:

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


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

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


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

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


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

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


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

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


 
运行结果:

Unity3D-场景中3D物体添加点击事件文章来源地址https://www.toymoban.com/news/detail-480700.html


 
完整代码:
 
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);
                }
            }
        }
    }
}

到了这里,关于Unity3D-场景中3D物体添加点击事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity3d场景怎么添加天空盒子?

    unity3d场景中想要添加天空盒子,该怎么添加呢?下面我们就来看看详细的教程。 1、先下载组成天空盒子的天空图片 2、把天空图片拖进 unity3d 中创建的文件夹 3、新建一个 材质球 4、把材质球的 shader修改成天空盒选项 5、在天空盒的六个方向(前,后,左,右,上,下)添加

    2024年02月11日
    浏览(58)
  • Unity3D相机围绕物体自由旋转

    写了一个相机围绕物体360°自由旋转的脚本,比较实用,分享出来给大家使用,配置如下: Hierarchy界面  LookPovit:为物体Auto Aircraft的中心空对象; AroundPovit:用于相机的空对象,作为父类,主要作用是为了保持与被观察物体的位置一致,可防止Auto Aircraft出现抖动而影响相机

    2024年02月11日
    浏览(66)
  • Unity3D 控制物体移动且自动旋转

    直接上代码(改脚本挂载到游戏物体上) 第三人称摄像机移动

    2024年02月15日
    浏览(83)
  • Unity3D_物体抛物线运动

    参考:Unity 贝塞尔曲线实现抛物线运动,投掷功能实现  用到了DOTween插件, 回想起之前不知道这个插件还在用协程和SmoothDamp做运动控制的自己仿佛是个哈批 路径绘制使用的LineRenderer

    2024年02月13日
    浏览(68)
  • 多层Unity3D物体模型穿透问题处理

    如图,当我们想要在同一个界面中展示两层或以上3D物体时,有时会因为第一层物体材质上的 shader 渲染深度被破坏或其它原因导致第一层的物体穿透到第二层界面上来了。 在 Scene 视图中这三个橙色球体原本是在第二层黄色背景之下的: 但是在 Game 视图中我们发现那三个橙色

    2024年02月02日
    浏览(68)
  • Unity3D物体自动躲避障碍物

            2017.4.4f1         物体向前发射一个射线,检测到碰撞后,根据碰撞信息选择新的方向。最终结果如下。 通过发射虚拟胶囊体来检测碰撞api bool Physics.CapsuleCast (Vector3 point1, Vector3 point2, float radius, Vector3 direction, out RaycastHit hit, float maxDistance)  points参数如图所示,

    2023年04月24日
    浏览(68)
  • 【Unity3D小功能】Unity3D中实现点击‘文字’出现‘UI面板’

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 QQ群:398291828 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 宠粉博主又来了,今天有粉丝问我如何实现点击一段文字然后出现的面板在那段文字附近显示: 深入了

    2024年04月13日
    浏览(83)
  • unity3D 鼠标滚轮实现物体的大小缩放

    鼠标滚轮响应函数是Input.GetAxis(\\\"Mouse ScrollWheel\\\"),函数返回值类型是float,向前滚是返回正数,向后滚是返回负数,且鼠标滚轮滑动单次函数返回值为0.1 利用返回值修改模型transform.localscale,实现模型缩放 鼠标滚轮一直向后滚,会看见模型逐渐变小,当变到很小到消失的时候,

    2024年02月08日
    浏览(81)
  • Unity3d中关于物体穿透模型和物体移动的一些问题

    第一:可能是没有设置刚体和碰撞体; 第二种:一般是由于被穿透物体太过于薄弱,根本没有检测到碰撞的问题,这种情况可以把物体加厚。但偶尔是不能解决问题的,因为这种情况下是由于物体移动的速度过快导致的。 第三;关于物体自己动的问题,那是物体移动脚本和物

    2024年02月11日
    浏览(77)
  • Unity3d 物体不动,碰撞触发不了的情况

    问题: 有一种情况,主角带刚体,主角站着不动。玩家站在陷阱上,陷阱的碰撞体 Toggle 之后, OnCollisionEnter 触发不了。 解决:盲猜玩家组件上才有刚体,而碰撞检测是刚体运动的时候,才进行检测的。

    2024年02月06日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包