【Unity3D游戏开发学习笔记】(七)上帝之眼—第三人称摄像机的简单实现(跟随视角,自由视角)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nizihabi/article/details/52438354

陆陆续续又开始更新自己的博客,看来自我驱动能力还是不够啊= =,废话不多说了,之前的内容大概说了一下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);
    }

}

这一篇就先到这了,下一篇我们会学习一下观察视角~希望大家能支持吧(●’◡’●)

猜你喜欢

转载自blog.csdn.net/nizihabi/article/details/52438354