如何在Unity中实现用if语句的用法检测游戏对象是否进入Trigger?

如果觉得有帮助,就顶顶顶一个,或者关注、关注、关注一下,转载请注明出处。...
Unity EventTrigger
一、相关知识
查看Button的源代码可以发现,就只有onClick而已,如果想要添加其它事件就必须使用EventSystem.EventTrigger和delegate(代理)
EventTrigger 总共提供了17个事件接口供我们调用
1. OnBeginDrag(PointerEventData eventData);
2. OnCancel(PointerEventData eventData);
3. OnDeselect(PointerEventData eventData);
4. OnDrag(PointerEventData eventData);
5. OnDrop(PointerEventData eventData);
6. OnEndDrag(PointerEventData eventData);
7. OnInitializePotentialDrag(PointerEventData eventData);
8. OnMove(AxisEventData eventData);
9. OnPointerClick(PointerEventData eventData);
10. OnPointerDown(PointerEventData eventData);
11. OnPointerEnter(PointerEventData eventData);
12. OnPointerExit(PointerEventData eventData);
13. OnPointerUp(PointerEventData eventData);
14. OnScroll(PointerEventData eventData);
15. OnSelect(BaseEventData eventData);
16. OnSubmit(BaseEventData eventData);
17. OnUpdateSelected(BaseEventData eventData);
二、代码实战
仅需要配置PerformClick.cs的public对象,就不需要用传统的方法对每个button绑定事件了。
传统的方法如下
EventTriggerListener.cs
using UnityE
using UnityEngine.EventS
public class EventTriggerListener : EventTrigger {
public delegate void VoidDelegate(GameObject obj);
public VoidDelegate onC
public VoidDelegate onD
public VoidDelegate onUp;
public VoidDelegate onE
public VoidDelegate onE
public VoidDelegate onS
public VoidDelegate onUpdateS
public static EventTriggerListener Get(GameObject obj)
EventTriggerListener listener = obj.GetComponent&EventTriggerListener&();
if(listener == null)
listener = obj.AddComponent&EventTriggerListener&();
public override void OnPointerDown(PointerEventData eventData)
if (onDown != null) onDown(gameObject);
public override void OnPointerUp(PointerEventData eventData)
if (onUp != null) onUp(gameObject);
public override void OnPointerClick(PointerEventData eventData)
if(onClick != null) onClick(gameObject);
public override void OnPointerEnter(PointerEventData eventData)
if (onEnter != null) onEnter(gameObject);
public override void OnPointerExit(PointerEventData eventData)
if (onExit != null) onExit(gameObject);
public override void OnSelect(BaseEventData eventData)
if (onSelect != null) onSelect(gameObject);
public override void OnUpdateSelected(BaseEventData eventData)
if (onUpdateSelect != null) onUpdateSelect(gameObject);
PerformClick.cs
using UnityE
using UnityEngine.UI;
public class PerformClick : MonoBehaviour {
void Start () {
EventTriggerListener listener = EventTriggerListener.Get(btn.gameObject);
listener.onClick = OnBtnC
listener.onEnter = OnBtnE
private void OnBtnEnter(GameObject obj)
Debug.Log("enter");
private void OnBtnClick(GameObject obj)
Debug.Log("click");
EventTrigger触发3D物体事件和UGUI事件
UNITY之EventTrigger,EventListener
UGUI基于EventTrigger的UI交互事件监听系统&动态加载
Unity3d中EventTrigger的封装
代码添加EventTrigger监听事件
【UGUI】EventTrigger动态添加事件
Unity 游戏物体 EventTrigger 物体动态事件监听
unity的UI Event事件(Event Trigger和EventSystem对比)
Unity5.0 EventSystem事件系统的详细说明
没有更多推荐了,unity3d 碰撞器和触发器的区别
首先得先明白什么是碰撞器,什么是触发器
碰撞器:Box Collider 盒碰撞器、Capsule Collider 胶囊碰撞器、Mesh Collider 网格碰撞器、 球碰撞器
等等这一类组件。
触发器:以上这些碰撞器在检视面板中勾选IsTrigger属性就变成了触发器
(1)碰撞器有碰撞效果
(2)IsTrigger=false
(3)碰撞信息检测
MonoBehaviour.OnCollisionEnter(Collision collision)
MonoBehaviour.OnCollisionExit(Collision collision)
MonoBehaviour.OnCollisionStay(Collision collision)
(1)触发器没有碰撞效果
(2)IsTrigger=
(3)触发信息检测:
MonoBehaviour.OnTriggerEnter(Collider collider)
MonoBehaviour.OnTriggerExit(Collider collider)
MonoBehaviour.OnTriggerStay(Collider collider)
要明白什么时候才会产生碰撞?或者说怎样才能触发以上那些函数?
刚体(Rigidbody)
刚体使物体能在物理控制下运动。刚体可通过接受力与扭矩,使物体像现实方式一样运动。任何物体想要受重力影响,受脚本施加的力的作用,或通过NVIDIA PhysX物理引擎来与其他物体交互,都必须包含一个刚体组件。
碰撞器(那些Collider,例如BoxCollider)和刚体(Rigidbody)要一起使用才会产生碰撞,才会触发以上那些函数,只是不同的组合方式触发的函数不同,例如是否勾选IsTrigger。
一些专业术语需要了解
1、Static Collider 静态碰撞器
指的是没有附加刚体而附加了碰撞器的游戏对象。这类对象会保持静止或者很轻微的移动。对于环境模型十分好用,当和刚体碰撞时而不会移动。
2、Rigidbody Collider 刚体碰撞器
指的是同时附加了刚体和碰撞器的游戏对象。通过脚本的力量和碰撞完全受物理引擎的影响。可以和只包含碰撞器的游戏对象碰撞。将会成为你游戏中使用物理效果的基本类型碰撞器。
3、Kinematic Rigidbody Collider 运动学刚体碰撞器
指的是同时包含碰撞器和刚体,并且激活IsKinematic的一类游戏对象,要移动这类游戏对象,要修改它的Transform组件,而不是用力。它们很像静态碰撞器不过对于想要不停地到处移动的碰撞器很好用。
如果有刚体有时候变得静止不动了,那么它们就是进入休眠了。意味着它们将不受物理变化影响,也就不会移动。如果你把一个运动学刚体从一个休眠的普通刚体下边移走,那休眠的刚体就会被唤醒并重新被物理变化时时影响。
举例:两个方块,Cube1和Cube2 ,移动一个方块去碰撞另外一个方块。
(1)如果这两个方块都只挂着碰撞器(例如BoxCollider)没有挂刚体(Rigidbody),不会触发消息
(2)两个方块都挂着碰撞器(例如BoxCollider)和 刚体(Rigidbody),IsTrigger=false的情况下响应碰撞检测函数,IsTrigger=true的情况下响应触发检测函数
仅提供以上两个思路,大家可以试着尝试各种组合,查看触发哪些函数。
Unity学习笔记(一):碰撞体(Collider),触发器(Trigger),刚体(RigidBody)
Unity3d碰撞器与触发器的区别详解
Unity碰撞器和触发器的总结
Collider(碰撞器与触发器)
碰撞器和触发器的区别
unity 所有碰撞器(触发器),碰撞条件、结果,触发条件、结果。。。以及碰撞函数、触发函数的调用。
Unity3d碰撞检测中碰撞器与触发器的区别
unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新
碰撞体(Collider)以及触发器(Is Trigger)----碰撞的条件,触发碰撞器和触发器的条件
u3d中的碰撞器xxx Collider中的Is Trigger
没有更多推荐了,& & & & & & & & & & & & & & & & & & & & &碰撞器
物体发生碰撞的必要条件
两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。
在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。
用代码进行碰撞器的触发设置
Collider2D.OnCollisionEnter2D(Collision2D) 当进入2D碰撞
当传入的碰撞器接触到这个对象的碰撞器时发送(仅2D物理)。 &&
只有每次接触到碰撞器的时候才触发(仅触发一次 如需再次触发需要再次进行碰撞)
Collider2D.OnCollisionStay2D(Collision2D)
当另个对象的碰撞器正在触碰这个对象的碰撞器时,每帧发送(仅2D物理)。
只要和碰撞器碰在一起便一直触发
Collider2D.OnCollisionExit2D(Collision2D) 当退出2D碰撞
当另一个对象上的碰撞器停止接触这个对象的碰撞器时发送(仅2D物理)。
只有每次离开碰撞器的时候才触发(仅触发一次 如需再次触发需再次检测碰撞离开 一般很少用)
如果没有添加刚体组件但是添加了碰撞器组件,要进入碰撞检测函数则对方一定要有刚体组件和碰撞器组件
如果刚体组件勾选中 &Is &Kinematic 选项便不再受物理属性的影响 &如果碰撞的另一方也没有刚体,则不会进入碰撞检测函数,即碰撞函数不再触发。
碰撞器组件勾选上Is Trigger 后便成为触发器组件 碰撞双方不再进入碰撞检测函数即OnCollision系列函数
测试:如果只有A有刚体(Rigidbody),那么当A去碰撞B时,发现A弹开B没有动。A和B都进入OnCollisionEnter方法
结论1:只有刚体能实现真实的物理碰撞。
测试2:如果只有A有刚体(Rigidbody),那么当B去碰撞A时,发现没有碰撞效果,A和B都没有进入OnCollisionEnter方法。
结论2:实现碰撞的条件是,发起碰撞方必须具有刚体。
总结:碰撞双方必须最少要有一个含有刚体组件(且发起碰撞的物体一定要有刚体),双方都含有碰撞器的情况下(即不能勾选Is Trigger 如果勾选了则为触发器双发只要有一个是触发器则双方都不会进入碰撞检测函数)才会进入碰撞检测函数。
& & & & & & & & & & & & & & & & & & & & &触发器
每个碰撞器组件都有一个 Is &Trigger &选项 &当它被勾选的时候&
碰撞器便会变成触发器
然后用代码进行触发器的设置
Collider2D.OnTriggerEnter2D(Collider2D) 当进入2D触发器
当另个对象的碰撞器进入到这个对象的触发碰撞器时发送(仅2D物理)。
只有每次接触到触发器的时候才触发(仅触发一次 如需再次触发需要再次进行接触)
Collider2D.OnTriggerStay2D(Collider2D) 当停留在2D触发器
当另个对象的碰撞器停留在这个对象的触发碰撞器内时每帧发送(仅2D物理)。
只要和触发器碰在一起便一直触发
Collider2D.OnTriggerExit2D(Collider2D) 当退出2D触发器
当另个对象的碰撞器离开这个对象的触发碰撞器时发送(仅2D物理)。
只有每次离开触发器的时候才触发(仅触发一次 如需再次触发需再次检测接触离开 一般很少用)
触发器不需要刚体也可以触发触发器函数!!!
一般用于静态的不想受物理属性影响的但是却可以检测碰撞的物体
碰撞双方至少要有一个为刚体,并且至少一个有触发器组件(即勾选了Is Trigger的碰撞器组件)时,双发都可以进入到触发器检测函数 &即 OnTrigger系列函数&
& & & & & & & & & & & & & & & && 碰撞器和触发器区别
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
& & & & & & & & & & & & & & & & &其它的碰撞检测方法
Physics2D.OverlapCircleAll 重叠圆形所有
C# =& static Collider2D[] OverlapCircleAll(Vector2 point, float radius, int layerMask = DefaultRaycastLayers, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity);
Parameters 参数
Centre of the circle. 圆的中心点。
Radius of the circle. 圆的半径。
Filter to detect Colliders only on certain layers. 只在某些层过滤检测碰撞器。
Only include objects with a Z coordinate (depth) greater than this value. 只包括Z坐标(深度)大于这个值的对象。
Only include objects with a Z coordinate (depth) less than this value. 只包括Z坐标(深度)小于这个值的对象。
获取一个列表包括所有碰撞器,那些碰撞器是落入一个圆形区域中的才行& & & & & & & & & & & & & & &
此函数不受刚体影响 和 Is Trigger 只要有碰撞器组件接触到这个圆形区域内都会被检测到。
Physics2D.OverlapPointAll 重叠点所有
C# =& static Collider2D[] OverlapPointAll(Vector2 point, int layerMask = DefaultRaycastLayers, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity);
Parameters 参数
A point in world space. 一个世界空间中的点。
Filter to detect Colliders only on certain layers. 只在某些层过滤检测碰撞器。
Only include objects with a Z coordinate (depth) greater than this value. 只包括Z坐标(深度)大于这个值的对象。
Only include objects with a Z coordinate (depth) less than this value. 只包括Z坐标(深度)小于这个值的对象。
同上,不过这个函数是以一个点区分而上面是以一个圆区分 得到一个列表,里面是所有与世界中的点重叠的碰撞器。
此函数同样不受刚体和Is Trigger 影响 只要有碰撞器组件接触到这个点就都会被检测到
& 著作权归作者所有
人打赏支持
码字总数 3935
一直关注白鹭引擎的童靴会发现,今天白鹭引擎先后完成了白鹭引擎5.2.0、白鹭引擎5.3.0两个版本的更迭,在周三发布《白鹭引擎稳定版即将发布,后续路线图同步公开》文中,我们已详细介绍了白鹭...
点击进入我的新博客 作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明。如果你喜欢这篇文章,请点推荐。谢谢! Unity3D重要模块的类图 最近刚刚完成了一个...
从今天开始要做一个2d游戏,由于之前都是做cocos2dx的,然后接触了一段时间的unity3d,都是做3D方面的东西,得知要做2d游戏还是有点开心的,或许因为不想丢失之前的2d游戏的一些思想,然后接...
前言 Unity官方教程 2D Roguelike 英文原版视频教程地址 ——& 传送门 由于官方视频使用的Unity版本较老,部分方法已经不再使用,本文已经采用较新的Unity版本和对应的替代方法。另外为了更方...
小巷里有只猫
本文首发于“洪流学堂”微信公众号。 洪流学堂,让你学Unity快人几步 Unity2018.1中对粒子系统进行了重大改进,包括功能、性能很多方面,快来看看吧! GPU网格实例化 粒子系统现在支持GPU实例...
zhenghongzhi6
前言 在大型游戏中在Unity使用物理引擎是十分消耗性能的,特别是在移动端设备中,如果过多的使用物理引擎来进行行为判断,对设备性能消耗是很厉害的,一般情况我们在Unity游戏开发中,会通过...
Unity3d中参与碰撞的物体分2种类型: 一、发起碰撞的物体。 二、接收碰撞的物体。 1. 参与发起碰撞物体:Rigodbody, CharacterController 角色碰撞器。 2. 参与接收碰撞的物体:所有Collide...
Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏 即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的。实际上,Unity在2013年发布4.3版本的时...
作业与练习 游戏设计要求 创建一个地图和若干巡逻兵(使用动画); 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算; 巡逻兵碰...
从角色扮演游戏到即时策略游戏,从冒险解谜游戏到动作射击游戏,甚至是只有一兆大小的迷你游戏,都有起着核心作用的技术组成部分。本文将介绍十大好用的开源游戏引擎和框架,希望能给你的游戏...
编辑部的故事
没有更多内容
加载失败,请刷新页面
CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代...
本文出自:http://blog.onlycatch.com/post/自旋锁。 我对原文做了一点补充与修改,我觉得这篇文章写的非常非常好。深入学习,不光可以深入掌握自旋锁,还能提高自己的编程思想。原文作者对于...
PHP在设计的时候已经预定义了9个超级全局变量、8个魔术变量和13魔术函数,这些变量和函数可以在脚本的任何地方不用声明就可以使用。 在PHP开发会频繁的使用这些变量和函数,这些变量和函数可...
所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性.因为网络的不可靠性, 有可能在 TCP 保持长连接的过程中, 由于...
初学springboot,感觉:好用 and 好坑。 在下使用spring boot 2.0版本,听闻该版本尚不稳定,1.58版本较为稳定。但我尚未发现有何不稳定。 大约用1-2天时间学习spring boot搭建出框架,编写项...
7月15日,萝卜教育与辽宁鞍山博智教育编程培训机构达成战略合作协议。该机构将成为萝卜教育在辽宁的加盟代理商,进而在当地开展萝卜教育青少年编程培训课程,届时,萝卜教育将正式落户辽宁。...
bodasisiter
ForkJoinPool畅想 当使用从Java8 的paralleStream 时,有时候得到的结果跟串行执行的stream直接的结果不同,得知paralleStream是线程不安全的,在网上查了些资料得知如果使用并行stream时,内...
Redis(一)——NoSQL入门和概述 什么是NoSQL NoSQL=Not Only SQL,意为“不仅仅是SQL”,即非关系型数据库。 NoSQL特点 易扩展 大数据量,高性能 多样灵活的数据模型 Redis核心 KV:键值对 Ca...
基于redis和R语言构建并行计算平台(yiyou) http://www.voidcn.com/article/p-yzsesiie-bkz.html
概述 上一篇文章我们了解了一些关于LAMP的知识,其中还学到了关于MySQL的安装,本文将要讲的是与MySQL类似的MariaDB软件的安装。在构建lamp的时候选择其中一个安装就行了 数据库已经安装好了...
没有更多内容
加载失败,请刷新页面
文章删除后无法恢复,确定取消删除此文章吗?
亲,自荐的博客将通过私信方式通知管理员,优秀的博客文章审核通过后将在博客推荐列表中显示
确定推荐此文章吗?
确定推荐此博主吗?
聚合全网技术文章,根据你的阅读喜好进行个性推荐
指定官方社区
深圳市奥思网络科技有限公司版权所有Unity中的trigger
最近在一家公司实习,公司用unity做项目,所以开始抛弃cocos,步入unity的深坑,笔主在研究unity时,发现网上很少有人会去分析引擎内部的实现,更加偏向于“是什么”而不是“为什么”,笔主接下来的一段时间可能都会写一些关于unity的个人理解,由于看不到源码,笔主只能通过类比cocos和UE来猜想unity的实现。
trigger的概念
trigger被称之为触发器,但其实这个翻译不太准确,trigger是一种tick方法,它会在每一帧被检测,触发在程序里的概念更合适于消息传递这种场景,比如win32底层的信号量机制。
trigger的表现
在学习了unity官方的几个教程之后,我总结了一下各种类所带有的trigger方法中,基本符合如下的情况:
在满足一定条件时指定函数被调用
在一个周期(此处不是指update)中只会被调用一次,在进入下一次周期时标志被重置
trigger的实现
此处我会贴上我写的一小段代码,来讲述一下我对trigger的理解(由于底层代码都是由c++实现的,此处也是c++代码):
class Trigger
Trigger():
_name = "",
_last = false,
_current = false
~Trigger() = default;
void tick()
if(!_last)
if(_current)
if(onTrigged != nullptr)
onTrigged();
void set()
this-&_current = true;
void reset()
this-&_current = false;
void onTimeLineEnd()
static Trigger* create();
function&void()& onT
TriggerMgr
TriggerMgr();
~ TriggerMgr();
void SetTrigger(const string& triggerName)
_triggers[triggerName]-&set();
virtual void add(const string& triggerName,const function&void()&& func)
auto ret = Trigger::create();
ret-&onTrigged =
_triggers.insert(make_pair&string,Trigger*&(triggerName,ret));
unordered_map&string,Trigger*& _
我的理解是,unity中凡是有trigger的类,一定是实现了对底层trigger类的继承,然后能调用trigger的类,比如Collider,Animator等,内部都有一个hash表(c#中的Dictionary)来管理这些trigger,我们在添加trigger时,就是在表中加元素,然后通过多个标记来达到每个周期只执行一次的效果。
此处的周期指的是完成一个事件的时间,比如在Collider中,这个周期指从“和碰撞体相交”到“不想交”的这段时间,我们可以在离开时这样调用:
virtual void onColliderOut()
this-&TriggerMgr[triggerName]-&onTimeLineEnd();
当然,主流的做法是把此处代码放到事件的回调中,在结束时调用。
关于set true
在trigger中,我们被允许使用set方法将trigger显式调用,但是却不允许将trigger取消,set false被禁用了(或许可以实现,但是没看到这样的用法),这样可能是为了有更好的封装性,trigger这样就变成了一个具有自我恢复周期,而非外部控制的bool量。
据我观察,unity中的trigger应该是互相独立的(一个trigger周期内可触发多个其他trigger),所以互相冲突的可能性很小,现在还没遇到过,不过一般可以用优先级和权重的方案解决,遇到了再细细研究。
unity使用setTrigger需注意地方
unity 所有碰撞器(触发器),碰撞条件、结果,触发条件、结果。。。以及碰撞函数、触发函数的调用。
Unity学习笔记(一):碰撞体(Collider),触发器(Trigger),刚体(RigidBody)
Unity中碰撞体和触发器的区别
Unity碰撞器和触发器的总结
【笨木头Unity】入门之旅008:Demo之四处找死(三)_触发器
Unity3D学习记录——触发器开关门
Unity3D碰撞检测
Trigger触发器的使用及注意事项
unity的碰撞器和触发器简单学习
碰撞体(Collider)以及触发器(Is Trigger)----碰撞的条件,触发碰撞器和触发器的条件
没有更多推荐了,Unity检测目标是不是在攻击范围内-腾讯游戏学院

我要回帖

更多关于 输入一个整数,用if语句实现 的文章

 

随机推荐