【厚積薄發】如何通過Timeline的形式實現技能編輯器

2021-02-21 侑虎科技

這是第228篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收穫。

UWA 問答社區:answer.uwa4d.com

UWA QQ群2:793972859(原群已滿員)

本期目錄:

Q:項目需要通過Timeline的形式實現做個技能編輯器,時間軸的形式是怎麼實現的?整個的技能編輯器有沒有相關的參考?

A1:建議學習Timeline的使用方法以及傳統技能編輯器是怎麼做的,然後再想想看如何結合。下面這篇文章可以先讀一讀:《ACT技能編輯器的製作經驗分享》

該問答由UWA提供

A2:可參考官方的Timeline擴展,2017年Unite也有個相關的主題:

https://assetstore.unity.com/packages/essentials/default-playables-95266

感謝羽飛@UWA問答社區提供了回答

A3:第一,時間軸的形式是怎麼實現的?

你可以參考幾個Unity 的插件:

https://assetstore.unity.com/packages/tools/animation/cinematic-sequencer-slate-56558 

推薦SLATE,擴展起來比較方便:

https://assetstore.unity.com/packages/tools/animation/flux-18440

第二,技能編輯器思路。

有了上面的時間軸框架之後就是基於時間軸去開發不同類型的幀,比如:播放特效幀、動畫幀和打擊點幀等等。

舉個特效的例子:

1. 技能特效不外乎幾個參數:特效名、偏移信息和掛接點等等;

2. 然後需要去實現執行到這個關鍵幀的時候具體怎麼執行的業務代碼,比如根據幀上面的配置的特效名參數加載出這個特效,偏移信息和掛接點參數設置特效的Transform;

3. 幀的長度就是這個特效的生命周期,幀執行完退出時做下銷毀工作。


感謝波波@UWA問答社區提供了回答,迎大家轉至社區交流:

https://answer.uwa4d.com/question/5fb37c2210a17c6c2b09d15e

Q:Addressable可以通過Group Name獲得這個Group下的Key嗎?


我把熱更新放在了遊戲開始時統一做。更新流程大概是:創建一個加載界面(資源在Addressable中是獨立的Group,暫且叫startGroup),接著檢查Catalog是否有更新,然後拿到所有的Key值下載資源。


這個流程是沒有問題的,問題出在:如果在更新時網絡中斷了,Addressable似乎會把更新列表裡的資源內存釋放掉,使用了所有Key來進行下載的加載界面資源會丟失(變黑)。經測試,手動把startGroup裡的Key排除掉,就沒有這個問題。所以通過Group Name如何獲得這個Group下的Key?或者有好的更新方案分享嗎?


A1:有一個內部函數:

internal bool GetResourceLocations(object key, Type type, out IList<IResourceLocation> locations)

可以參考一下具體實現,這也是類似GetDownloadSizeAsync這樣的函數在內部調用的。

感謝黃程@UWA問答社區提供了回答


A2:可以把startGroup裡的資源的Label都設置成了「start」,通過Lable可以拿到Location列表,然後把這個列表中的Key值從總列表裡面排除:

public static List<string> GetAllKeys(string labelName)
{
    var t = Addressables.ResourceLocators;
    List<string> keys = new List<string>();
    foreach (var location in  t)
    {
        if (!(location is ResourceLocationMap)) continue;
        ResourceLocationMap locationMap = location as ResourceLocationMap;
        locationMap.Locate(labelName, typeof(object), out var startLocationList);
        foreach (var info in locationMap.Locations)
        {
            if(info.Value.Count == 0) continue;
            string str = info.Value[0].PrimaryKey;
            bool isHas = false;
            foreach (var startLocation in startLocationList)
            {
                if(startLocation.PrimaryKey == str)
                {
                    isHas = true;
                    break;
                }
            }
            if (isHas) continue;
            string key = info.Key.ToString();
            if (int.TryParse(key, out var num))
            {
                continue;
            }
            if (!keys.Contains(key))
            {
                keys.Add(key);
            }
        }
    }
    /*foreach (var locator in t)
    {
        foreach (var key in locator.Keys)
        {
            int value = 0;
            string str = key.ToString();
            if (!int.TryParse(str, out value))
            {
                keys.Add(str);
            }
        }
    }*/
    return keys;
}


感謝大俠陳二狗@UWA問答社區提供了回答,迎大家轉至社區交流:

