zoukankan      html  css  js  c++  java
  • Unity 碰撞检测

    武器与怪物的碰撞

    目前来说有三种思路,其实前两种算变种了:

    1、动画关键帧回调 + 范围检测。http://blog.csdn.net/u013700908/article/details/52888792

    这个是在Asset store上面下的一个例子中看到的,其实之前在做端游时,也差不多是这样做的,就是挥武器的动作到某一帧的时候,计算武器位中心的范围内有木有怪物,有的话,就给这个目标添加伤害。范围检测用到的函数是这个:

    Physics.OverlapSphere

     

    static function OverlapSphere(position: Vector3radius: float, layerMask: int = AllLayers): Collider[];
     
    Description

    Returns an array with all colliders touching or inside the sphere.

    这个方法其实对于大部分游戏来说是足够了,性能上也没有什么开销。

     

    2、动画关键帧回调 + 线性检测。

    这个是从下面这位同学这里看到的哈,思路就是在武器的运动轨迹上选几个点,然后在这几个点上做线性检测。感觉这个比较适合做拿斧子横向砍一刀哈。

    http://blog.sina.com.cn/s/blog_8373d8f00101989i.html

    不过我觉得不必要向上面的链接里面说的,每帧都取值来算,可以在动画设置几个关键帧,然后记录当前关键帧的点和上一个关键帧的点做射线检测。用到的函数是这个:

    Physics.Linecast

    static function Linecast(start: Vector3end: Vector3layerMask: int = DefaultRaycastLayers): bool;
     
    Description

    Returns true if there is any collider intersecting the line between start and end.

     

    3、碰撞体回调

    给武器上挂一个空的GameObject,然后给这个GameObject挂上一个Collider(勾选山IsTrigger)和RigidBody,然后监听void OnTriggerEnter( Collider other )事件。

    我这次做的这个Demo也就是用的这种哈,没有大规模的测试,只是做了一个Demo,据网上说这个会有性能上的开销,以后有机会测试一下。

    2、

    碰撞检测

        首先,我们得明确一点:即产生碰撞信息所需要的条件。事实上,在U3D中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非常广泛。为了完整的了解这两种方式,我们必须理解以下概念:
        (一)碰撞器是一群组件,它包含了很多种类,比如:Box Collider,Capsule Collider等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。
        (二)所谓触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。
        (三)在Unity3D中,主要有以下接口函数来处理这两种碰撞检测:


    触发信息检测:
    1.MonoBehaviour.OnTriggerEnter( Collider other )当进入触发器
    2.MonoBehaviour.OnTriggerExit( Collider other )当退出触发器
    3.MonoBehaviour.OnTriggerStay( Collider other )当逗留触发器

    碰撞信息检测:
    1.MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
    2.MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
    3.MonoBehaviour.OnCollisionStay( Collision collisionInfo )  当逗留碰撞器

    1.Static Collider 静态碰撞器
    指的是没有附加刚体而附加了碰撞器的游戏对象。这类对象会保持静止或很轻微的移动。这对于环境模型十分好用,比如刚体和墙面碰撞时而不会移动。

    2.Rigidbody Collider 
    刚体碰撞器
    指的是附加了刚体和碰撞器的游戏对象。

    3.Kinematic Rigidbody Collider 运动学刚体碰撞器
    在第2点得基础上勾选了刚体组件中的IsKinematic属性,如果要移动这类对象,就只能修改它的Transform,而不是用力。这类游戏对象还有许多其他的独特的使用情景。
    这三种碰撞器如果勾选了IsTrigger复选框,就变成了相应的触发器了。

     

    两个碰撞器要想检测到碰撞信息,至少有一个是Rigidbody Collider。

    两个注意
    注意1两个物体发生碰撞,如果要检测到碰撞信息,那么其中必有一个物体既带有碰撞器,又带有刚体,且检测碰撞信息的脚本必须附着在带有刚体的碰撞器上。

     

    注意2两个GameObject发生碰撞,要想检测到触发信息,最少要有一个刚体碰撞器并且勾选了IsTrigger复选框,另一个最少要有一个碰撞器组件,此时检测碰撞的脚本必须附加在那个带有刚体的触发器上。

     

    http://blog.sina.com.cn/s/blog_947a2cdd0102uz1k.html

     

     

     

    http://blog.csdn.net/myarrow/article/details/30213689
    1. }  
  • 相关阅读:
    1046 Shortest Distance (20 分)(模拟)
    1004. Counting Leaves (30)PAT甲级真题(bfs,dfs,树的遍历,层序遍历)
    1041 Be Unique (20 分)(hash散列)
    1036 Boys vs Girls (25 分)(查找元素)
    1035 Password (20 分)(字符串处理)
    1044 Shopping in Mars (25 分)(二分查找)
    onenote使用小Tip总结^_^(不断更新中...)
    1048 Find Coins (25 分)(hash)
    三个故事
    领导者的举止
  • 原文地址:https://www.cnblogs.com/wshyj/p/6346707.html
Copyright © 2011-2022 走看看