【问题标题】:Spaceship Character controller stuck in wall宇宙飞船角色控制器卡在墙上
【发布时间】:2016-04-24 16:33:03
【问题描述】:

我正在制作一个宇宙飞船飞行游戏,您可以在其中导航它通过洞穴隧道。问题最好在此处的视频中显示:

https://www.youtube.com/watch?v=0K2WdeL7f0A

使用角色控制器和脚本控制移动。脚本只调用controller.Move(<vector>),其中向量可以是任意方向。

角色控制器设置为:

Slope Limit: 180
Step Offset: 0.5
Skin Width: 0.3
Min Move Distance: 0
Center: (0,0,0)
Radius: 3
Height: 0.5

对撞机实际上是一个球体。我还检查了collisionFlags 说它的接触面。我还让对撞机 physicMaterial 的摩擦力为 0,并增加了一点弹性(0.5)。但不管这一切,我都无法阻止角色卡住。

如何防止角色卡在墙上?

【问题讨论】:

  • 感谢您提交状态报告。您是否有问题
  • controller.Move 方法的主体是什么?
  • 如果它使用变换函数来移动角色,那么它会覆盖物理引擎的计算。所以使用rigidbody.AddForce(directionVector)而不是转换函数可能会解决这个问题。
  • @Bahman_Aries:我不使用变换函数,实际上根本没有附加刚体 - 因为它使用 CharacterController。正如我所提到的,我调用 CharacterController::Move()
  • @spencer7593:宇宙飞船卡住不是预期行为 - 墙壁应该只是阻止垂直于其表面的运动,而不是阻止沿它们的运动。

标签: unity3d collision


【解决方案1】:

经过一些实验,我解决了这个问题。由于我使用平移增量来控制船的运动,因此我维护了自己的 Vector3 速度变量。问题是在碰撞时,我没有更新速度矢量以在碰撞方向上减速。下面的代码解决了它:

void OnControllerColliderHit(ControllerColliderHit hit)
{
    float velocityReduction = Vector3.Dot(velocity, hit.normal);
    velocity = velocity - velocityReduction * hit.normal;
}

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多