時光煮雨 Unity3d 序列目標點的移動①

來源:互聯網
上載者:User

標籤:人物   筆記   border   軌跡   mono   pat   using   padding   ash   

系列目錄

【Unity3D基礎】讓物體動起來①--基於UGUI的滑鼠點擊移動

【Unity3D基礎】讓物體動起來②--UGUI滑鼠點擊逐幀移動

時光煮雨 Unity3D讓物體動起來③—UGUI DoTween&Unity Native2D實現

時光煮雨 Unity3D實現2D人物動畫① UGUI&Native2D序列幀動畫

時光煮雨 Unity3D實現2D人物動畫② Unity2D 動畫系統&資源效率

時光煮雨 Unity3D實現2D人物移動-總結篇

時光煮雨 Unity3d 序列目標點的移動①

背景

上篇對於角色滑鼠點擊移動的總結後,感覺自己經驗值有點爆棚感覺,可以小小升一級了,雖然這個主題比較小但是是動畫的基礎,而遊戲本身就是又是基於動畫基礎的,所以還是很有意義的。

由於要研究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的優點,簡單嘛?

總結

功能終於實現了,但是還是有瑕疵。下一篇關於這篇的補充和動畫系統的細緻分析繼續進行。

時光煮雨 Unity3d 序列目標點的移動①

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.