了解Unity eulerAngles(如何将2D对象的旋转限制为45度?)

时间:2018-06-02 10:09:16

标签: c# unity3d rotation 2d euler-angles

请记住,我是一个完全的初学者。

我正在尝试制作太空射击游戏。我有一个面朝上的2D精灵和这段代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

    public float speed = 5.0f;

    private void Start()
    {
        transform.position = Vector3.zero;

    }

    private void Update()

    {
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");



        Vector3 eulerAngles = transform.rotation.eulerAngles;
        //Debug.Log("transform.rotation angles x: " + eulerAngles.x + " y: " + eulerAngles.y + " z: " + eulerAngles.z); 

        transform.Translate(Vector3.right * speed * horizontalInput * Time.deltaTime, Space.World);
        transform.Translate(Vector3.up * speed * verticalInput * Time.deltaTime, Space.World);

        if (horizontalInput > 0)
        {
            transform.Rotate(new Vector3(0, 0, -1) * horizontalInput * Time.deltaTime * 300);
        }

        else if (horizontalInput < 0)
        {
            transform.Rotate(new Vector3(0, 0, -1) * horizontalInput * Time.deltaTime * 300);
        }

        if (eulerAngles.z > 45)
        {
            //transform.rotation = Quaternion.AngleAxis(45, Vector3.forward);
            Debug.Log("45");


        if (eulerAngles.z < -45)
        {
            //transform.rotation = Quaternion.AngleAxis(-45, Vector3.forward);
            Debug.Log("-45");
        }

现在,我希望日志说&#34; 45&#34;当Transform.rotation.z中的值达到45时,&#34; -45&#34;当它达到-45。我的真实意图(在代码中注释掉)是告诉精灵在45或-45度停止旋转。

当我按向左箭头直到它旋转到45时,它会起作用。但问题出在这里......当我按向右箭头,并且Transform.rotation.z的值变为负数时,日志会立即显示&#34; 45&#34;好像任何负数都不会超过45。

我注意到当我在Unity中旋转精灵时,Transform.rotation.z的值会进行一种循环,直到180然后变为负值直到0,反之亦然。

有人能告诉我我错过了什么吗?我是否会忽略其他更简单,更有效的方法来实现我所寻找的目标?

在此先感谢您的帮助,我真的很感激。我是新人,仍然在努力掌握许多概念。

1 个答案:

答案 0 :(得分:2)

我刚刚解决了!我只需要设置一个范围在45到180之间的范围,而另一个方向设置在315和180之间。

    if (eulerAngles.z > 45 && eulerAngles.z < 180)
    {
        transform.rotation = Quaternion.AngleAxis(-315, new Vector3(0, 0, 45));
        Debug.Log("45");
    }


    if (eulerAngles.z < 315 && eulerAngles.z > 180)
    {
        transform.rotation = Quaternion.AngleAxis(-315, new Vector3(0, 0, -45));
        Debug.Log("-45");
    }

这使它完美地运作。当精灵(宇宙飞船)横向移动时,它会旋转到那一侧但停止以45度旋转。