Game檢視中實現類Scene中Camera的控制(自身中心)

Sam_ONE發表於2017-01-04

在網上找了找,感覺這個還不錯,並自己試了試,效果很不錯,就是沒有平滑效果,需要的自己加吧,哈哈。

下面就是網上找到的本版,還不錯!!


Unity Game視窗中還原Scene視窗攝像機操作 強化版

之前寫的那個版本看來真的是不行啊。最近研究了一下官方第一人稱指令碼,人家的平滑過渡真的是沒得說。借鑑了一下,寫出來了一個新的比較完美的控制。

之前我們的操作是通過滑鼠輸入的開始座標和轉動座標。其實官方有一個函式~

1 float yRot = Input.GetAxis("Mouse X");
2 float xRot = Input.GetAxis("Mouse Y");

這就分別能獲取到滑鼠的X軸操作和Y軸操作了。

那為什麼用yRot獲取X軸,xRot獲取Y軸呢?

左面是滑鼠的頂檢視,右邊是Unity中的三維座標。可以觀察到,滑鼠X軸的平移對應的就是Unity中Y軸的旋轉。Y軸同理。

但是還是不能照搬官方的寫法,因為官方的寫法針對的是自身座標,就是Local。(注:LocalPosition並不等於物體的Local座標)

Scene視窗的攝像機是針對World的旋轉。

這裡就需要轉換一下。


using UnityEngine;
using System.Collections;

public class TCamerCtrl : MonoBehaviour
{

    private float Speed = 20f;
    private Vector3 CameraR;

    void Start()
    {
        CameraR = Camera.main.transform.rotation.eulerAngles;
    }

    void Update()
    {
        Vector3 Face = transform.rotation * Vector3.forward;
        Face = Face.normalized;

        Vector3 Left = transform.rotation * Vector3.left;
        Left = Left.normalized;

        Vector3 Right = transform.rotation * Vector3.right;
        Right = Right.normalized;

        if (Input.GetMouseButton(1))
        {
            //官方指令碼
            float yRot = Input.GetAxis("Mouse X")*2;
            float xRot = Input.GetAxis("Mouse Y")*2;

            Vector3 R = CameraR + new Vector3(-xRot, yRot, 0f);

            CameraR = Vector3.Slerp(CameraR, R, Speed * Time.deltaTime);

            transform.rotation = Quaternion.Euler(CameraR);
        }

        if (Input.GetKey("w"))
        {
            transform.position += Face * Speed * Time.deltaTime;
        }

        if (Input.GetKey("a"))
        {
            transform.position += Left * Speed * Time.deltaTime;
        }

        if (Input.GetKey("d"))
        {
            transform.position += Right * Speed * Time.deltaTime;
        }

        if (Input.GetKey("s"))
        {
            transform.position -= Face * Speed * Time.deltaTime;
        }

        if (Input.GetKey("q"))
        {
            transform.position -= Vector3.up * Speed * Time.deltaTime;
        }

        if (Input.GetKey("e"))
        {
            transform.position += Vector3.up * Speed * Time.deltaTime;
        }

    }
}
感謝原作者!

最後附上原連結:http://www.cnblogs.com/SHOR/p/5736596.html


相關文章