Unity平滑相機跟隨
阿新 • • 發佈:2019-02-12
簡介
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.然後把程式碼拖到攝像機上,記得把需要跟隨的角色也拖過去
然後就沒有然後了,不出意外地話應該就能達到以下效果了
如有問題,肯定是你開啟方式不對,也可以留言諮詢 ╮(╯▽╰)╭