如何将宇宙飞船旋转回原始旋转以面向原始位置?

时间:2017-05-02 18:52:52

标签: c# unity3d unity5

宇宙飞船从A点开始移动。飞船正面向移动方向。 现在,当我点击L键上的一个时,我希望太空船将旋转并将面向它开始移动的原始位置。但即使太空船现在通过轴Z或Y或X旋转,首先将其旋转到常规旋转值并面向开始移动位置。 Explain

using UnityEngine;
using System.Collections;

public class Control : MonoBehaviour
{
    public int rotationSpeed = 75;
    public int movementspeed = 10;
    public int thrust = 10;

    private bool isPKeyDown = false;
    private float acceleration = .0f;
    private Vector3 previousPosition = Vector3.zero;
    private Rigidbody _rigidbody;
    private Vector3 originalPosition;
    private Quaternion originalRotation;

    // Use this for initialization
    void Start()
    {
        originalPosition = transform.position;
        originalRotation = transform.rotation;

        _rigidbody = GetComponent<Rigidbody>();
        Debug.Log("Acc Speed: " + thrust);
    }

    // Update is called once per frame
    void Update()
    {

        var v3 = new Vector3(Input.GetAxis("Vertical"), Input.GetAxis("Horizontal"), 0.0f);
        transform.Rotate(v3 * rotationSpeed * Time.deltaTime);
        transform.position += transform.forward * Time.deltaTime * movementspeed;

        if (Input.GetKey(KeyCode.Z))
            transform.Rotate(Vector3.forward * rotationSpeed * Time.deltaTime);

        if (Input.GetKey("p"))
        {
            isPKeyDown = Input.GetKey("p");
            float distance = Vector3.Distance(previousPosition, transform.position);
            acceleration = distance / Mathf.Pow(Time.deltaTime, 2);

            previousPosition = transform.position;
            _rigidbody.AddRelativeForce(0f, 0f, thrust, ForceMode.Acceleration);
        }

        if (Input.GetKey("l"))
        {
            transform.rotation = Quaternion.Slerp(transform.rotation, originalRotation, 0);
            //StartCoroutine(TurnShip(transform, transform., originalRotation.eulerAngles, 1));
            //transform.position += transform.forward * Time.deltaTime * movementspeed;
        }
    }

    IEnumerator TurnShip(Transform ship, Vector3 startAngle, Vector3 endAngle, float smooth)
    {
        float lerpSpeed = 0;

        while (lerpSpeed < 1)
        {
            ship.eulerAngles = Vector3.Lerp(startAngle, endAngle, lerpSpeed);
            lerpSpeed += Time.deltaTime * smooth;
            yield return null;
        }
    }

    void OnGUI()
    {
        if (isPKeyDown)
        {
            GUI.Label(new Rect(100, 100, 200, 200), "Acc Speed: " + acceleration);
        }
    }
}

这是我点击L按钮但我尝试了一些东西,但还不知道如何做到这一点。

主要目标是如果我在L上单击一次,飞船应该根据需要自动旋转并移回原始位置然后降落在地面上。 L代表着陆是主要目标。

1 个答案:

答案 0 :(得分:1)

在顶部添加变量 -

...
private Vector3 originalPosition;
private Quaternion originalRotation;

private bool landShip = false;
...

并在update函数 -

中使用以下代码
if (Input.GetKey("l"))
{
   landShip = true;
   //StartCoroutine(TurnShip(transform, transform., originalRotation.eulerAngles, 1));
   //transform.position += transform.forward * Time.deltaTime * movementspeed;
}
if(landShip){
   transform.rotation = Quaternion.Slerp(transform.rotation, originalRotation, 0.5f); 
}

宇宙飞船着陆后,将landShip值设置回false