最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

淺談 Wwise WWU文件處理

2023-04-15 19:14 作者:kkxszz  | 我要投稿

什么是Wwise的WWU文件

Wwise工程中,音頻結(jié)構(gòu)和內(nèi)容的數(shù)據(jù)存儲(chǔ)都是以WorkUnit為單位。WorkUnit在硬盤(pán)中以.wwu文件的形式進(jìn)行儲(chǔ)存。

wwu的文件格式并不神秘,用記事本/notepad等軟件進(jìn)行預(yù)覽,可以看到第一行就有它的格式聲明:

由此可以看出它是一個(gè)遵循xml(可擴(kuò)展標(biāo)記語(yǔ)言)格式的文本文件。也就是說(shuō),只要掌握了xml的編輯方法我們可以直接在外部編輯wwise的workunit。

?

為什么需要編輯WWU

通常來(lái)說(shuō),針對(duì)Wwise結(jié)構(gòu)的管線(xiàn)操作,大部分情況下使用WAAPI都能順利解決(e.g. 定制規(guī)則的批量導(dǎo)入、批量修改屬性、批量建立Wwise結(jié)構(gòu))。

但是Waapi還是有一定的局限性:

1.?必須開(kāi)著Wwise工程才能使用Waapi功能。

2.?Waapi的操作是較慢的。(根據(jù)你的流程和量級(jí),可能會(huì)要數(shù)秒至十幾秒。WWU的編輯則是毫秒級(jí)的)【更正一下,Wwise2022速度快了非常多!】

3.?并不是所有的“Wwise操作”都能通過(guò)waapi實(shí)現(xiàn)。


當(dāng)遇到這些局限性時(shí),直接編輯WWU便成為了一個(gè)可選的方向。(另外的方向是二次開(kāi)發(fā)Wwise)


如何編輯xml的內(nèi)容

1)?理解xml的結(jié)構(gòu)

每個(gè)由 <tag></tag> 閉合的一個(gè)區(qū)域叫做一個(gè)元素(element),每個(gè)元素的完整結(jié)構(gòu)如下

<tag?attrib>?text?<若干子元素> </tag>?tail

子元素中可以再嵌套子元素,構(gòu)建出完整的文件。

?

為方便理解,下面以一個(gè)Events類(lèi)目下的DefaultWorkUnit為例進(jìn)行解釋。


用NotePad打開(kāi)它后,首先能看到第一行是xml的格式聲明。

第2行至20行是<WwiseDocument>元素。它的attrib里記錄了該WWU是個(gè)“WorkUnit”、它的guid等信息。

第3行至19行的<Events>則是WwiseDocument的子元素,這表示它在Events目錄下。

第4行至18行,則是<WorkUnit>元素。它的attrib里面記錄了workunit的具體名字、guid。 PersistMode為“Standalone”代表著它是在根目錄下,從屬于其他目錄下的workunit這里會(huì)顯示“Nested”。

接下來(lái)讓我們展開(kāi)第5行的ChildrenList元素:

此時(shí)可以看到,ChildrenList里面包含了一個(gè)Event元素,Event的attrib包含了它的命名和Guid。

再展開(kāi)它的ChildrenList,可以看到該Event包含的Action信息。

此時(shí)筆者在同一個(gè)Event中再加入一個(gè)Action,可以看到Event的子元素里面多了相應(yīng)的信息。

對(duì)比可以看出,“Play”這個(gè)Action所需的信息特別少,只有一條target引用。而“Stop”這個(gè)Action,不僅有引用,還有各類(lèi)屬性信息。此例中,Delay和FadeTime填寫(xiě)了非默認(rèn)值,被記錄在文本中,而Fade-out Curve是默認(rèn)值,不被記錄在文本里。


同理,想要掌握其他類(lèi)型的Wwise對(duì)象的數(shù)據(jù)格式,只要按照類(lèi)似的方法進(jìn)行觀察比對(duì)即可。

?

2)?編輯xml的方法

理解Wwise中WWU的格式規(guī)律之后,需要的時(shí)候就可以直接編輯WWU文本來(lái)修改Wwise工程內(nèi)容。

要程序化這個(gè)操作,筆者推薦使用Python標(biāo)準(zhǔn)庫(kù)中的xml.etree.ElementTree模塊來(lái)進(jìn)行xml的讀寫(xiě)。

