1. 程式人生 > >Unity平滑相機跟隨

Unity平滑相機跟隨

簡介

unity中經常會用到固定視角的相機跟隨,然後百度發現大家都是自己寫的,然後偶也寫咯一個,分享一下
PS: 由於剛學C#不久,才發現delegate這個東東,也不知道對效能影響大不大,但是看MS自己的介面庫中各種使用,腦補了下估計可以用吧,就用了

Code

先上程式碼:
先是使用if進行判斷的版本,支援實時鎖定xyz的位置

using UnityEngine;

public class FixedFollowCamera : MonoBehaviour
{

    // 需要跟隨的目標物件
    public Transform target;

    // 需要鎖定的座標(可以實時生效)
public bool freazeX, freazeY, freazeZ; // 跟隨的平滑時間(類似於滯後時間) public float smoothTime = 0.3F; private float xVelocity, yVelocity, zVelocity = 0.0F; // 跟隨的偏移量 private Vector3 offset; // 全域性快取的位置變數 private Vector3 oldPosition; // 記錄初始位置 private Vector3 startPosition; void
Start() { startPosition = transform.position; offset = transform.position - target.position; } void LateUpdate() { oldPosition = transform.position; if (!freazeX) { oldPosition.x = Mathf.SmoothDamp(transform.position.x, target.position.x + offset.x, ref
xVelocity, smoothTime); } if (!freazeY) { oldPosition.y = Mathf.SmoothDamp(transform.position.y, target.position.y + offset.y, ref yVelocity, smoothTime); } if (!freazeZ) { oldPosition.z = Mathf.SmoothDamp(transform.position.z, target.position.z + offset.z, ref zVelocity, smoothTime); } transform.position = oldPosition; } /// <summary> /// 用於重新開始遊戲時直接重置相機位置 /// </summary> public void ResetPosition() { transform.position = startPosition; } }

然後再來個delegate的版本,不支援實時鎖定xyz的位置,具體效能升降也未知…但是感覺用著很不錯的感覺

using UnityEngine;

// 更新位置委託,用於減少判斷次數,具體效能升降未知
delegate void UpdatePosition();

public class FixedFollowCamera : MonoBehaviour
{

    // 需要跟隨的目標物件
    public Transform target;

    // 需要鎖定的座標(無法實時生效)
    public bool freazeX, freazeY, freazeZ;

    // 跟隨的平滑時間(類似於滯後時間)
    public float smoothTime = 0.3F;
    private float xVelocity, yVelocity, zVelocity = 0.0F;

    // 跟隨的偏移量
    private Vector3 offset;

    // 全域性快取的位置變數
    private Vector3 oldPosition;

    // 記錄初始位置
    private Vector3 startPosition;

    private UpdatePosition JudgePosition;

    void Start()
    {
        startPosition = transform.position;
        offset = transform.position - target.position;

        // 分配事件
        if (!freazeX)
        {
            JudgePosition += MoveX;
        }
        if (!freazeY)
        {
            JudgePosition += MoveY;
        }
        if (!freazeZ)
        {
            JudgePosition += MoveZ;
        }
    }

    void LateUpdate()
    {
        oldPosition = transform.position;
        JudgePosition();
        transform.position = oldPosition;
    }

    private void MoveX()
    {
        oldPosition.x = Mathf.SmoothDamp(transform.position.x, target.position.x + offset.x, ref xVelocity, smoothTime);
    }

    private void MoveY()
    {
        oldPosition.y = Mathf.SmoothDamp(transform.position.y, target.position.y + offset.y, ref yVelocity, smoothTime);
    }

    private void MoveZ()
    {
        oldPosition.z = Mathf.SmoothDamp(transform.position.z, target.position.z + offset.z, ref zVelocity, smoothTime);
    }

    /// <summary>
    /// 用於重新開始遊戲時直接重置相機位置
    /// </summary>
    public void ResetPosition()
    {
        transform.position = startPosition;
    }
}

使用方法

1.首先把攝像機和需要跟隨的角色位置在unity編輯介面中調好
這裡寫圖片描述
2.然後把程式碼拖到攝像機上,記得把需要跟隨的角色也拖過去
這裡寫圖片描述
然後就沒有然後了,不出意外地話應該就能達到以下效果了
這裡寫圖片描述

如有問題,肯定是你開啟方式不對,也可以留言諮詢 ╮(╯▽╰)╭