如何經過Timeline的形式實現技能編輯器

1)如何經過Timeline的形式實現技能編輯器
2)Addressable如何經過Group Name得到Group下的Key
3)Unity如何獲取Sprite在Sprite Packer中的UV值
4)AnimatorController在UnityEditor下,如何獲取全部的狀態名
5)Unity爲UGUI的Mask作了怎樣的處理css


UWA 問答社區:answer.uwa4d.com
UWA QQ羣2:793972859(原羣已滿員)html

Editor

Q:項目須要經過Timeline的形式實現作個技能編輯器,時間軸的形式是怎麼實現的?​整個的技能編輯器有沒有相關的參考?網絡

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

該問答由UWA提供dom

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問答社區提供了回答


Addressable

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問答社區提供了回答


Texture

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

A:可使用如下方式:
Sprites.DataUtility.GetOuterUV(activeSprite)

感謝題主凡凡@UWA問答社區提供了回答


Animation

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問答社區提供了回答


UGUI

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問答社區提供了回答

封面圖來源:A Terrible Kingdom
以創造性的方式編寫遊戲時間軸


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

官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
UWA學堂:edu.uwa4d.com 官方技術QQ羣:793972859(原羣已滿員)

相關文章
相關標籤/搜索