c# - Unity 3d - 玩家在接触墙壁后不断移动
问题描述
在我的玩家对象接触到墙壁后,它有时会开始自行移动和旋转。我试图增加玩家对象的重量,这会有所帮助,但我认为这不是一个好方法,因为微小的运动永远不会消失。
玩家是刚体,附有盒子对撞机。
isKinematic - 错误;使用重力——真;XYZ旋转固定,Y坐标位置固定。
墙壁有盒子对撞机,但没有刚体。地面没有碰撞器,因为 Y 位置是固定的并且玩家对象不接触地面。
游戏是基于网络的,所以我也将光子刚体视图组件附加到玩家身上。
移动玩家的代码(C#):
public void Update()
{
if (!photonView.IsMine || !controllable)
{
return;
}
if (shootingTimer > 0.0)
{
shootingTimer -= Time.deltaTime;
}
m_MovementInputValue = Input.GetAxis(m_MovementAxisName);
if (m_MovementInputValue == 0.0f)
{
m_MovementInputValue = joystick.Vertical;
}
m_TurnInputValue = Input.GetAxis(m_TurnAxisName);
if (m_TurnInputValue == 0.0f)
{
m_TurnInputValue = joystick.Horizontal;
}
Vector3 vector = new Vector3(
m_TurnInputValue,
rigidbody.velocity.y,
m_MovementInputValue
);
MovementVector = Quaternion.AngleAxis(60, Vector3.up) * vector;
EngineAudio();
}
public void FixedUpdate()
{
if (!photonView.IsMine || !controllable)
{
return;
}
Move();
Turn();
}
private void Move()
{
// Adjust the position of the tank based on the player's input.
// Vector3 movement = transform.forward * m_MovementInputValue * m_Speed * Time.deltaTime;
// rigidbody.MovePosition(rigidbody.position + movement);
Vector3 movement = MovementVector * m_Speed * Time.deltaTime;
rigidbody.MovePosition(rigidbody.position + movement);
}
private void Turn()
{
// Adjust the rotation of the tank based on the player's input.
// float turn = m_TurnInputValue * m_TurnSpeed * Time.deltaTime;
// Quaternion turnRotation = Quaternion.Euler(0f, turn, 0f);
// rigidbody.MoveRotation(rigidbody.rotation * turnRotation);
if (m_TurnInputValue != 0.0f || m_MovementInputValue != 0.0f)
{
rigidbody.rotation = Quaternion.LookRotation(MovementVector);
}
}
解决方案
检查以确保组件(例如刚体)连接到正确的对象(游戏对象 - 父对象与子对象)。此外,它不断旋转的事实很奇怪......这让我觉得它与 Time.DeltaTime 有关,但我看到它只应用于你的 Vector3 运动,而不是你的旋转功能......只是好奇,当您从运动 Vector3 中删除 Time.DeltaTime 部分时会发生什么?
推荐阅读
- python - 如何调试 Python 脚本,通过管道输入哪些项目?
- docker - 仍然对docker感到困惑
- django - Django查询参数到数组
- indexing - 如何使用 BatchGetItem 每次为 DynamoDB 中的多个键获取 10 条记录?
- python - My search input functions works, but it only prints the last person's information in the list of dicts
- android - 在 Kotlin 中更改 Android TabLayout 中选项卡的大小
- c++ - ACDOtoolkit - 未定义的参考运行 test.c
- git - 如何在不保存的情况下成功退出“vimdiff”(用作“git”的合并工具)?
- javascript - 如何访问数组中对象的属性
- ios - iOS钥匙串API线程安全吗?获取重复项异常