我有一个非常奇怪的问题,我为我的游戏统一创建了自定义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);
}
}
编辑:
答案 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)
在暴民上使用Rigidbody
和CharacterController
时发生了此问题。从暴民中移除Rigidbody
可以解决此问题。