与墙壁碰撞时刚体角色弹跳(Autowalk.cs)

时间:2016-08-07 06:25:52

标签: c# unity3d

我使用https://github.com/JuppOtto/Google-Cardboard/blob/master/Autowalk.cs作为移动播放器的脚本为Google Cardboard构建VR迷宫游戏。到目前为止,我发现没有任何东西可以帮助我,我已经尝试过乱搞物理材料,冻结/解冻我的刚体,将角度拖动到无限等等。

正如我所了解的那样,问题应该是我的刚体正在穿透墙壁上有网状对撞机并且它被推回而导致这种奇怪的弹性行为"。它几乎感觉就像刚刚人不断试图通过墙壁,即使它不能。

在大多数情况下,这不会是一个问题太大,但游戏中有一些角落有其他较小的物体,它们上面也有网格碰撞器,玩家应该介入这些物体和在墙壁上,它们只会被推动(反弹)出游戏区域并完全穿过墙壁。

这是负责我角色运动的一点,我相信这必须改为别的:

if (isWalking) 
{
    Vector3 direction = new Vector3(head.transform.forward.x, 0, head.transform.forward.z).normalized * speed * Time.deltaTime;
    Quaternion rotation = Quaternion.Euler(new Vector3(0, -transform.rotation.eulerAngles.y, 0));
    transform.Translate(rotation * direction);
}

以下是关于我设置的一些信息:

具有移动脚本的角色有一个胶囊对撞机和一个质量为1的刚体:拖动和角度拖动:0;使用重力,不是运动学,插入设置为无,碰撞检测设置为离散。位置不会冻结,但旋转适用于所有X,Y和Z坐标,因此它不会摔倒。

墙壁(3D模型)上有一个简单的网格对撞机,仅此而已。

我想我还应该提到,我不希望角色在与墙壁发生碰撞时停止,因此我不会想到使用触发器,这是一个好主意。完全停止只有当玩家直接面对墙壁碰撞时才能接受,但如果有一个角度,我希望玩家能够滑动"沿着墙。

2 个答案:

答案 0 :(得分:1)

您也可以删除Rigidbody组件,而是使用播放器上的CharacterController组件并使用SimpleMove功能而不是翻译播放器。 Translate功能将玩家设置在一个新的Vector位置,这将使玩家与墙壁相交而不是与他们相撞。

答案 1 :(得分:0)

您必须打开interpolation(将其设置为Interpolate)并在您的刚体上设置isKinematic并使用Rigidbody.MovePosition代替。 MovePosition 插入到给定位置,允许Rigidbody通过对象。设置transform.positionRigidbody.position 传送代替Rigidbody,这可能是不受欢迎的。

您还可以放弃Rigidbody并使用CharacterController,这样可以更轻松地移动角色,而无需始终处理刚体。