Unity检测目标是不是在攻击范围内
发表于2017-07-18
在游戏设计中,有的技能的攻击范围有一定的区域限制,那么如何去判断场景中的怪物是否在攻击范围内呢。一个点是否在扇面上只需要判定,目标点与原点的距离是否大于半径&目标点与原点朝向的角度在扇形角度中,就可以了。
第一步:以玩家为原点向玩家朝向给定一个已知距离的向量
第二步:给定扇形角度,已第一步得到的向量作为中分轴
第三步:求目标点与角色的距离得到向量并判定距离是否大于半径
第四部:由第一步和第三步的向量得到角度 Vector3.Angle()
第五步:判定角度绝对值是否大于第二步规定的扇形角度。
如果第三步和第五步都满足,就是在咯。
关于碰撞器和触发器
要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。
物体发生碰撞的必要条件
两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。
在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。
碰撞器:一群组件,它包含了很多种类,比如:Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。
触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。

触发信息检测:
1.MonoBehaviour.OnTriggerEnter(Collider collider)当进入触发器
2.MonoBehaviour.OnTriggerExit(Collider collider)当退出触发器
3.MonoBehaviour.OnTriggerStay(Collider collider)当逗留触发器
碰撞信息检测:
1.MonoBehaviour.OnCollisionEnter(Collision collision) 当进入碰撞器
2.MonoBehaviour.OnCollisionExit(Collision collision) 当退出碰撞器
3.MonoBehaviour.OnCollisionStay(Collision collision) 当逗留碰撞器
当发生碰撞反应的时候,会先检查此Is Trigger属性。
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
总结:Is Trigger 好比是一个物理功能的开关, 是要“物理功能”还是要“OnTrigger脚本”。
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
总结:Is Trigger 好比是一个物理功能的开关, 是要“物理功能”还是要“OnTrigger脚本”。
基于两个碰撞对象的配置,可以产生很多不同的效果。下表概括了基于附加不同组件的两个碰撞对象所产生的效果。其中有些组合只能导致碰撞的两个对象中的一个受到影响,.所以考虑到保持标准的规则-物理效果将不会对没有附加刚体的对象生效。
Collision detection occurs and messages are sent upon collision | ||||||
---|---|---|---|---|---|---|
Static Collider | Rigidbody Collider | Kinematic Rigidbody Collider | Static Trigger Collider | Rigidbody Trigger Collider | Kinematic Rigidbody Trigger Collider | |
Static Collider | Y | |||||
Rigidbody Collider | Y | Y | Y | |||
Kinematic Rigidbody Collider | Y | |||||
Static Trigger Collider | ||||||
Rigidbody Trigger Collider | ||||||
Kinematic Rigidbody Trigger Collider |
Trigger messages are sent upon collision | ||||||
---|---|---|---|---|---|---|
Static Collider | Rigidbody Collider | Kinematic Rigidbody Collider | Static Trigger Collider | Rigidbody Trigger Collider | Kinematic Rigidbody Trigger Collider | |
Static Collider | Y | Y | ||||
Rigidbody Collider | Y | Y | Y | |||
Kinematic Rigidbody Collider | Y | Y | Y | |||
Static Trigger Collider | Y | Y | Y | Y | ||
Rigidbody Trigger Collider | Y | Y | Y | Y | Y | Y |
Kinematic Rigidbody Trigger Collider | Y | Y | Y | Y | Y | Y |
射线和碰撞器
射线是3D世界中一个点向一个方向发射无终点的线。
在unity3d中我们发射的射线一旦与其他的碰撞器(不需要添加刚体组件)发生碰撞,射线将停止发射。在游戏制作过程中我们可以通过判断射线是否发生了碰撞,并且可以判断射线和谁发生了碰撞。应用范围非常广泛,如射击类游戏中用它来判断是否射中目标。
我们要想在游戏中发射一条射线,必须要有两个元素,一个起始点,一个方向。
Ray.origin:射线起点
Ray.direction:射线的方向
创建一条射线的方法Ray (origin : Vector3, direction : Vector3)
Origin是射线的起点,direction是射线的方向。
首先在场景中创建一个CUBE,创建一个c#文件,并输入如下代码:
void Update () { //定义一条射线,起点为Vector3.zero终点为物体坐标 Ray ray=new Ray(Vector3.zero,transform.position); //定义一个光线投射碰撞 RaycastHit hit; //发射射线长度为100 Physics.Raycast(ray,out hit,100); //在Scene中生成这条射线,起点为射线的起点,终点为射线与物体的碰撞点 Debug.DrawLine(ray.origin,hit.point); }