這個(gè)庫(kù)較為常用并且有大量的中文教程可參考

參考資料推薦:

https://docs.python.org/zh-cn/3/library/xml.etree.elementtree.html

https://www.cnblogs.com/ifantastic/archive/2013/04/12/3017110.html


PS:如果使用XPath的話(huà),要額外注意python版本。

?

3)?代碼示范

例1:在workUnit內(nèi)找到第一個(gè)名為in_MusicName的MusicSwitchContainer元素

因?yàn)樯鲜鐾?lèi)操作(根據(jù)Attrib的某個(gè)值尋找元素)非常常見(jiàn),可以封裝一下:

如果想用XPath來(lái)實(shí)現(xiàn)也可以:

例2:在指定的音樂(lè)的WorkUnit下,生成一個(gè)新的WorkUnit

def?createWorkUnit_Music(self,in_parentFilePath,in_newWwuName):

? ? ? ? rootPath,fullname=os.path.split(in_parentFilePath)

? ? ? ? parentName,ext=os.path.splitext(fullname)

?

? ? ? ? # 1.1讀取母級(jí)的wwu

? ? ? ? tree_parent=ET.parse(in_parentFilePath)

? ? ? ? root_parent=tree_parent.getroot()

? ? ? ?

? ? ? ? # 1.2找到新的WorkUnit應(yīng)該寫(xiě)入的位置

? ? ? ? workUnit_parent=self.findElementByAttrib(root_parent,"WorkUnit","Name",parentName)

? ? ? ? if?workUnit_parent==None:

? ? ? ? ? ? print("parent 里讀取workunit失敗!終止")

? ? ? ? ? ? return

? ? ? ?

? ? ? ? ChildrenList=workUnit_parent.find("ChildrenList")

? ? ? ? if?ChildrenList==None:

? ? ? ? ? ? print("create ChildrenList")

? ? ? ? ? ? ChildrenList=ET.SubElement(workUnit_parent,"ChildrenList")

? ? ? ?

? ? ? ? # 1.3 在childrenList下寫(xiě)入新的元素(對(duì)新建的wwu文件的引用)。此時(shí)確定了新WorkUnit的GUID

? ? ? ? newID=self.generateGUID()

? ? ? ? _attrib_parent={

? ? ? ? ? ? "Name": in_newWwuName,

? ? ? ? ? ? "ID": newID,

? ? ? ? ? ? "PersistMode": "Reference"

? ? ? ? } ? ?

? ? ? ? ET.SubElement(ChildrenList,"WorkUnit",_attrib_parent)

? ? ? ?

? ? ? ? # 1.4 存儲(chǔ)母級(jí)的ID以備使用

? ? ? ? parentId=workUnit_parent.get("ID")

? ? ? ? if?not?parentId:

? ? ? ? ? ? print("獲取parentId失敗!終止")

? ? ? ? ? ? return

? ? ? ?

? ? ? ? # 1.5 美化格式并且覆蓋母級(jí)WWU文件

? ? ? ? self._pretty_xml(root_parent,'\t','\n')

? ? ? ? tree_parent.write(in_parentFilePath,encoding="utf-8",method="xml",xml_declaration=True)

? ? ? ?

? ? ? ?

? ? ? ? # 2.1 準(zhǔn)備新建wwu,先寫(xiě)入最外層的WwiseDocument元素的信息

? ? ? ? _attrib_WwiseDocument={

? ? ? ? ? ? "Type": "WorkUnit",

? ? ? ? ? ? "ID": newID,

? ? ? ? ? ? "SchemaVersion": "103",

? ? ? ? ? ? "RootDocumentID": parentId,

? ? ? ? ? ? "ParentDocumentID": parentId

? ? ? ? }

? ? ? ? newroot=ET.Element("WwiseDocument",_attrib_WwiseDocument)

? ? ? ?

? ? ? ? # 2.2 寫(xiě)入InteractMusic元素的信息

? ? ? ? InteractiveMusic=ET.SubElement(newroot,"InteractiveMusic")