https://answer.uwa4d.com/question/5f96c2335d9aea5aa971986c

Q:使用了Sprite Packer的打圖集,運行的時候如何獲取Sprite所在圖集中的UV值?

A:可以使用以下方式:

Sprites.DataUtility.GetOuterUV(activeSprite)

感謝題主凡凡@UWA問答社區提供了回答,迎大家轉至社區交流:

https://answer.uwa4d.com/question/5fb22b8810a17c6c2b09d13d

Q:AnimatorController被放在UnityEditor下了,該怎麼獲取所有的狀態名?

A:可以參考一下:

https://stackoverflow.com/questions/41709325/retrieve-all-animator-states-and-set-them-manually-in-code

另外,AnimatorController從Unity5.2開始就一直是Editor命名空間下的。

感謝Xuan@UWA問答社區提供了回答,迎大家轉至社區交流:

https://answer.uwa4d.com/question/5fb32fd210a17c6c2b09d156

Q:由於某些原因,我把UGUI的Mask組件反編譯了,然後把代碼複製一份改個名字進行測試使用。發現複製出來的Mask竟然不生效。


原生的Mask通過修改組件上的材質,實現裁剪,它會修改自己跟所有子節點的材質;而複製出來的這個Mask,只會修改自己的材質,完全不會影響子節點。


想了解下,Unity是如何實現讓Mask影響所有子節點材質的?

A1:Mask組件只是一個通知組件和標識裁切信息的類,在組件開啟後通知子節點中所有的Text,Image(這些組件繼承自MaskableGraphic)開始裁切計算,MaskableGraphic會去找父節點中離它最近的Mask組件獲取裁剪信息,單純複製一個Mask沒有用。

感謝陳祥@UWA問答社區提供了回答

A2:根據MaskableGraphic的代碼,裡面只有找當前節點的Mask組件,並沒有尋找父節點。寫了個AlphaMask組件做軟裁剪,發現如果父節點掛了Mask後,這個組件會不正常。經查發現是Mask替換了材質,把原有材質裡的信息搞丟了。

然後參考Mask的實現調整一下AlphaMask。主要是替換子節點材質這部分,因為在項目中有很多動態節點,現在需要讓每個動態節點自己調用代碼替換材質。

最終發覺,MaskabelGraphic是通過調用MaskUtilities.GetStencilDepth拿到父節點Mask的信息的,沒用直接GetComponentInParent。

感謝題主Walker@UWA問答社區提供了回答,歡迎大家轉至社區交流:

https://answer.uwa4d.com/question/5f8ac1899424416784ef281b

封面圖來源:A Terrible Kingdom

以創造性的方式編寫遊戲時間軸。

https://lab.uwa4d.com/lab/5b5665cfd7f10a201fd97a80

今天的分享就到這裡。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。

官網:www.uwa4d.com

官方技術博客:blog.uwa4d.com

官方問答社區:answer.uwa4d.com

UWA學堂:edu.uwa4d.com

官方技術QQ群:793972859(原群已滿員)

(長按識別二維碼進入UWA問答)

《Unity版本使用情況統計》

近期精彩回顧

【厚積薄發】一個按鈕,一鍵傳功!

【厚積薄發】Unity引擎邏輯代碼模塊知識Tree

【厚積薄發】課程綜合模塊知識Tree

【厚積薄發】Unity引擎資源管理模塊知識Tree

