trigger unity3d_unity3d动画trigger - CSDN
  • 碰撞检测触发器Trigger 有别于碰撞检测器 Collision,其可以不受物理效果影响,一些可穿透区域的碰撞检测,可以使用Trigger来进行碰撞检测 常用方法如下: OnTriggerEnter 进入时 OnTriggerEx

    首先新建一个Cube,其本身就已自带了碰撞器Collider,如图


    要使用Trigger检测物体进入,则需要勾选Is Trigger选项
    碰撞检测触发器Trigger 有别于碰撞检测器 Collision,其可以不受物理效果影响,一些可穿透区域的碰撞检测,可以使用Trigger来进行碰撞检测
    常用方法如下:
    OnTriggerEnter 进入时
    OnTriggerExit 离开时
    OnTriggerStay 处于时

    同上碰撞检测器 Collision 也有3个方法:
    OnCollisionEnter
    OnCollisionExit
    OnCollisionStay

    这里我们需要为跑道添加一个终点撞线的机制,所以使用可穿透的碰撞检测触发器Trigger

    代码如下:

    1
    2
    3
    4
    5
        void OnTriggerEnter(Collider collider)
        {
            print(collider.gameObject.name + ":" + Time.time);
          
        }

    OnTriggerEnter传入的参数必须为Collider,故能触发该函数的对象必须具有Collider组建。这里我们用的是角色控制器Character Controller 自带了Collider组建
    此时每当有角色撞线时即会打印角色名及系统时间


    接下来我们使用碰撞检测器 Collision 来进行一个碰撞检测
    首先取消被撞击对象上的Is

    展开全文
  • Unity3D - Trigger(触发器)

    万次阅读 2019-09-06 20:41:49
    Official Doc:https://docs.unity3d.com/ScriptReference/MonoBehaviour.html 触发器(Trigger)是用来触发事件: 当绑定着碰撞器的游戏对象进入触发器区域的时候,会运行触发器对象上的MonoBeavior中的...

    Official Doc:https://docs.unity3d.com/ScriptReference/MonoBehaviour.html



    触发器(Trigger)是用来触发事件:

    当绑定着碰撞器的游戏对象进入触发器区域的时候,会运行触发器对象上的MonoBeavior中的OnTriggerEnter()函数;

    当其处在触发器区域的时候会运行OnTriggerStay()函数,每帧调用一次OnTriggerStay()函数;

    当其离开触发器区域的时候会运行OnTriggerExit()函数;



    Step1:

    创建一个空的游戏物体(改名为Trigger),并添加Box Colider组件,勾选Is Trigger

    Step2:

    调节Trigger的位置以及大小

    Step3:

    新建测试脚本,添加到Trigger上

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Trigger_A : MonoBehaviour {
    
        void OnTriggerEnter(Collider other)
        {
            Debug.Log(Time.time + ":进入该触发器的对象是:" + other.gameObject.name);
        }
        void OnTriggerStay(Collider other)    //每帧调用一次OnTriggerStay()函数
        {
            Debug.Log(Time.time + "留在触发器的对象是:" + other.gameObject.name);
        }
        void OnTriggerExit(Collider other)
        {
            Debug.Log(Time.time + "离开触发器的对象是:" + other.gameObject.name);
        }
    }
    

     

    展开全文
  • 相信大家在安装完Unity3D后做的第一件事情一定是浏览官方的示例项目《愤怒的机器人》,这个游戏在场景渲染及光照阴影特效等方面都有不错的表现。那么不知道大家还记不记得这样一个场景,当玩家操控我们的游戏角色...

           大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei

           相信大家在安装完Unity3D后做的第一件事情一定是浏览官方的示例项目《愤怒的机器人》,这个游戏在场景渲染及光照阴影特效等方面都有不错的表现。那么不知道大家还记不记得这样一个场景,当玩家操控我们的游戏角色——机器人时,当机器人靠近游戏场景中的门时,门会自动打开,而当机器人离开门时,门会自动关闭。那么,我们今天就来一起实现这样一个简单的功能。通过题目大家一定知道了这个功能的实现是基于Trigger的。Trigger在Unity3D中称为触发器,当一个碰撞器勾选了isTrigger选项后,即变成了触发器。触发器和碰撞器的区别在于碰撞器通过OnCollisionEnter/Stay/Exit()三个方法进行响应且会对参与到碰撞中的物体产生力的作用。而触发器则通过OnTriggerEnter/Stay/Exit()三个方法来响应且不会对参与到触发的物体产生力的作用。关于触发器和碰撞器的内容,大家可以参考这篇文章:http://game.ceeger.com/Components/class-BoxCollider.html

           好了,下面请大家跟随我一起来学习如何在Unity3D中实现基于Trigger的触发式动画,首先我们创建如下的场景:


            场景中的地面和墙体、门均有Cube构成,这里我们把地面、墙体的盒子碰撞器全部移除,避免它们对我们的程序产生干扰。首先我们编写两段脚本来控制门从左向右移动、从右向左移动的动画:

    	//开门动画
    	private void OpenDoorAni()
            {
    	  if(transform.position.x<=1.8F)
    	  {
    		transform.Translate(Vector3.right * Time.deltaTime * 1.5F);
    	  }
            }
    	//关门动画
    	private void CloseDoorAni()
    	{
    	  //等待5秒后再关门,避免角色与门发生碰撞
    	  StartCoroutine("Wait");
    	  if(transform.position.x>=0)
    	  {
    		transform.Translate(Vector3.left * Time.deltaTime * 1.5F);
    	  }
    	}
    	

             代码基本上很容易理解,就是分别从左向右、从右向左移动门啦!接下来,我们给我们的角色加上一个球体碰撞器并勾选isTrigger选项,为什么选择球体碰撞器呢,因为这样角色进入触发和退出触发的时候,都是和门的盒子碰撞器相切的。在关门的时候延迟两秒是为了给玩家一个控制角色的反应时间,避免和门发生碰撞。这里要注意的是角色是带刚体的。

             好了,接下来我们编写触发这一块的代码:

    	
    	void OnTriggerEnter(Collider mCollider)
    	{
    	  Debug.Log(mCollider.gameObject.tag);
    	  if(mCollider.gameObject.tag=="Player")
    	  {
    	    Triggered=true;
    	  }
    	}
    	
    	void OnTriggerExit(Collider mCollider)
    	{
    	  if(mCollider.gameObject.tag=="Player")
    	  {
    	    Triggered=false;
    	  }
    	}
    	
           我们在这里是通过改变一个bool型的标志变量来标记角色是否引起了触发,当引起了触发的时候执行开门的动画,退出除了触发的时候执行关门的动画。这一部分我们放在Update()方法里:

    	
    	void Update () 
    	{
    	  if(Triggered)
    	  {
    	    OpenDoorAni();
    	  }else if(!Triggered)
    	  {
    		CloseDoorAni();
    	  }
    	}

          最后给出全部代码:

    using UnityEngine;
    using System.Collections;
    
    public class AniScripts : MonoBehaviour {
    	
        //定义门的移动速度
    	public float mSpeed=1.5F;
    	//定义门的标志变量
    	private bool Triggered=false;
    	
    	void Update () 
    	{
    	  if(Triggered)
    	  {
    	    OpenDoorAni();
    	  }else if(!Triggered)
    	  {
    		CloseDoorAni();
    	  }
    	}
    	
    	//开门动画
    	private void OpenDoorAni()
        {
    	  if(transform.position.x<=1.8F)
    	  {
    		transform.Translate(Vector3.right * Time.deltaTime * 1.5F);
    	  }
        }
    	//关门动画
    	private void CloseDoorAni()
    	{
    	  //等待5秒后再关门,避免角色与门发生碰撞
    	  StartCoroutine("Wait");
    	  if(transform.position.x>=0)
    	  {
    		transform.Translate(Vector3.left * Time.deltaTime * 1.5F);
    	  }
    	}
    	
    	void OnTriggerEnter(Collider mCollider)
    	{
    	  Debug.Log(mCollider.gameObject.tag);
    	  if(mCollider.gameObject.tag=="Player")
    	  {
    	    Triggered=true;
    	  }
    	}
    	
    	void OnTriggerExit(Collider mCollider)
    	{
    	  if(mCollider.gameObject.tag=="Player")
    	  {
    	    Triggered=false;
    	  }
    	}
    	
    	
    	IEnumerator Wait()
    	{
    		//等待5秒在执行
    		yield return new WaitForSeconds(5);
    	}
    	
    	
    }
    

            一起来看看效果演示吧:


             喜欢我的博客请记住我的名字:秦元培,我的博客地址是:blog.csdn.net/qinyuanpei
             转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/24198893


         

    展开全文
  • Unity3D利用代码快速的为组件添加EventTrigger事件 目录 1、博客介绍 2、内容 (1)获取EventTrigger (2)获取EventTrigger上对应事件 (3)静态拓展 (4)演示效果 3、推送 4、结语 1、博客介绍 平常...

              Unity3D利用代码快速的为组件添加EventTrigger事件


    目录

    1、博客介绍

    2、内容

    (1)获取EventTrigger

    (2)获取EventTrigger上对应事件

    (3)静态拓展

    (4)演示效果

    3、推送

    4、结语


    1、博客介绍

            平常我们为图片等UI组件添加点击、拖拽等Event事件的时候,我们需要在编辑栏手动的为组件添加EventTrigger,再添加EventTriggerType后,再添加触发的方法(如演示1),本篇博客利用静态拓展的方式为组件快速的添加各种EventTrigger事件。(如演示2)

    演示1

     

    演示2

    2、内容

    (1)获取EventTrigger

    获取目标物体上的EventTrigger组件,没有的话添加一下

                    //添加EventTrigger组件
    		EventTrigger trigger = obj.GetComponent<EventTrigger>();
    		if (trigger == null)
    		{
    			trigger = obj.gameObject.AddComponent<EventTrigger>();
    		}

    (2)获取EventTrigger上对应事件

           获取EventTrigger的事件列表,给我们要添加的事件添加回调方法callback,若我们要添加的事件不在EventTrigger的事件列表内则Add进去就可以了。

                    //获取事件列表
    		List<EventTrigger.Entry> entries = trigger.triggers;
    		if (entries==null)
    		{
    			entries = new List<EventTrigger.Entry>();
    		}
    		//获取对应事件
    		EventTrigger.Entry entry = new EventTrigger.Entry();
    		bool isExist = false;
    		for (int i = 0; i < entries.Count; i++)
    		{
    			if (entries[i].eventID == eventTriggerType)
    			{
    				entry = entries[i];
    				isExist = true;
    			}
    		}
    		entry.callback.AddListener(callback);
    		if (!isExist)
    		{
    			entry.eventID = eventTriggerType;
    			trigger.triggers.Add(entry);
    		}

    (3)静态拓展

            要做到直接做到 【Image.AddListener(type ,方法)】的效果我们需要做一个静态拓展,对静态拓展不太了解的同学可以看一下博主关于静态拓展的文章,很简单,看一下就懂了,结尾有推送,这里我们做一下Component的静态拓展就可以轻松实现了。

    	/// <summary>
    	/// 为组件添加监听事件
    	/// </summary>
    	/// <param name="obj"></param>
    	/// <param name="eventTriggerType"></param>
    	/// <param name="callback"></param>
    	/// <returns></returns>
    	public static void AddListener(this Component obj,EventTriggerType eventTriggerType,UnityAction<BaseEventData> callback)
    	{
    		//添加EventTrigger组件
    		EventTrigger trigger = obj.GetComponent<EventTrigger>();
    		if (trigger == null)
    		{
    			trigger = obj.gameObject.AddComponent<EventTrigger>();
    		}
    		
    		//获取事件列表
    		List<EventTrigger.Entry> entries = trigger.triggers;
    		if (entries==null)
    		{
    			entries = new List<EventTrigger.Entry>();
    		}
    		//获取对应事件
    		EventTrigger.Entry entry = new EventTrigger.Entry();
    		bool isExist = false;
    		for (int i = 0; i < entries.Count; i++)
    		{
    			if (entries[i].eventID == eventTriggerType)
    			{
    				entry = entries[i];
    				isExist = true;
    			}
    		}
    		entry.callback.AddListener(callback);
    		if (!isExist)
    		{
    			trigger.triggers.Add(entry);
    		}
    	}

    (4)演示效果

    我们现在快速的为一个图片添加一个点击事件:

     


    3、推送

    本篇源码放置在静态拓展Github工程内:https://github.com/KingSun5/StaticExtension

    静态拓展博客:https://blog.csdn.net/Mr_Sun88/article/details/90106925


    4、结语

           很简单很方便,若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

           QQ交流群:806091680(Chinar)

           该群为CSDN博主Chinar所创,推荐一下!我也在群里!

           本文属于原创文章,转载请著名作者出处并置顶!!!!

    展开全文
  • 官方文档:https://docs.unity3d.com/ScriptReference/EventSystems.EventTrigger.html EventTrigger 描述 接受来自EventSystem的事件并调用每个事件上已注册的函数。 EventTrigger可以用来指定你想被事件调用的...
  • Unity3D 获得 Animator 的 Trigger 和 Event

    千次阅读 2016-11-05 15:22:46
    bool IsHaveTargetEvent(GameObject go, string triggerName) { Animator animator = go.GetComponentInChildren(); Debug.Assert(animator != null, string.Format("{0} 缺少 Animator Com", go.
  • Unity3d中EventTrigger的封装

    千次阅读 2015-05-19 15:32:36
    因为unity中新增的UGUI中的Button只有onClick事件,但如果想要丰富Button的点击事件,就要使用到EventTrigger, 但是自带的用着不方便,所以就对他进行了封装。 废话不多说,上代码: 自定义了一个类继承自上面...
  • Unity3D UI EventTrigger 动态绑定UI事件

    千次阅读 2019-05-30 10:40:07
    Unity3D UI 动态绑定UI事件
  • Unity3D】刚体与碰撞体以及is Trigger属性的意义 刚体:个人理解就是具有物理属性(如:质量),接受物理作用(如:重力)的组件。 碰撞体:个人理解就是计算碰撞后的物理量(如:弹力)。 刚体与碰撞...
  • 第一部分介绍了如何设置Unity3D ,第二部分介绍了如何 使用C#控制Unity3D 。 在本系列的最后一篇文章中,我们将深入研究如何使用Unity3D将代码实际制作成一个简单的游戏。 让我们开始吧 让我们建立一...
  • 如果我们希望从EventSystem接受事件,则需要在GameObject上添加EventTrigger组件。NOTE: Attaching this component to a GameObject will make that object intercept ALL events, and no event bubbling will occur...
  • 前言 UGUI中EventSystem主要负责处理输入、射线以及发送事件,一个场景中 只能有一个EventSystem并且需要 BaseInputModule类型组建的协助才 能工作。 EventSystem负责管理,BaseInputModule负责输 入,...
  • [Unity3D]Unity3D 游戏开发之碰撞检测

    万次阅读 2014-06-13 21:10:37
    今天我们来一起来学习Unity3D中一个很重要的概念:碰撞。为什么说碰撞很重要呢?因为在游戏中无时无刻不充满碰撞啊,在飞行类游戏中我们需要判断炮弹是否击中了敌人,在RPG游戏中我们需要判断玩家是否对敌人造成了...
  • 一起来学习如何在Unity3D中实现基于Trigger的触发式动画
  • Unity3D基础2-2】认识Unity3D引擎

    千次阅读 2020-05-13 17:13:41
    一、引言 【Unity3D基础2-1】Unity3D从业介绍已更新完毕 这篇介绍Unity3D引擎 二、
  • 先编写如下脚本 public class EventTriggerExample : MonoBehaviour { void Start() { //UnityAction click =new UnityAction(MyClick);... //EventTrigger.Entry myClick = new EventTrigger.Entry
  • [Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述

    万次阅读 热门讨论 2014-09-01 16:13:37
    在研究了Unity3D Mecanim动画系统的重定向特性后,今天我们继续来探索Mecanim动画系统更多的特性吧。今天博主想和大家分享的是ACT游戏中的三连击效果的实现,由于Unity3D目前存在Animation和Animator两种类型的动画...
  • Unity3d实战之Unity3d网络游戏实战篇(10):玩家类Player 学习书籍《Unity3d网络游戏实战》 罗培羽著 机械工业出版社 本文是作者在学习过程中遇到的认为值得记录的点,因此引用的代码等资源基本出资罗培羽老师...
  • unity版本2018.2.20f1 Hierarchy面板如下图所示: UIEvent代码: using System; using UnityEngine; using UnityEngine.EventSystems; public class UIEvent : EventTrigger { public static UIEvent Get...
  • 大致研究了下,可以有这几种情况: 如果物理视觉上有碰撞,则在OnCollisionEnter中实现。...要求至少1方拥有Rigidbody,并且有1方加入Trigger。应用上偏向于事件触发(顾名思义),比如Player进入某个区域或是...
1 2 3 4 5 ... 20
收藏数 3,140
精华内容 1,256
关键字:

trigger unity3d