1.需要在碰撞物体上加Collider,如果将collider的isTrigger打上勾的话就可以使用如下方法:
private void OnTriggerEnter(Collider other) //检测函数,并将检测的结果放入other变量中.
{
if (other.gameObject.tag==“player”) //将检测结果的碰撞对象 标签与player标签对比.判断是否相等
{
Debug.Log(“Collide the door”);
}
}
离开碰撞区域的函数如下:
private void OnTriggerExit(Collider other1)
{
if (other1.gameObject.tag==“player”)
{
Debug.Log(“exit the mat”);
}
}
如果没有勾选isTrigger的话使用OnCollisionEnter方法
注意:
OnCollisionEnter方法必须是在两个碰撞物体都不勾选isTrigger的前提下才能进入,反之只要勾选一个isTrigger那么就能进入OnTriggerEnter方法。
OnCollisionEnter方法要求碰撞的发起方必须拥有刚体,而被碰撞方有没有刚体并不重要。OnTriggerEnter方法则对此没有要求,只需要碰撞双方有一个具有刚体即可触发。即刚体是一个判断是否实现碰撞的是与否的标志。
2.射线检测
①鼠标发出射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray,out hit))
{
print(“鼠标点击了屏幕”);
}
②物体发出射线
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”)
{
//、、、、、
}
}
}
3.使用Physics.OverlapBox来判断碰撞
exp:
Vector3 modelOrgin1 = model.transform.position;
Vector3 modelOrigin2 = modelOrgin1 + new Vector3(0, 1, 0);
Vector3 boxCenter = modelOrigin2 + model.transform.forward * 5.0f;
Collider[] cols = Physics.OverlapBox(boxCenter, new Vector3(0.5f, 0.5f, 5f), model.transform.rotation, LayerMask.GetMask(isAI?“Player”:“Enemy”));
if (cols.Length == 0)
{
LockProcessA(null,false,false,isAI);
}
else
foreach (var col in cols)
{
if (lockTarget != null && lockTarget.obj == col.gameObject)
{
LockProcessA(null,false,false,isAI);
break;
}
LockProcessA(new LockTarget(col.gameObject, col.bounds.extents.y),true,true,isAI);
//loackDot.transform.position = Camera.main.WorldToScreenPoint(lockTarget.transform.position);
break;
}
}
备注:见官方文档https://docs.unity3d.com/ScriptReference/Physics.OverlapBox.html
4.取得游戏对象上 CharacterController组件的控制权,再利用碰撞语句检测是否发生碰撞.代码如下:
bool grounded=false;
void Upda(){
CharacterController controller = GetComponent();
//将游戏物体的运动情况存在变量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");
}
}