刚体角色在与墙碰撞时反弹(Autowalk.cs)
本文关键字:Autowalk cs 碰撞 角色 | 更新日期: 2023-09-27 18:01:14
我正在用https://github.com/JuppOtto/Google-Cardboard/blob/master/Autowalk.cs作为移动玩家的脚本。到目前为止,我还没有发现任何对我有帮助的东西,我试着摆弄物理材料,冻结/解冻刚体的约束,将角阻力设置为无穷大,等等。
正如我所了解到的,问题应该是我的刚体正在穿透上面有网格对撞机的墙,它被推回,这导致了这种奇怪的"弹性行为"。感觉就像刚体角色不断地试图穿过墙壁,尽管它做不到。
在大多数情况下,这不会是一个太大的问题,但游戏中的一些角落有其他较小的物体,上面也有网格碰撞器,如果玩家进入这些物体和墙壁之间,它们就会被推(弹(出游戏区域,完全穿过墙壁。
这是我角色移动的原因,我认为这必须改为其他原因:
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坐标,因此不会翻转。
墙(三维模型(上有一个简单的网格碰撞器,仅此而已。
我想我还应该提到,我不希望角色在与墙壁碰撞时停止,因此我不认为使用触发器是个好主意。只有当玩家直接面对墙壁时与墙壁相撞时,才可以完全停止,但如果有角度,我希望玩家沿着墙壁"滑动"。
您也可以删除刚体组件,而在播放器上使用CharacterController组件,并使用SimpleMove函数而不是平移播放器。"平移"函数将玩家设置在一个新的"矢量"位置,这将使玩家与墙相交,而不是与墙碰撞。
您必须打开interpolation
(将其设置为Interpolate
(,并在刚体上设置isKinematic
,然后使用Rigidbody.MovePosition
。MovePosition
将插值到给定位置,并且不允许Rigidbody
穿过对象。设置transform.position
或Rigidbody.position
会传送Rigidbody
,这可能是不可取的。
您也可以放弃Rigidbody
,转而使用CharacterController
,这样就可以更容易地移动字符,而不必一直处理刚体。