刚体小怪在行走时跌落地面

时间:2018-10-18 17:24:09

标签: c# unity3d

我有一个非常奇怪的问题,我为我的游戏统一创建了自定义MOB AI(它具有程序生成的体素世界,因此代理不能很好地工作)。我在移动的小怪上使用刚体。

但是我有一个问题,就是小生物在移动时会进入地板内(站立时不会发生),站立时会向后移动!这不是动画,我禁用了动画,但它仍然会发生。

这是我移动它们的方式:

   private void WalkToTarget()
{
    if (goal != Vector3.zero)
    {
        if (goal.y <= 5)
        {
            currentstatus = MOBSTATUS.STANDING;
            return;
        }
        var distance = Vector3.Distance(VoxelPlayPlayer.instance.transform.position, gameObject.transform.position);
        if (distance < 15)
        {
            goal = VoxelPlayPlayer.instance.transform.position;
            goal.y = VoxelPlayEnvironment.instance.GetHeight(goal);
        }
        if (distance < 5)
        {
            this.currentstatus = MOBSTATUS.ATTACKING;
        }
        //MOVEMENT HAPPENS HERE
        Vector3 direction = (goal - mobcontroller.transform.position).normalized*2f;
        if(mobcontroller.collisionFlags!=CollisionFlags.CollidedBelow)
        direction+= Vector3.down;
        mobcontroller.Move(direction * Time.fixedDeltaTime);
        RotateTowards(direction);
    }
}

编辑:

所有代码:https://pastebin.com/khCmfKGi

2 个答案:

答案 0 :(得分:1)

部分问题是您使用的CollisionFlags错误。

代替此:

if(mobcontroller.collisionFlags!=CollisionFlags.CollidedBelow)

您需要这样做

if(mobcontroller.collisionFlags & CollisionFlags.CollidedBelow)

因为您要检查的是下面的生物是否至少碰撞,而不是如果下面的生物仅是 碰撞。

即使如此,CharacterController.Move也不应使您自己通过对撞机

在某些情况下,我怀疑RotateTowards(direction)可能会在地面上旋转暴民对撞机的边界。为避免这种情况,我建议创建一个lookDirection,使您在执行RotateTowards时保持字符旋转平整:

Vector3 direction = (goal - mobcontroller.transform.position).normalized*2f;
if(mobcontroller.collisionFlags & CollisionFlags.CollidedBelow)
    direction+= Vector3.down;
mobcontroller.Move(direction * Time.fixedDeltaTime);

Vector3 lookDirection = (goal - mobController.transform.position);
lookDirection.y = mobController.transform.y;
RotateTowards(lookDirection);

答案 1 :(得分:0)

在暴民上使用RigidbodyCharacterController时发生了此问题。从暴民中移除Rigidbody可以解决此问题。