unity不使用刚体的碰撞检测
2015-08-16 11:01
507 查看
孙广东 2015.8.15
目的: 这篇文章的主要目的是为了让您了解有关于在Unity内如何使用没有刚体的碰撞检测。在这里,检查的只是垂直运动方向,但可以通过修改脚本,将对象添加到场景检查其他方向 (或更改cube 的位置。
unity就是 3D 的游戏引擎,带有内置物理Nvidia PhysX。游戏对象应用物理模拟必须具有刚体。它常用于碰撞检测。 假设我们只想要碰撞检测模拟物理学,然后只对碰撞检测使用物理引擎可能会降低整体性能。有两个解决办法:解决办法-1: 使刚体运动学和捕获触发器事件。解决方案-2: 不使用的刚体 (可能是最好的解决办法)!!! 使用 Raycast 是一个很好的选择。 你可以投数以百计的每帧的光线而多降低性能。这是(提供)一种casting来源射线的方向,然后确定光线如果投射与任何碰撞器的方法。我们可以使用这个处理碰撞检测,通过casting射线在 x 和 y 轴,以得到确认的游戏物体的周围环境。我们将按照下面给出的步骤: 1、获得游戏对象的方向。 2、投射光线。 3、从命中结果确定碰撞体。简单的 raycast 代码看起来像这样:
在这里,第一个参数是射线的原点,第二个参数是射线的方向和第三个参数是射线的长度。Unity允许获取结果,
例如,让我们使Cube,当它与另一个Cube相撞的可以回去。
1. 3个Cube,如下图所示。
添加 Box Collider。将 CollisionDetector 脚本添加到中间的Cube,放置在其他两个Cube (在上面的图像中选取) 之间的。在 CollisionDetector 脚本中,使之Cube与上方或下方的碰撞 就相反。CollisionDetector.cs
解释在这里 NoOfRays 和Moving force 是公共变量,所以它可以在运行时根据需要改变了。请确保移动速度不超过该Cube在顶部和底部之间的距离。
DirectionFactor 成倍增加的运动力和射线的方向,因为它用来决定的方向。最初,它设置为向上 (正 y 轴) 方向。尽快移动相撞其他Cube的Cube被扭转这个方向决胜局。通过改变方向矢量,可以根据要求改变方向。DirectionFactor 仅用于反转方向。
目的: 这篇文章的主要目的是为了让您了解有关于在Unity内如何使用没有刚体的碰撞检测。在这里,检查的只是垂直运动方向,但可以通过修改脚本,将对象添加到场景检查其他方向 (或更改cube 的位置。
unity就是 3D 的游戏引擎,带有内置物理Nvidia PhysX。游戏对象应用物理模拟必须具有刚体。它常用于碰撞检测。 假设我们只想要碰撞检测模拟物理学,然后只对碰撞检测使用物理引擎可能会降低整体性能。有两个解决办法:解决办法-1: 使刚体运动学和捕获触发器事件。解决方案-2: 不使用的刚体 (可能是最好的解决办法)!!! 使用 Raycast 是一个很好的选择。 你可以投数以百计的每帧的光线而多降低性能。这是(提供)一种casting来源射线的方向,然后确定光线如果投射与任何碰撞器的方法。我们可以使用这个处理碰撞检测,通过casting射线在 x 和 y 轴,以得到确认的游戏物体的周围环境。我们将按照下面给出的步骤: 1、获得游戏对象的方向。 2、投射光线。 3、从命中结果确定碰撞体。简单的 raycast 代码看起来像这样:
if (Physics.Raycast(transform.position, Vector3.forward, 10)) print("There is something in front of the object!");
在这里,第一个参数是射线的原点,第二个参数是射线的方向和第三个参数是射线的长度。Unity允许获取结果,
RaycastHit hitInfo; if (Physics.Raycast(transform.position, Vector3.down, out hitInfo)) print(“There is something ” + hitInfo.distance +”m away from gameobject”);
例如,让我们使Cube,当它与另一个Cube相撞的可以回去。
1. 3个Cube,如下图所示。
添加 Box Collider。将 CollisionDetector 脚本添加到中间的Cube,放置在其他两个Cube (在上面的图像中选取) 之间的。在 CollisionDetector 脚本中,使之Cube与上方或下方的碰撞 就相反。CollisionDetector.cs
using UnityEngine; using System.Collections; public class CollisionDetector : MonoBehaviour { public float MovingForce; Vector3 StartPoint; Vector3 Origin; public int NoOfRays = 10; int i; RaycastHit HitInfo; float LengthOfRay, DistanceBetweenRays, DirectionFactor; float margin = 0.015f; Ray ray; void Start () { //Length of the Ray is distance from center to edge LengthOfRay = collider.bounds.extents.y; //Initialize DirectionFactor for upward direction DirectionFactor = Mathf.Sign (Vector3.up.y); } void Update () { // First ray origin point for this frame StartPoint = new Vector3 (collider.bounds.min.x + margin,transform.position.y,transform.position.z); if (!IsCollidingVertically ()) { transform.Translate (Vector3.up * MovingForce * Time.deltaTime * DirectionFactor); } } bool IsCollidingVertically () { Origin = StartPoint; DistanceBetweenRays = (collider.bounds.size.x - 2 * margin) / (NOofRays - 1); for (i = 0; i<NOofRays; i++) { // Ray to be casted. ray = new Ray (Origin, Vector3.up * DirectionFactor); //Draw ray on screen to see visually. Remember visual length is not actual length. Debug.DrawRay (Origin, Vector3.up * DirectionFactor, Color.yellow); if (Physics.Raycast (ray, out HitInfo, LengthOfRay)) { print ("Collided With " + HitInfo.collider.gameObject.name); // Negate the Directionfactor to reverse the moving direction of colliding cube(here cube2) DirectionFactor = -DirectionFactor; return true; } Origin += new Vector3 (DistanceBetweenRays, 0, 0); } return false; } }
解释在这里 NoOfRays 和Moving force 是公共变量,所以它可以在运行时根据需要改变了。请确保移动速度不超过该Cube在顶部和底部之间的距离。
DirectionFactor 成倍增加的运动力和射线的方向,因为它用来决定的方向。最初,它设置为向上 (正 y 轴) 方向。尽快移动相撞其他Cube的Cube被扭转这个方向决胜局。通过改变方向矢量,可以根据要求改变方向。DirectionFactor 仅用于反转方向。
相关文章推荐
- GameUnity 2.0 文档(五) 人工智能之---------------Flocking算法 (聚集,分散,列队 )
- Unity3D面试题总结
- unity常见面试题
- Unity Shader 学习笔记 (五) 积雪效果Shader
- 全新的Unity移动游戏优化解决方案
- Unity Shader 学习笔记 (四) Pass里可用的渲染没置命令
- Unity Shader 学习笔记 (三) CG 标准函数库
- Unity3D面试题整合
- Unity插件之TDTK的学习之个性Towers(三)
- Unity Action Game Demo(2)NGUI实现摇杆
- Unity3D:Graphics.BlitMultiTap方法
- Unity Action Game Demo(1)
- unity插件之TDTK的学习之Editor与Manager(二
- Unity3d-Socket之龙一编年史network.dll分析(1)
- Unity3d-Socket之龙一编年史network.dll分析(1)
- Unity Shader:Projective Texture Mapping
- Unity3d之截图方法
- Unity Assets目录下的特殊文件夹名称(作用和是否会被打包到build中)
- Unity3D 5.1.2 html文档打开很慢解决办法
- Unity3d设计模式之单例模式