? ? ? ? _attrib_newWorkUnit={

? ? ? ? ? ? "Name":in_newWwuName,

? ? ? ? ? ? "ID": newID,

? ? ? ? ? ? "OwnerID": parentId,

? ? ? ? ? ? "PersistMode": "Nested"

? ? ? ? }

? ? ? ? ET.SubElement(InteractiveMusic,"WorkUnit",_attrib_newWorkUnit)

? ? ? ?

? ? ? ? # 美化并且創(chuàng)建WWU文件

? ? ? ? self._pretty_xml(newroot,'\t','\n')

? ? ? ? newTree=ET.ElementTree(newroot)

? ? ? ? newTree.write(rootPath+"\\"+in_newWwuName+".wwu",encoding="utf-8",method="xml",xml_declaration=True)

? ? ? ? pass

?

創(chuàng)建完的WWU長(zhǎng)這個(gè)樣子:

4)?注意事項(xiàng)

1.?Wwise的wwu文件格式是不斷更新的,進(jìn)行相關(guān)工具制作的時(shí)候一定要確認(rèn)好每個(gè)寫(xiě)入步驟都和Wwise當(dāng)前的wwu格式一致。本文的案例包括103版本(2021.1.5)和110版本(2022.1.1)


2.?因?yàn)椴皇褂肳aapi,所有版本控制必須額外完成

???比如上文例2,在一個(gè)workunit下級(jí)創(chuàng)建新的workunit,需要遷出它母級(jí)WWU才能操作。配套使用P4的模塊進(jìn)行操作即可。

????

如何制作出Wwise的WWU格式

縮進(jìn)、換行

當(dāng)你試著用ElementTree讀取了wwise的某個(gè)現(xiàn)有的wwu文件,再原樣導(dǎo)出,你會(huì)發(fā)現(xiàn)你生產(chǎn)出的wwu文件長(zhǎng)這個(gè)樣子:所有的信息都寫(xiě)在了一行。

雖然排版不影響Wwise的讀取,但是對(duì)debug閱讀還是不方便,因此我個(gè)人采用了如下文章里介紹的排版方法,排版出的結(jié)果和Wwise基本一致。

?????????????????????????https://blog.csdn.net/u012692537/article/details/101395192

下面則是同一個(gè)xml進(jìn)行美化排版后的結(jié)果:

?

Attrib排序問(wèn)題

上面一個(gè)問(wèn)題解決以后,你還會(huì)發(fā)現(xiàn)你的輸出的Attrib和Wwise的格式略有不同:

我們使用ElementTree輸出的xml文件,它的Attrib,會(huì)強(qiáng)制按照字母來(lái)排序(ID在Name的前面)。它不影響任何功能,只是變得不易讀了。

只要在ElementTree的源碼中修改 _serialize_xml() 中的一行代碼即可解決:

以上是改完的結(jié)果,原文為“ for k,v in sorted(items): ”


參考文獻(xiàn):https://cxyzjd.com/article/weixin_42997255/100084091

最終,我們得到了和Wwise自行生成的xml一樣的格式:


如何生成GUID

從Wwise自己生成的ID的規(guī)則可以看出:Wwise使用的是4代的GUID,并且轉(zhuǎn)換成了純大寫(xiě)。

因此生成的方式如下:

?

總結(jié)

本文分享了筆者在制作wwu編輯工具時(shí)的學(xué)習(xí)路徑。掃清這些障礙之后,WWU文件的程序化修改就成為了可能。這種“土法煉金”方式,可以在不二次開(kāi)發(fā)Wwise的情況下,輔助Waapi,拓展Waapi工具鏈。

?

?

?

?

?


淺談 Wwise WWU文件處理的評(píng)論 (共 條)

使用qq登录你需要登录后才可以评论。
视频| 太谷县| 东安县| 山阳县| 韩城市| 改则县| 尼木县| 巴南区| 郧西县| 绍兴市| 四子王旗| 佛冈县| 中牟县| 方正县| 南靖县| 江西省| 怀宁县| 响水县| 慈溪市| 涟水县| 文水县| 大渡口区| 洞头县| 南丰县| 慈溪市| 潼南县| 无锡市| 临猗县| 海口市| 东乌| 广饶县| 射阳县| 伊春市| 天祝| 应城市| 库车县| 东宁县| 石泉县| 元阳县| 呼伦贝尔市| 绿春县|