相關焦點

  • 微信編輯器如何使用?
    最實用的微信編輯器使用全解介紹給大家,簡單實用一、頁面介紹操作界面中,主要包括分類區,樣式展示區,內容編輯區三個部分。(1) 在分類區可根據需要選擇樣式類別(2) 在頁面的「樣式展示區」選擇所需的素材(3) 在樣式展示區選擇素材後可複製到內容編輯區進行修改1.調色盤2.背景切換3、論壇4、提交樣式5、用戶交流群6.常用功能二、如何使用樣式在編輯器裡,樣式顯示在樣式展示區,點擊某個樣式,可以直接將該樣式插入到編輯器裡面,
  • 淺談代碼編輯器的自動補全功能的實現
    我們都知道Visual Studio號稱宇宙第一編輯器,JetBrains號稱最好用的全家桶編輯器。那麼他們究竟好在哪裡?我想關於自動提示補全功能一定是它們一個不可或缺的亮點。而其中關於編輯器的自動補全功能,可以說是最偉大的發明或者說是進步了,有了它,程式設計師們敲起代碼來變得行雲流水。基本想法jquery我想稍微老一點的前端程式設計師都應該接觸過,在jquery中,有一個自動補全的插件jquery-autocomplete,它是怎麼實現的呢?
  • 10行代碼實現實時Html編輯器
    很多人可能都用過Web編輯器,比如Ckedit等,除了Word等本地編輯器外Web編輯器也是最常用最方便Web內容來源。這些在線編輯器的一個短板限制很多,不能實時反饋在線效果。本文蟲蟲給大家介紹一種很簡單的無限制在線Html編輯器,實現所寫即所得UI和樣式實時刷新,JS代碼也能進行熱加載執行重新渲染,而且這些實現都非常簡單,只用到了很少的html和css代碼。
  • 編輯器的自製
    這其中的一個話題就是:編輯器以及 IDE。畢竟,討論 Emacs 和 Vim 哪一個更好,已經不能滿足我的需求。程式設計師的樂趣應該在於如此去寫一個 Emcas,便實現一個 Vim —— 畢竟 Emacs 作業系統太複雜了。1. 無 UI 式:命令行編輯器作為過程的第一步,我開始尋找一些合適的編輯器(PS:主要是簡單),以作為我的編輯器和 IDE 生涯的第一步。
  • 如何使用PDF編輯器?PDF編輯器如何編輯PDF文檔?
    有網友問小峰一個問題,說是「PDF編輯器怎麼用?PDF編輯器如何編輯PDF文檔」,老實說,雖然小峰確實使用了PDF編輯器,但網友的問題卻還是讓小峰啞口無言,不知如何回答。為什麼?因為網際網路上有很多PDF編輯,不同的編輯使用方式也不同,所以這個問題確實沒有統一的答案!
  • 【厚積薄發】半透明物體如何實現陰影效果?
    之前就實現過地表有一塊玻璃材質,會在玻璃上以及下面的物體上都有投射的陰影效果。所以如果自己編寫的Shader,想要接受陰影,只需要採樣Shadowmap,走一下陰影計算的過程就可以了。1)如何設置才能開啟SHADOWS_SHADOWMSK的keyword,並正確地將貼圖傳入Shader(不能手動在材質上打開keyword,傳入的貼圖是默認的白色)?
  • 使用逐浪CMS做網站如何引用Markdown編輯器
    Markdown是一種可以使用普通文本編輯器編寫的標記語言,通過簡單的標記語法,它可以使普通文本內容具有一定的格式。MarkDown擁有幾十種特性功能:1、實現渲染效果2、實時同步預覽3、工具欄語法輔助4、更好的中文支持和優化5、獨立的編輯模式
  • 初識Visual Basic編輯器並建立一段簡單的代碼
    今日的內容是第一章「初識VBA代碼及應用VBA代碼」的第一節「初識Visual Basic編輯器並建立一段簡單的代碼」第一節 初識Visual Basic編輯器並建立一段簡單的代碼在使用excel時,我們可以通過編寫所謂的宏來自動執行Excel中的某些簡單任務。
  • 【乾貨】大數據文本文件——編輯器的選擇
    如何去掉文本文件中的空白行3. 如何對比兩個文本文件的內容4. 如何把一個排布混亂的數據整理成表格5. 如何重一個數據表格中提取自己需要的內容是不是說著說著,發現往事歷歷在目,有種想要怒摔鍵盤的衝動。冷靜!!!古人有云:「工欲善其事,必先利其器。」
  • 新型鹼基編輯器首次在微生物中實現任意鹼基編輯
    開發新型鹼基編輯技術實現鹼基顛換甚至任意鹼基變換,在合成生物體系構建、遺傳疾病的基因治療、生物性狀修飾等領域具有重要意義。中國科學院天津工業生物技術研究所張學禮研究員帶領的微生物代謝工程研究團隊和畢昌昊研究員帶領的合成生物技術研究團隊聯合攻關,設計構建了胞嘧啶脫氨酶-nCas9-Ung蛋白複合物,創建出新型糖基化酶鹼基編輯器(GBE),開發了可實現嘧啶和嘌呤間顛換的單鹼基基因編輯系統。基於該系統,國際上首次在微生物中實現任意鹼基編輯、在哺乳動物細胞中實現C-G鹼基特異性顛換。
  • 【厚積薄發】按鈕穿透點擊實現方式
    Prefab時Mesh合併UGUI TEXT裡的Best Fit性能消耗Q:在按鈕重疊情況下,如何實現點上面的按鈕能同時讓下面的按鈕也執行?A:我們是給需要做這種處理的控制項上掛了一個腳本來實現的,沒有修改EventSystem的源碼。對應你的需求,可能要做一個全屏的UI來專門檢測滑動時間。
  • Stata 中 dofile 編輯器的配置 —— 來個漂亮的編輯器
    請點擊底部「閱讀原文」介紹如何設定 Stata dofile 編輯器的配色方案,以便呈現語法高亮,光標高亮等功能,提高 dofile 編輯器的舒適性。一些經典的配色方案可以參考 highlightjs經典配色方案[4]。其中,rainbow, VS 2015,Xcode,Tomorrow系列,GoogleCode 等風格都不錯。
  • 【厚積薄發】Instruments如何看Mono內存分配
    UWA 問答社區:answer.uwa4d.comUWA QQ群2:793972859(原群已滿員)本期目錄:Instruments如何看Mono內存分配關於Addressable v1.11.2的疑問展開UV2時導致Mesh頂點數增加提升Unity編輯器中代碼的編譯速度Renderdoc
  • 疫情中不退反進 編程貓如何厚積薄發
    編程貓作為在線上教育中的佼佼者,在這場疫情中不退反進,讓更多的孩子能夠實現在家「不停學」。好的公司一定是那些已花了大量時間,提前做好充足準備,能夠長遠健康發展,能夠持續帶給用戶高價值和優良體驗的公司。能夠有戰略眼光,有前瞻性、提前做好準備的公司,它的抗風險能力也一定很強。
  • 如何使用極速PDF編輯器的畫圖工具?
    我們在編輯PDF時,有時需要通過一些畫圖工具對文檔進行美化或圖形標記,那麼極速PDF編輯器都有哪些畫圖工具?它們分別有什麼作用?又該如何正確使用呢?一、畫圖工具有哪些?極速PDF編輯器一共有6種畫圖工具:鉛筆工具:用於手繪圖形矩形工具:用於繪製四個直角對邊平行的平面圖形直線工具:用於繪製線條橢圓工具:用於繪製橢圓圖形鋼筆工具:用於繪製相互連接的直線
  • 蜂鳥視圖開放室內地圖編輯器,提供從0到1的自主製圖能力
    如何打破信息孤島,讓空間不再僅僅是空間,而是進入數字標準化範疇,讓空間數據「活」起來,並被充分利用?蜂鳥視圖認為如果能有一款工具能夠自由繪製及快速更新室內地圖的數據,幫助用戶提升室內地圖生產效率,將會引領室內空間信息化產業變革,重新定義室內地圖製作工具!
  • 基於jsoneditor二次封裝一個可實時預覽的json編輯器組件react版
    ,這樣一方面可以提高組件復用性和可擴展性,另一方面也帶來了項目開發的靈活性和可維護,方便多人開發協作.接下來文章將介紹如何使用react,開發一個自定義json編輯器組件.我們這裡使用了jsoneditor這個第三方庫,官方地址: jsoneditor 通過實現一個json在線編輯器,來學習如何一步步封裝自己的組件(不限於react,vue,原理類似).
  • PDF編輯器
    有網友問小編有沒有PDF編輯器,這裡給大家分享PDF編輯器軟體介紹:福昕高級PDF編輯器是對PDF文檔進行全生命周期管理的解決方案
  • 15 款Python編輯器的優缺點,別再問我「選什麼編輯器」啦!
    讀者可以參考此文列舉的 Python IDE 列表,選擇適合自己的編輯器。寫 Python 代碼最好的方式莫過於使用集成開發環境(IDE)了。它們不僅能使你的工作更加簡單、更具邏輯性,還能夠提升編程體驗和效率。每個人都知道這一點。而問題在於,如何從眾多選項中選擇最好的 Python 開發環境。初級開發者往往面臨這個問題。
  • 【文本編輯器】二、文件操作功能(上)
    設置窗口標題在《【文本編輯器】一、界面設計》中通過setWindowTitle(tr("文本編輯器"));設置窗口標題,不過這只是應用程式的名稱。常見軟體的標題條通常設置成「文件名 - 軟體名」的形式,下面將按照這一標題形式設置文本編輯器的窗口標題。