【问题标题】:Rigidbody Mobs fall through ground while walking刚体暴徒在行走时从地面坠落
【发布时间】:2018-10-19 05:21:44
【问题描述】:

我有一个非常奇怪的问题,我为我的游戏创建了统一的自定义 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

【问题讨论】:

  • 你的地面上有碰撞器吗?
  • @Ruzihm 是的。似乎有时 if 语句在移动时是正确的,这使得它降低了 Y 值。 if 语句是检查玩家是否接地,如果不添加重力,但由于某种原因,有时当它接地并运行时它也不会检测到地面,并且它随机发生,有时会,有时不会。我也尝试过正常地形和同样的问题

标签: c# unity3d


【解决方案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);

【讨论】:

  • 它不允许我将 && 与碰撞标志一起使用。但是我尝试了: if (!((mobcontroller.collisionFlags & CollisionFlags.Below)!=0)) 并且问题仍然存在。我将编辑所有代码,您可以看到我没有在任何地方更改 colider 的位置。
  • 抱歉,是的,这是一个错字。我编辑了我的答案并包含了更多信息。
【解决方案2】:

在暴徒上使用RigidbodyCharacterController 时会出现此问题。从暴民中删除Rigidbody 解决了这个问题。

【讨论】:

  • 是的。奇怪的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多