希望我的标题概括了我的问题。我在2D游戏中有一枚火箭,它只能在屏幕上水平移动。我希望它朝着玩家的手指(移动的方向)旋转,但无法找到一种方法来旋转对象,而又不旋转它所沿的整个轴线。我只是希望它看起来已经变了,但它应该一直沿x移动。我该怎么办?
void Start () {
//scoreT = GetComponent<TextMeshProUGUI> ();
gameSpeed = 1;
score = 0;
Rigidbody2D rb2d = GetComponent<Rigidbody2D> ();
}
// Update is called once per frame
void Update () {
float MoveHorizontal = Input.GetAxis ("Horizontal");
Vector2 Movement = new Vector2 (MoveHorizontal, 0.0f);
rb2d.rotation = Quaternion.Euler (0.0f, 0, 0f, rb2d.velocity.x * -tilt);
transform.Translate (MoveHorizontal * speed, 0, 0);
答案 0 :(得分:2)
您可以做的一件事就是修改rigidbody.rotation
火箭的火箭,使其在移动时朝一个方向或另一个方向倾斜。例如:
float tilt - 0.3f;
//In case you prefer the rotation in another axis you just need to modify the position of the rigidbody.velocity.x * -tilt
rigidbody.rotation = Quaternion.Euler (0.0f, 0.0f, rigidbody.velocity.x * -tilt);
由于您未添加任何代码,所以我不确定您如何移动火箭,因此我将发布一个通用代码,您需要根据自己的项目进行调整:
public class PlayerController : MonoBehaviour
{
public float speed;
//The tild factor
public float tilt;
//The limit within the spaceship can move
public Boundary boundary;
void FixedUpdate ()
{
//You will need to capture the screen touchs of the user for the inputs
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
//Applying the movement to the GameObject
Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
rigidbody.velocity = movement * speed;
//To ensure the GameObject doesnt move outside of the game boundary
rigidbody.position = new Vector3
(
Mathf.Clamp (rigidbody.position.x, boundary.xMin, boundary.xMax),
0.0f,
Mathf.Clamp (rigidbody.position.z, boundary.zMin, boundary.zMax)
);
//Here is where you apply the rotation
rigidbody.rotation = Quaternion.Euler (0.0f, 0.0f, rigidbody.velocity.x * -tilt);
}
}
顺便说一句,您正在做一个太空2D游戏,您可能会对本教程感兴趣:
https://unity3d.com/learn/tutorials/s/space-shooter-tutorial
答案 1 :(得分:1)
您想要的是在全局/世界空间中移动对象。看来您的火箭的移动目前正在本地空间内进行。因此,当您旋转火箭时,其本地坐标也会旋转。世界空间坐标是固定的,永远不会在您更换火箭时旋转。 Here是对此的另一种解释。
您还可以查看Transform.localPosition和Transform.position,看看您的火箭在使用一个或另一个时的表现。
答案 2 :(得分:1)
您可以使子画面/渲染器成为您的火箭GameObject的子代。 然后,您可以自由旋转精灵/渲染器,而无需更改移动父级GameObject的旋转。
这是一个骇人听闻的解决方案,但可以达到预期的效果。
答案 3 :(得分:0)
您必须相对于世界移动对象并在本地旋转。 因此,请使用Transform.position移动对象,并使用Transform.LocalRotation旋转对象。
或者您可以将必须旋转的零件作为平移对象的子项,然后旋转这些子项。