Unity是否有类似CollideWhenRigidBodyLeavesLayer方法的东西? 这是原因:
我的npc具有三种运动类型:步行,游泳和飞行
他们使用刚体进行运动,对走路的角色效果很好。
它对于飞行的角色也很有效。通过致电 Physics.IgnoreLayerCollision(FlyingCharacterLayer,WaterLayer) 飞行角色现在可以在水上飞行。
我的问题是,如何使我的游泳生物保持与水层重叠?
我已经打开 Physics.IgnoreLayerCollision(SwimmingCharacterLayer,WaterLayer) 因此,现在游泳角色可以与水重叠。
但是我该如何测试我的海洋生物正在离开水面并在此处造成碰撞,因此他转身继续游泳而不是演变为散步的鱼...
我的水平(以及水)是动态生成的,因此为碰撞测试添加外围障碍不是一个很好的选择。
此外,“地面”图形/层存在于“水”层之下,所以我认为没有一种测试与地面碰撞的好方法,因为我的鱼同时与地面和水重叠。 >
我希望我缺少一些基本的东西:)
谢谢!
更新: 我可以通过Physics.CheckSphere
检查我的游泳角色是否不再与水重叠但是我不知道该怎么办。 如果我尝试将他旋转180度,他会翻转每一帧,有时会回到水面,有时却不会...
if(Physics.CheckSphere(transform.position, 0.25f, LayerMask.NameToLayer("Water")) == false)
{
// Now I know that my fish is out of the water
// but I can not figure out how to turn him around
}
答案 0 :(得分:0)
我并不为此感到骄傲,但是在这里摆弄之后我才想到了。
似乎把鱼留在池塘里,但是反弹并不漂亮。
它也完全违反了“不对刚体进行大惊小怪”的规则...但是由于物理系统无论如何也无法与我合作...
enum CheckDirection { AHEAD, LEFT, RIGHT };
bool CheckAheadIsWater(CheckDirection dir = CheckDirection.AHEAD)
{
if(dir == CheckDirection.AHEAD)
return Physics.CheckSphere(transform.position + transform.forward * 1.5f, 0.5f, LayerMask.GetMask(Settings.LayerWater));
if(dir == CheckDirection.RIGHT)
return Physics.CheckSphere(transform.position + forward + transform.right * 2f, 0.5f, LayerMask.GetMask(Settings.LayerWater));
if(dir == CheckDirection.LEFT)
return Physics.CheckSphere(transform.position + transform.forward - transform.right * 2f, 0.5f, LayerMask.GetMask(Settings.LayerWater));
throw new System.Exception("No Check Existes For " + dir);
}
void Update()
{
if (!CheckAheadIsWater(CheckDirection.RIGHT))
{
print("about to leave water RIGHT");
//turn left 45 degrees
transform.rotation = Quaternion.LookRotation(transform.forward + transform.right * 0.5f);
}
if (!CheckAheadIsWater(CheckDirection.LEFT))
{
print("about to leave water LEFT");
//turn right 45 degrees
transform.rotation = Quaternion.LookRotation(transform.forward - transform.right * 0.5f);
}
if (!CheckAheadIsWater())
{
print("about to leave water AHEAD");
//bounce back 1 unit
physicalBody.MovePosition(transform.position - transform.forward);
//swim the opposite direction
transform.rotation = Quaternion.LookRotation(-transform.forward);
}
}