用鼠标围绕播放器旋转对象,但仍要符合物理原理

时间:2018-09-02 23:39:44

标签: c# unity3d physics

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

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

//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));

1 个答案:

答案 0 :(得分:0)

每当要启用物理功能的GameObject时,都不要直接移动它。您添加一个Rigidbody并使用RigidBody.MoveRotation旋转您的GameObject。 RigidBody拥有一组考虑碰撞的运动和旋转方法。直接移动Transform会引起问题。

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

从本质上讲,物理系统讨厌隐形传送。即时运动和即时旋转基本上是对其的传送。因此,对于某些动作来说,存在“如何对物理系统友好”的层次结构。他们会像这样:

  1. 为RigidBody增添力量
  2. 为RigidBody添加速度
  3. 通过适当的RigidBody方法移动GameObject。
  4. 通过Transform移动GameObject。