【发布时间】:2012-03-13 16:39:52
【问题描述】:
我无法将游戏对象保存在封闭空间内。当他们到达边缘时,会有一些短暂的后退,但他们会直接穿过墙壁。
我在播放器上使用了 Box Collider,在关卡的墙壁上使用了 Mesh Collider。我对移动由玩家控制的玩家角色(太空船)都有问题。还有射弹,它们是火的,不会以恒定的速度移动。
这是我的播放器的移动代码。它正在FixedUpdate() 函数中运行。
//Movement
haxis = Input.GetAxis("Horizontal") * speed;
vaxis = Input.GetAxis("Vertical") * speed;
moveVector.x = haxis;
moveVector.z = vaxis;
if(moveVector.magnitude > 1)
{
moveVector.Normalize();
}
rigidbody.MovePosition(transform.position + moveVector * speed);
使用子弹,它们被赋予一个速度,引擎计算它们的动画。他们正在使用 Box Collider,它被设置为触发器,所以他们没有物理。但我使用OnTriggerEnter 来销毁它们。
//Projectiles without physics collisiions
function OnTriggerEnter (other : Collider) {
Destroy(gameObject);
}
一些但不是所有的子弹在击中网格对撞机墙壁时会被摧毁。玩家有时会撞到它并停下来,但通常可以通过它。如何使与网格碰撞器的碰撞每次都能正常工作?
【问题讨论】:
-
我什至用墙的网格创建了一个更简单的网格对撞机,但没有帮助。
-
您在屏幕上使用的网格碰撞器有多宽,子弹和玩家移动的速度有多快?如果子弹或玩家在一帧中可以移动比对撞机更长的距离,那么你就有了。另外,我会避免手动移动刚体。这只会混淆物理引擎并阻止其优化。而是移动游戏对象的变换。
-
@Elideb 对撞机大约有 8 个字符和 20 个子弹宽。它们并没有在单个帧中完全穿过对撞机。如果你移动变换 Unity 将忽略所有物理,rigidbody.MovePosition 会考虑物理。
-
你说得对,我的关系正好相反。计算速度时是否考虑了 deltaTime?你的角色会反复撞墙直到它通过吗?你的角色在 OnCollision 上做了什么?
-
@Elideb
MovePosition()调用是作为FixedUpdate()的结果调用的,因此不需要 deltaTime。我无法找到碰撞工作/失败的真实行为模式。
标签: unity3d game-physics