Unity项目之Ruby’Advebture笔记
unity碰撞判定逻辑(此次为标签判断)
OnTriggerEnter函数是每一帧进入碰撞体积的物体都会予以判定。通过标签判断碰撞需要销毁的物体,不发生销毁就返回空值即可。
1、两个物体都必须有碰撞器(Collider)组件;
2、其中一个物体的碰撞器(Collider)的IsTrigger属性必须勾上;
3、最重要的一点,其中一个物体必须有刚体(Rigidbody)组件。如果是一个运动的物体(如主角)去碰撞一个静止的物体,则刚体(Rigidbody)组件必须加在运动的物体上,否则无法触发OnOnTriggerEnter函数。所以这时候主角身上就要加一个Rigidboyd。
Bug描述:游戏主角在静止状态下,一个自动运动的敌人碰撞主角,如果敌人身上没有刚体(Rigidbody)组件,主角则不会受到伤害(不会执OnTriggerEnter函数中的代码)。
就是发生碰撞的主体一定是要带刚体的,即只有带刚体的碰撞体去撞其他碰撞体时,双方才会收到碰撞事件,比如:
一、控制A(刚体加碰撞体)撞击 静止的B(只有碰撞体),双方能收到碰撞事件。
二、控制B(只有碰撞体)撞击 静止的A(刚体加碰撞体),双方收不到碰撞事件。
三、让A(刚体加碰撞体)自由下落,然后控制B(只有碰撞体)去撞击A,双方能受到碰撞事件。
此外还有两点:
一、产生触发事件的两个物体会相互穿越,isTrigger检测的是可穿越碰撞,准确的说是因为开启IsTrigger那个物体会被物理引擎锁忽略掉,所以会产生两个物体穿越的情况。如果人物有Rigidbody,而且想让人物和地面产生碰撞事件且不穿过地面,可以不勾选isTrigger,用OnCollisionEnter(Collision collison)检测碰撞。
二、两个对象要么都收到碰撞事件,要么都收到触发事件,不会出现一个收到触发事件,一个收到碰撞事件的情况。
本次的项目的相关代码可如下:
//标签碰撞,需要勾选isTrigger
private void OnTriggerEnter2D(Collider2D collision)
{
PlayerController pc = collision.GetComponent<PlayerController>();
if (collision.tag == "player")
{
Debug.Log("碰到了草莓");
if (pc.MycurrentHealth < pc.MymaxHealth)
{
pc.changeHealth(1);
Destroy(this.gameObject);
}
}
}