MalodyV皮膚制作教程(其二)
通過前一個(gè)章節(jié)的學(xué)習(xí),相信你已經(jīng)掌握了制作靜態(tài)皮膚的方法,但可能還有一些問題困擾著你,比如:元件的尺寸必須提前計(jì)算,如果有些變量怎么辦?有些定位要適配多種設(shè)備,需要比較復(fù)雜的處理,非常繁瑣,有沒有簡化辦法?怎么增加動(dòng)畫?可不可以改Note出現(xiàn)的位置?等等。
在概述中說過,MalodyV的皮膚宗旨是讓90%的需求可以通過可視化操作簡單快速完成,剩下10%的復(fù)雜問題如果繼續(xù)做可視化,會(huì)讓編輯器使用門檻大幅上升,所以選擇了使用腳本來處理。
這里我們繼續(xù)學(xué)習(xí)如何使用腳本來簡化皮膚制作,以及添加動(dòng)畫。
皮膚系統(tǒng)支持的腳本使用lua語言,如果你還不熟悉這種語言,可以先使用參考資料里的教程進(jìn)行入門,這里假定你已經(jīng)掌握了基本語法。
控制屬性
首先打開編輯器的皮膚信息面板,在腳本控件上選擇一個(gè)lua后綴的腳本文件。一開始這個(gè)文件可以是最簡化的,只需要寫入如下內(nèi)容
一切順利的話,編輯器會(huì)立刻加載腳本,并在下面出現(xiàn)腳本調(diào)試面板,上面有三個(gè)按鈕,分別是從頭預(yù)覽,暫停,和重載腳本。后面會(huì)頻繁用到,這里暫時(shí)不去理解按鈕含義。
注意,當(dāng)?shù)谝淮芜x擇腳本時(shí),文件會(huì)被復(fù)制到皮膚目錄,之后你應(yīng)該繼續(xù)編輯皮膚目錄下的文件,而不是原始文件。如果將來你很熟悉腳本用法,可能會(huì)只導(dǎo)入一次而不用再次編輯。

2. 假定我們要通過腳本來控制一個(gè)模塊的初始位置,讓他根據(jù)游戲窗口高度來變化。于是我們先使用前面的方法添加一個(gè)自定義圖形。注意想要從腳本里控制的模塊,必須主動(dòng)填寫模塊名,不能留空,也不能重復(fù)。這里我們?nèi)∶衛(wèi)eftbar。

3. 接著用你喜歡的編輯器打開腳本文件(防止你忘了,再提一次,要打開皮膚目錄下的文件),在Init方法里使用API接口查找剛才創(chuàng)建的模塊:
這里我們用了本地變量來保存模塊引用,你也可以用全局變量,或者別的你期望的形式來保存,模塊的引用只要查找一次,在整個(gè)游玩期間都是有效的。但要注意如果是在編輯器里預(yù)覽模式下,被引用的模塊改名后記得重載一次腳本,否則引用還是會(huì)失效。
我們還需要知道游戲窗口的高度,于是繼續(xù)調(diào)用方法:
要注意這里返回的高度值不是像素,而是單位值。和編輯器面板上的單位值是完全一樣的定位。
我們期望leftbar的高度總是等于窗口高度的一半,但是多10個(gè)單位。于是寫:
?最后把這個(gè)結(jié)果賦值給模塊的高度,非常簡單:
?然后點(diǎn)擊一下重載腳本,你就得到一個(gè)高度被你精確控制的模塊。在你學(xué)習(xí)了完整的腳本API之后,你可以在Init里任意控制各種模塊的各種屬性。

添加動(dòng)畫
只是修改靜態(tài)屬性還不夠勁爆,腳本真正擅長的是添加動(dòng)畫。假設(shè)我們要讓上面的綠色柱子重復(fù)的執(zhí)行長高和變矮動(dòng)畫,只需要向代碼中添加一行:
然后點(diǎn)擊重載,再點(diǎn)擊重頭播放,是不是就動(dòng)起來了。
目前你還不需要了解這一句中每個(gè)參數(shù)代表什么,只需要記住所有動(dòng)畫盡量都在Init中指定,這里說盡量,是因?yàn)槟_本確實(shí)允許在其他地方(目前還沒介紹)設(shè)置動(dòng)畫,但那樣效率都更差。
2. 我們繼續(xù)來搞一點(diǎn)腳本才能干的事,比如每個(gè)Note被打擊的時(shí)候,播放一個(gè)動(dòng)畫。這個(gè)事其實(shí)觸發(fā)器也能干,但腳本可以更自由的干。
腳本為打擊事件單獨(dú)提供了一個(gè)入口函數(shù),叫OnHit,這次我們寫完函數(shù),再來講含義:
首先,我們?cè)贗nit里引用了marlo這個(gè)模塊,這個(gè)模塊可以是個(gè)圖片,或者任意一個(gè)別的東西,相信學(xué)到這里的你應(yīng)該能熟練的創(chuàng)建合適的模塊了。在Init里引用是因?yàn)楹竺鏁?huì)頻繁使用,為了避免重復(fù)查找,這樣會(huì)更高效一些。
其次,我們?cè)谛碌腛nHit函數(shù)里,使用Game:HitEvent()獲得本次打擊事件的現(xiàn)場(chǎng)數(shù)據(jù),這個(gè)API返回的內(nèi)容有打擊偏差,判定等等,具體可以查閱API文檔。
總之這里我們只需要拿到打擊偏移,即打擊時(shí)刻距離Note標(biāo)準(zhǔn)時(shí)間的毫秒差值。
最后我們判斷是打早還是打晚,修改marlo的位置。
哦對(duì)了,OnHit是不能在編輯器里預(yù)覽了,你得進(jìn)入試玩親自打一打來體驗(yàn)這個(gè)效果。