1. 程式人生 > >【Unity3D遊戲開發學習筆記】(七)上帝之眼—第三人稱攝像機的簡單實現(跟隨視角,自由視角)

【Unity3D遊戲開發學習筆記】(七)上帝之眼—第三人稱攝像機的簡單實現(跟隨視角,自由視角)

陸陸續續又開始更新自己的部落格,看來自我驅動能力還是不夠啊= =,廢話不多說了,之前的內容大概說了一下Unity的一些基礎知識,接下來我們將要對一些基本功能做一些學習。大家都知道,一個遊戲,少不了攝像機的參與(這不是廢話麼!沒攝像機怎麼玩!畫面都不呈現了好伐!)攝像機,總體來說分為了三大類別:上帝視角,也就是俗稱的第三人稱視角,以一種凌駕於遊戲object的方式存在,玩家跟上帝一般俯瞰整個遊戲;主角視角,第一人稱視角,以主角的角度觀看遊戲的發展狀態;觀察視角,關注於某個物體的視角,這個視角在一些密室逃脫類遊戲裡經常有。

下面我們來學習一下簡單的第三人稱視角

一、第三人稱跟隨視角

這個視角是攝像機始終處於被觀察物體(主角)的某個角度,跟隨著主角的移動來調整自己的位置並始終觀察著主角。

現在我們點開Window->AssetStore,搜尋UnityChan,這是一個精美並且免費的模型,我們可以用它來作為demo,下載並匯入場景

這裡寫圖片描述

接下來我們就要編寫攝像機的指令碼了,這個指令碼比較簡單

using UnityEngine;
using System.Collections;

public class CameraFollow : MonoBehaviour {

    public Transform target;
    public float distanceH = 7f;
    public float distanceV = 4f;


    // Use this for initialization
void Start () { } // Update is called once per frame void Update () { } void LateUpdate() { Vector3 nextpos = Vector3.forward * -1 * distanceH + Vector3.up * distanceV + target.position; this.transform.position = nextpos; this.transform.LookAt(target); } }

只要把上面的指令碼付給攝像頭,然後在Inspector介面把主角拖進Target裡面,執行,移動主角的時候我們就能發現攝像頭也在跟著主角移動了。

細心的朋友可能也發現了,就是如果轉動主角的時候,攝像機還是處於一個角度觀察主角,如果說我希望攝像頭始終在主角的背面,那怎麼辦呢。我們只需要做一些小小的改動就可以了

 void LateUpdate()
    {
        Vector3 nextpos = target.forward * -1 * distanceH + target.up * distanceV + target.position;

        this.transform.position = nextpos;

        this.transform.LookAt(target);
    }

這樣,大家試試轉動主角,可以發現,攝像機始終都是看到主角的背面了~一個非常簡單實用的跟隨攝像機就出來了~

PS:下面我們說一些小技巧

  • 攝像機的更新最好在LateUpdate()裡面執行,因為這個時候遊戲的所有行為基本上已經處理完,在這個時候來進行攝像機的更新是最好的時候,能夠把遊戲最新的狀態呈現出來
  • 如果想要攝像機緩慢跟隨,可以加上平滑,具體程式碼如下:
public float smoothSpeed = 10f; //平滑引數

void LateUpdate()
    {
        Vector3 nextpos = target.forward * -1 * distanceH + target.up * distanceV + target.position;

        this.transform.position =Vector3.Lerp(this.transform.position, nextpos, smoothSpeed * Time.deltaTime); //平滑插值

        this.transform.LookAt(target);
    }

二,第三人稱自由視角

這個模式,說白了就是將視角當成一個object來進行移動,就跟你在Scene介面裡面的操作一樣

using UnityEngine;
using System.Collections;

public class CameraMover : MonoBehaviour
{

    public float cameraMoveSpeed = 10f;
    public float cameraRotSpeed = 30f;
    bool isRotateCamera = false;

    private float trans_y = 0;
    private float trans_x = 0;
    private float trans_z = 0;

    private float eulerAngles_x;
    private float eulerAngles_y;

    // Use this for initialization
    void Start()
    {

        Vector3 eulerAngles = this.transform.eulerAngles;//當前物體的尤拉角

        this.eulerAngles_x = eulerAngles.y;

        this.eulerAngles_y = eulerAngles.x;
    }


    void FixedUpdate()
    {


        if (Input.GetMouseButton(1))
        {

            this.eulerAngles_x += (Input.GetAxis("Mouse X") * this.cameraRotSpeed) * Time.deltaTime;

            this.eulerAngles_y -= (Input.GetAxis("Mouse Y") * this.cameraRotSpeed) * Time.deltaTime;

            Quaternion quaternion = Quaternion.Euler(this.eulerAngles_y, this.eulerAngles_x, (float)0);

            this.transform.rotation = quaternion;

            moveCameraByKey(cameraMoveSpeed);
        }


        this.trans_z = (Input.GetAxis("Mouse ScrollWheel") * this.cameraMoveSpeed * 2) * Time.deltaTime;
        this.transform.Translate(Vector3.forward * this.trans_z);

        //if (Input.GetMouseButton(2))
        //{
        //    this.trans_y = (Input.GetAxis("Mouse Y") * this.ySpeed / 2) * 0.02f;
        //    this.trans_x = (Input.GetAxis("Mouse X") * this.xSpeed / 2) * 0.02f;

        //    this.transform.Translate(-1 *Vector3.right * this.trans_x);
        //    this.transform.Translate(-1 *Vector3.up * this.trans_y);
        //}
    }


    void moveCameraByKey(float speed)
    {

        if (Input.GetKey(KeyCode.Q))
        {
            this.transform.Translate(Vector3.down * speed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.E))
        {
            this.transform.Translate(Vector3.up * speed  *Time.deltaTime);
        }

        float moveV = Input.GetAxis("Vertical");
        float moveH = Input.GetAxis("Horizontal");

        this.transform.Translate(Vector3.forward * speed * moveV * Time.deltaTime + Vector3.right * speed * moveH * Time.deltaTime);
    }

}

這一篇就先到這了,下一篇我們會學習一下觀察視角~希望大家能支援吧(●’◡’●)