使用鼠标在播放器周围旋转对象,但仍然符合物理

问题描述 投票:0回答:1

在我的游戏中,我希望角色能够拥有一个可以围绕玩家旋转的镐或武器,但是当我这样做时,它会穿过物体并且非常小问题。

我希望它仍然跟随鼠标(它是不可见的)并且在发生碰撞时仍然停止。我的代码现在只是非常标准的鼠标旋转代码,它附加到一个空的游戏对象,它是镐/武器的父亲

//rotation
Vector3 mousePos = Input.mousePosition;
mousePos.z = 5.23f;

Vector3 objectPos = Camera.main.WorldToScreenPoint(transform.position);
mousePos.x = mousePos.x - objectPos.x;
mousePos.y = mousePos.y - objectPos.y;

float angle = Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
c# unity3d physics
1个回答
0
投票

只要你有一个想要启用物理的GameObject,就不要直接移动它。你添加一个Rigidbody并使用RigidBody.MoveRotation来旋转你的GameObject。 RigidBody有一套考虑碰撞的运动和旋转方法。直接移动Transform会导致问题。

在某些情况下,这仍然可能导致问题。如果您仍然遇到物理怪异,那么您可以通过使用“物理上正确”的解决方案消除它们并使用Rigidbody.angularVelocity。根据角度,您可以将速度设置为向右或向左旋转对象,直到它面向您想要的方式。

基本上物理系统讨厌传送。即时动作和即时旋转基本上是传送到它。因此,“物理系统友好”的某些行为是如何层次结构的。它们是这样的:

  1. 为RigidBody添加力量
  2. 将速度添加到RigidBody
  3. 通过适当的RigidBody方法移动GameObject。
  4. 通过Transform移动GameObject。
© www.soinside.com 2019 - 2024. All rights reserved.