Unity检测目标是不是在攻击范围内

发表于2017-07-18
评论0 1.14w浏览

在游戏设计中,有的技能的攻击范围有一定的区域限制,那么如何去判断场景中的怪物是否在攻击范围内呢。一个点是否在扇面上只需要判定,目标点与原点的距离是否大于半径&目标点与原点朝向的角度在扇形角度中,就可以了。

第一步:以玩家为原点向玩家朝向给定一个已知距离的向量
第二步:给定扇形角度,已第一步得到的向量作为中分轴
第三步:求目标点与角色的距离得到向量并判定距离是否大于半径
第四部:由第一步和第三步的向量得到角度 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脚本”。

基于两个碰撞对象的配置,可以产生很多不同的效果。下表概括了基于附加不同组件的两个碰撞对象所产生的效果。其中有些组合只能导致碰撞的两个对象中的一个受到影响,.所以考虑到保持标准的规则-物理效果将不会对没有附加刚体的对象生效。

Collision detection occurs and messages are sent upon collision
Static ColliderRigidbody ColliderKinematic Rigidbody ColliderStatic Trigger ColliderRigidbody Trigger ColliderKinematic Rigidbody Trigger Collider
Static ColliderY
Rigidbody ColliderYYY
Kinematic Rigidbody ColliderY
Static Trigger Collider
Rigidbody Trigger Collider
Kinematic Rigidbody Trigger Collider
Trigger messages are sent upon collision
Static ColliderRigidbody ColliderKinematic Rigidbody ColliderStatic Trigger ColliderRigidbody Trigger ColliderKinematic Rigidbody Trigger Collider
Static ColliderYY
Rigidbody ColliderYYY
Kinematic Rigidbody ColliderYYY
Static Trigger ColliderYYYY
Rigidbody Trigger ColliderYYYYYY
Kinematic Rigidbody Trigger ColliderYYYYYY

 


射线和碰撞器

射线是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);   
       }

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签:

0个评论