Chr*_*ris 17 unity-game-engine game-physics
我无法将游戏对象保留在包含的空间内.当它们到达边缘时,会有一些瞬间推回,但随后它们将穿过墙壁.
我在玩家上使用了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);
Run Code Online (Sandbox Code Playgroud)
通过子弹,它们被赋予速度并且引擎计算他们的电影.他们正在使用Box Collider并将其设置为Trigger,因此他们没有物理.但我用它OnTriggerEnter
来摧毁它们.
//Projectiles without physics collisiions
function OnTriggerEnter (other : Collider) {
Destroy(gameObject);
}
Run Code Online (Sandbox Code Playgroud)
击中网眼对撞墙时,有些但不是所有的子弹都会被摧毁.玩家有时会击中并停止,但通常可以通过它.如何每次都与网格对撞机碰撞?
Pet*_*cio 12
我有一个弹球原型,在同样的领域给我带来了很多麻烦.这些是我几乎(但尚未完全)解决这些问题的所有步骤:
对于快速移动的物体:
将刚体的Interpolate设置为'Interpolate'(这不会影响实际的物理模拟,但会正确更新对象的渲染 - 仅在渲染视角的重要对象上使用它,如播放器或弹球,但不能用于射弹)
将碰撞检测设置为连续动态
将脚本DontGoThroughThings(https://www.auto.tuwien.ac.at/wordpress/?p=260)附加到您的对象.这个脚本巧妙地使用我在其他答案中发布的Raycasting解决方案,在碰撞点之前拉回有问题的对象.
将Min Penetration for Penalty设置为非常低的值.我把我的设定为0.001
将Solver Iteration Count设置为更高的值.我把我的设定为50,但你可以用更少的东西做好.
所有这些都将在性能上受到惩罚,但这是不可避免的.默认值在性能上是软的,但并不是真正用于正确模拟小型和快速移动的对象.
Pet*_*cio 11
与快速移动的物体碰撞总是一个问题.确保检测到所有碰撞的一种好方法是使用Raycasting而不是依赖于物理模拟.这适用于项目符号或小对象,但不会为大型对象产生良好的结果. http://unity3d.com/support/documentation/ScriptReference/Physics.Raycast.html
伪编码(我这里没有代码完成和内存不足):
void FixedUpdate()
{
Vector3 direction = new Vector3(transform.position - lastPosition);
Ray ray = new Ray(lastPosition, direction);
RaycastHit hit;
if (Physics.Raycast(ray, hit, direction.magnitude))
{
// Do something if hit
}
this.lastPosition = transform.position;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
105083 次 |
最近记录: |