Unity3D总结记录(五)Unity中关于碰撞检测的⼏种⽅法总结Unity中,对于游戏对象的碰撞检测有多种⽅法,今后在开发的过程中,可视情况⽽定,选⽤哪⼀种检测⽅法.
⾸先,忽略两个物体碰撞可采⽤如下语句:
Physics.IgnoreCollision(newBullet.GetComponent<Collider>(),GetComponent<CharacterController>(),true);
1.1 在需要检测碰撞的物体上添加碰撞器,如:Box Collider、capsule Collider、Sphere Collider等.然后编写脚本,使⽤如下⽅法检测碰撞状态,此⽅法的好处是,只需要将脚本挂在检测物体对象上即可,⽆需将检测脚本挂在游戏⾓⾊⾝上,减轻⾓⾊挂载脚本的负荷.
private void OnTriggerEnter(Collider other)  //检测函数,并将检测的结果放⼊other变量中.
{
if (other.gameObject.tag=="player")    //将检测结果的碰撞对象标签与player标签对⽐.判断是否相等
{
theDoor.GetComponent<Animation>().Play("Default Take");
Debug.Log("Collide the door");
}
}
1.2 相对应的,离开碰撞区域的函数如下:
private void OnTriggerExit(Collider other1)
{
if (other1.gameObject.tag=="player")
{
Debug.Log("exit the mat");
}
}
2.1光线投射⽅法,此⽅法⽆论射线碰到什么物体都会有反应,且没有存储射线碰到物体的信息,代码如下:
//光线发射起点Vector3,⽅向Vector3,发射距离float.直接返回bool类型.对应if语句内的操作
if (Physics.Raycast(transform.position, transform.forward, 3))
{
GameObject.Find("outPost").GetComponent<Animation>().Play("Default Take");
}
2.2      //创建⼀条从游戏物体发射⾄前⾯3⽶的射线
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 (llider.gameObject.tag=="tagDoor")
{
GameObject.Find("outPost").GetComponent<Animation>().Play("Default Take");
}
}
}
3.取得游戏对象上 CharacterController组件的控制权,再利⽤碰撞语句检测是否发⽣碰撞.代码如下:
bool grounded=false;
void Upda(){
CharacterController controller = GetComponent<CharacterController>();
/
/将游戏物体的运动情况存在变量flags中,以便下⾯对游戏物体进⾏检测
CollisionFlags flags= controller.Move(moveDirection * Time.deltaTime);
//检测游戏⾓⾊碰撞信息flags与CollisionFlags.CollidedSides中存放的信息进⾏⼆进制与运算.并将结果返回
/*
CollisionFlags.CollidedBelow  底部发⽣了碰撞"flags & CollisionFlags.CollidedBelow"返回1;
CollisionFlags.CollidedNone    没发⽣碰撞"flags & CollisonFlags.CollidedNone"返回1;
CollisionFlags.CollidedSides  四周发⽣碰撞"flags & CollisionFlags.CollidedSides"返回1;
CollisionFlags.CollidedAbove  顶端发⽣了碰撞"flags & CollisionFlags.CollidedAbove"返回1;
*/
//grounded = (CollisionFlags.CollidedSides & flags) != 0;  //  检测游戏物体四周是否发⽣碰撞,如发⽣碰撞,返回true执⾏下⾯if语句中的内容;
//grounded = (CollisionFlags.CollidedBelow & flags) != 0;  //  检测游戏物体四周是否发⽣碰撞,如发⽣碰撞,返回true执⾏下⾯if语句中的内容;
grounded = (CollisionFlags.CollidedAbove & flags) != 0;  //  检测游戏物体四周是否发⽣碰撞,如发⽣碰撞,返回true执⾏下⾯if 语句中的内容;
if (grounded)
{
player.GetComponent<Animation>().Play("Default Take");
}
}
4. 关于2D物体碰撞的检测,具体检测函数可参考API编程⼿册,以下是其中碰撞检测的⼀个函数应⽤举例:
⾸先需要给检测的两个物体都添加Rigidbody2D及Box Collider碰撞检测组件。函数如下:
void OnTriggerEnter2D(Collider2D other)
{
Debug.Log("Collider");
if (other.tag == "Player")
unity3d animation{
Destroy(other.gameObject);
}
}
其他关于2D碰撞的检测函数参考API编程⼿册中搜索Collider。
如上三种碰撞检测⽅法,都可在游戏开发中使⽤,可根据实际情况选择.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。