游戏场景中各类物体碰撞设计实战

3D游戏场景中很多碰撞对象需要处理,总体分为,一墙壁、树木、岩石等环境静态类,二人物角色、本地操作玩家、NPC、AI等脚本控制移动类,三子弹、技能球、技能碰撞物等速度快的物体。这三类的碰撞分析大概为,第一种只需要加collider组件,不要加rigidbody,因为这两个组合实现只有碰撞,没有碰撞效果,如位移、旋转等,没有刚体rigidbody,就不会有碰撞效果,就好像人只是棉花做的,不会有任务碰撞效果,所以最适合做这种静态障碍物。第二种角色(通常不会产生碰撞或者被碰撞效果的物体)类,运用character controller组件,这个组件内含胶体碰撞器,可以检测到碰撞,刚体分为静态动态两种,也有内置。所以只要这一个组件就行,不要再添加collider和rigidbody,可以实现碰撞,但是不会有位移旋转等效果,比较适合角色类,因为是脚本操作移动,并且比较节约资源。他的碰撞检测函数为 void OnControllerColliderHit(ControllerColliderHit hit),不是传统的OnCollisionEnter这一类。第三种高速类物体的碰撞最后用raycast检测碰撞,
Ray myRay = new Ray(transform.position, (transform.position + transform.forward * 3));

RaycastHit hit;   //创建RaycastHit型变量,用于存放射线碰撞信息

//发设一条射线,myRay距离3长,碰撞到的物体信息存放在hit中,放在下面进行判断。

if (Physics.Raycast(myRay,out hit,3))   
{
    if (hit.collider.gameObject.tag=="tagDoor")
    {
        GameObject.Find("outPost").GetComponent().Play("dd");
    }
}
附第二种情况的重力效果,因为CharactorController不会用重力效果,所以Y轴方向需要在Update()更新方法中添加实现代码,如下:
if(!m_CharacterController.isGround)
m_CharacterController.Move( transform.up * Time.deltaTime * -9.81f );

你可能感兴趣的:(游戏开发,unity)