運(yùn)行效果
攝像機(jī)運(yùn)行效果如下所示。
玩家角色
首先創(chuàng)建一個(gè)可用的玩家角色,寫好移動(dòng)邏輯,如果要使用在Unity商店中購買的資源,可以點(diǎn)擊Window菜單欄> Package Manager選項(xiàng),來打開Package Manager窗口,如下所示,然后下載你需要的資源。
如果你沒有在資源商店的精靈資產(chǎn),可以在Hierarchy視圖,右鍵單擊,選擇“2D Object" > “Sprites” > “Capsule”。
這將會(huì)在場景中創(chuàng)建一個(gè)2D膠囊體,我們就用這個(gè)膠囊體來充當(dāng)我們的玩家角色,如下圖所示。
腳本
新建一個(gè)腳本,名叫FollowCamera,然后將該腳本掛載到Camera上。
字段
我們要?jiǎng)?chuàng)建的跟隨攝像機(jī)具有平滑移動(dòng)的功能,所以我們需要?jiǎng)?chuàng)建兩個(gè)字段,一個(gè)字段用于表示跟隨的物體,一個(gè)字段用于表示攝像機(jī)移動(dòng)的平滑程度。
聲明一個(gè)Transform類變量target,用于指定攝像機(jī)要跟隨的目標(biāo)物體,注意要聲明成public的,這樣我們可以在編輯器中將目標(biāo)物體賦值給該變量。
聲明一個(gè)float類型變量damping,用于指定跟隨的平滑程度,數(shù)值越大表示跟隨越平滑,默認(rèn)值賦值為1。
public Transform target; // 跟隨的目標(biāo)物體
public float damping = 1; // 跟隨的平滑程度
跟隨邏輯
跟隨邏輯的代碼我們放在LateUpdate() 方法中實(shí)現(xiàn),這個(gè)方法在每一幀最后被調(diào)用。
private void LateUpdate()
{
}
在LateUpdate() 方法中,首先判斷目標(biāo)物體是否存在(是否已經(jīng)賦值給target變量),如果沒有目標(biāo)物體,不進(jìn)行任何操作,避免報(bào)錯(cuò)。
if (target != null)
{
}
接下來計(jì)算攝像機(jī)應(yīng)該移動(dòng)的向量:
// 計(jì)算目標(biāo)位置在屏幕上的坐標(biāo)
Vector3 targetPosition = Camera.main.WorldToViewportPoint(target.position);
// 計(jì)算攝像機(jī)應(yīng)該移動(dòng)的向量
Vector3 delta = target.position - Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, targetPosition.z));
首先,使用Camera.main.WorldToViewportPoint()方法將目標(biāo)物體的位置轉(zhuǎn)換為視口坐標(biāo)(相對于攝像機(jī)的屏幕視圖比例)。
然后,通過計(jì)算delta向量,獲得目標(biāo)物體在視口坐標(biāo)系下的中心位置與屏幕中心位置之間的偏移量。使用Camera.main.ViewportToWorldPoint()方法將偏移量轉(zhuǎn)換為世界坐標(biāo)系下的偏移量。
接下來計(jì)算目標(biāo)位置和移動(dòng)攝像機(jī)。
// 計(jì)算攝像機(jī)的目標(biāo)位置
Vector3 destination = transform.position + delta;
// 使用平滑阻尼移動(dòng)攝像機(jī)
transform.position = Vector3.Lerp(transform.position, destination, damping * Time.deltaTime);
根據(jù)計(jì)算得到的攝像機(jī)的目標(biāo)位置,使用Vector3.Lerp()方法以平滑阻尼的方式將攝像機(jī)移動(dòng)到目標(biāo)位置。
這樣腳本就寫好了??梢允箶z像機(jī)平滑地跟隨目標(biāo)物體,并保持目標(biāo)物體在攝像機(jī)的中心位置。通過調(diào)整damping變量的值,我們還可以控制跟隨的平滑程度。文章來源:http://www.zghlxwxcb.cn/news/detail-825213.html
完整代碼
using UnityEngine;
public class FollowCamera: MonoBehaviour
{
public Transform target; // 跟隨的目標(biāo)物體
public float damping = 1; // 跟隨的平滑程度
private void LateUpdate()
{
if (target != null)
{
// 計(jì)算目標(biāo)位置在屏幕上的坐標(biāo)
Vector3 targetPosition = Camera.main.WorldToViewportPoint(target.position);
// 計(jì)算攝像機(jī)應(yīng)該移動(dòng)的向量
Vector3 delta = target.position - Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, targetPosition.z));
// 計(jì)算攝像機(jī)的目標(biāo)位置
Vector3 destination = transform.position + delta;
// 使用平滑阻尼移動(dòng)攝像機(jī)
transform.position = Vector3.Lerp(transform.position, destination, damping * Time.deltaTime);
}
}
}
其他相關(guān)文章連接
Unity2D實(shí)現(xiàn)左右移動(dòng)的敵人角色
Unity創(chuàng)建一個(gè)可移動(dòng)的2D角色文章來源地址http://www.zghlxwxcb.cn/news/detail-825213.html
到了這里,關(guān)于Unity實(shí)現(xiàn)2D游戲跟隨攝像機(jī)(平滑移動(dòng))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!