系列目錄
【Unity3D基礎】讓物體動起來①--基於UGUI的鼠標點擊移動
【Unity3D基礎】讓物體動起來②--UGUI鼠標點擊逐幀移動
時光煮雨 Unity3D讓物體動起來③—UGUI DoTween&Unity Native2D實現
時光煮雨 Unity3D實現2D人物動畫① UGUI&Native2D序列幀動畫
時光煮雨 Unity3D實現2D人物動畫② Unity2D 動畫系統&資源效率
背景
上篇對於角色鼠標點擊移動的總結后,感覺自己經驗值有點爆棚感覺,可以小小升一級了,雖然這個主題比較小但是是動畫的基礎,而游戲本身就是又是基於動畫基礎的,所以還是很有意義的。
由於要研究2d的尋路算法,A*尋路,A*尋路是基於網格的所以,序列點的移動就成了我的研究方向。這里經過一番努力,基本有了幾個方向。
A、DoTween有一個sequence動畫組合可以滿足
B、iTween 中有類似功能但不完全滿足
C、自己實現
本篇主要整理網上的資源做個整理,共享出來。
實現
A、DoTween這個其實很簡單,直接用函數就行,只是感覺有點不爽,人家是做組合動畫的,感覺殺雞用牛刀的感覺,果斷放棄了
B、iTween 中有類似功能但不滿足
這里為什么說不滿足,借下雨松MOMO的圖片,一看便知
其中紅色的線是插件進行曲線插值得出的結果(基於3個點,運算還是挺復雜的),而黃色線是調試顯示的4點的直線輔助線,如果直接使用插件得到的運行軌跡是不復核我的要求的,不過itween的使用代碼還是比較簡單的一看就明白了(這里剽竊雨松MOMO的原文鏈接是:iTween研究院之學習筆記Move移動篇(一))
using UnityEngine;
using System.Collections;
public class Path : MonoBehaviour {
//路徑尋路中的所有點
public Transform [] paths;
void Start ()
{
Hashtable args = new Hashtable();
//設置路徑的點
args.Add("path",paths);
//設置類型為線性,線性效果會好一些。
args.Add("easeType", iTween.EaseType.linear);
//設置尋路的速度
args.Add("speed",10f);
//是否先從原始位置走到路徑中第一個點的位置
args.Add("movetopath",true);
//是否讓模型始終面朝當面目標的方向,拐彎的地方會自動旋轉模型
//如果你發現你的模型在尋路的時候始終都是一個方向那么一定要打開這個
args.Add("orienttopath",true);
//讓模型開始尋路
iTween.MoveTo(gameObject,args);
}
void OnDrawGizmos()
{
//在scene視圖中繪制出路徑與線
iTween.DrawLine(paths,Color.yellow);
iTween.DrawPath(paths,Color.red);
}
}
實際上我在研究上篇基於時間線移動的時候,分析學習了itween的源代碼,其實就是事件線插值動畫,沒有什么高深的原理。實際上完全可以擴展itween實現這個功能的,如果把原理弄明白后。
C、自己實現
這是本文的重頭戲了,下面是我google了很久找的一段代碼(老外寫的,很簡單啊)
void Update()
{
float step = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, targets[index], step);
if (Vector3.Distance(transform.position, targets[index]) < 0.01f)
{
if (index == targets.Length - 1)
{
index = 0;
}
else
index++;
}
}
是不是簡單的發指,”眾里尋他千百度,驀然回首,那人卻在燈火闌珊處。”實際的代碼原型就是這么簡單,結合上文中提到的MoveTowards的優點,簡單嘛?
總結
功能終於實現了,但是還是有瑕疵。下一篇關於這篇的補充和動畫系統的細致分析繼續進行。