這是第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