接觸U3D以來(lái),我做過的場(chǎng)景漫游實(shí)現(xiàn)方式一般有以下幾種:
- Unity3d中的Animation組件,通過設(shè)置攝像機(jī)的關(guān)鍵點(diǎn)實(shí)現(xiàn)場(chǎng)景漫游
- 第一人稱或第三人稱控制器
- 編寫攝像機(jī)控制腳本
- iTween
iTween實(shí)現(xiàn)相對(duì)來(lái)說比較簡(jiǎn)單,而且動(dòng)畫效果非常好,因此是我做場(chǎng)景漫游的首選,下面我來(lái)總結(jié)一下iTween做場(chǎng)景漫游的具體實(shí)現(xiàn)
簡(jiǎn)單做了個(gè)小demo如圖:
我在場(chǎng)景中建了4個(gè)空物體作為路徑點(diǎn),攝像機(jī)從一個(gè)路徑點(diǎn)到下一個(gè)路徑點(diǎn)循環(huán)往復(fù),當(dāng)按下空格鍵后,漫游會(huì)暫停,松開后繼續(xù),代碼符合我一貫的風(fēng)格,注釋很詳細(xì),我就不多解釋了.
涉及到的代碼綁在攝像機(jī)上面,如下:
using UnityEngine;
using System.Collections;
public class TweenRoam : MonoBehaviour
{
public Transform[] paths; //路徑尋路中的所有的關(guān)鍵點(diǎn) 使用空物體路徑點(diǎn)
//public Vector3[] paths; //也可以使用這句代碼直接給路徑點(diǎn)的位置賦值
public Hashtable args; //設(shè)置路徑鍵值對(duì)
public float m_speed = 10f; //漫游的速度
public bool isMove = true; //是否漫游
void Start()
{
args = new Hashtable();
args.Add("path", paths); //設(shè)置路徑的點(diǎn)
args.Add("easeType", iTween.EaseType.linear); //設(shè)置類型為線性,線性效果會(huì)好一些馋辈。
args.Add("speed", m_speed); //設(shè)置尋路的速度
args.Add("movetopath", false); //是否先從原始位置走到路徑中第一個(gè)點(diǎn)的位置
args.Add("orienttopath", true);//是否讓模型始終面朝當(dāng)面目標(biāo)的方向,拐彎的地方會(huì)自動(dòng)旋轉(zhuǎn)模型,如果你發(fā)現(xiàn)你的模型在尋路的時(shí)候始終都是一個(gè)方向那么一定要打開這個(gè)
args.Add("looktarget", Vector3.zero); //移動(dòng)過程中面朝一個(gè)點(diǎn)
args.Add("loopType", "loop"); //三個(gè)循環(huán)類型 none loop pingpong(一般 循環(huán) 來(lái)回)
args.Add("NamedValueColor", "_SpecColor"); //這個(gè)是處理顏色的叉抡〈鸷粒可以看源碼的那個(gè)枚舉褥民。
args.Add("delay", 0f); //延遲執(zhí)行時(shí)間
iTween.MoveTo(gameObject, args); //讓模型開始尋路 這個(gè)方法和放在Update函數(shù)里的MoveUpdate()方法效果一樣 Update里為了控制是否移動(dòng)
}
void Update()
{
RoamControl();
}
/// <summary>
/// 控制動(dòng)畫暫停和繼續(xù)的函數(shù)
/// </summary>
void RoamControl()
{
if (Input.GetKeyDown(KeyCode.Space))
{
iTween.Pause();
}
if (Input.GetKeyUp(KeyCode.Space))
{
iTween.Resume();
}
}
void OnDrawGizmos()
{
//在Scene視圖中繪制出路徑
iTween.DrawLine(paths, Color.yellow);
iTween.DrawPath(paths, Color.red);
}
}
Demo源碼地址: http://pan.baidu.com/s/1jIulQpo
注意:代碼綁定到攝像機(jī)上后要給paths指定路徑,或者用vector那句直接賦值也可以
關(guān)于iTween的其他知識(shí)點(diǎn)
iTween.MoveTo(): 讓模型移動(dòng)到一個(gè)位置轴捎,它的底層函數(shù)是通過動(dòng)態(tài)的修改模型每一幀的transform.position完成的,所以它會(huì)百分之百到達(dá)目標(biāo)點(diǎn)侦副,不會(huì)出現(xiàn)誤差。
iTween.MoveFrom():它和上面的一樣秦驯,iTween.MoveTo()是將模型移動(dòng)到目標(biāo)位置,而iTween.MoveFrom()是將模型從目標(biāo)位置移動(dòng)到原始位置译隘。
iTween.MoveAdd() 和iTween.MoveBy()底層實(shí)現(xiàn)一樣洛心,大家可以去看源碼固耘。處理移動(dòng)時(shí)采用的是transform.Translate也就是API的平移词身,這樣在處理移動(dòng)的時(shí)候可能會(huì)出現(xiàn)一些誤差,但是效果好點(diǎn)。
iTween.MoveUpdate():和iTween.MoveTo()差不多葫笼,只是它需要放在循環(huán)或者Update()中拗馒。
iTween.Pause(); 暫停
iTween.Resume();恢復(fù)