Unity3D碰撞检测的方法

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");
    }

}

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3d中有两种检测碰撞发生的方式,一种是利用碰撞器,另一种是利用触发器。碰撞器是一组组件,包括Box Collider、Capsule Collider等,它们必须添加到GameObject上。而触发器只需要在碰撞器组件的检视面板中勾选IsTrigger属性选择框。在Unity3d中,我们可以使用以下接口函数来处理这两种碰撞检测: - 触发信息检测: - MonoBehaviour.OnTriggerEnter(Collider other):当进入触发器时调用。 - MonoBehaviour.OnTriggerExit(Collider other):当退出触发器时调用。 - MonoBehaviour.OnTriggerStay(Collider other):当逗留在触发器中时调用。 - 碰撞信息检测: - MonoBehaviour.OnCollisionEnter(Collision collisionInfo):当进入碰撞器时调用。 - MonoBehaviour.OnCollisionExit(Collision collisionInfo):当退出碰撞器时调用。 - MonoBehaviour.OnCollisionStay(Collision collisionInfo):当逗留在碰撞器中时调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Unity3D入门(二):碰撞检测](https://blog.csdn.net/zooen2011/article/details/12245529)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Unity3D —— 碰撞检测](https://blog.csdn.net/wxy15979115440/article/details/103609899)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Unity 3D之碰撞检测](https://blog.csdn.net/m0_74427422/article/details/129170479)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值