2016年7月27日 星期三

[PS Script] 透過 Photoshop Script 獲取 Smart Object 的旋轉值

嘗試了一下,還沒成功,先筆記目前的內容。

主要參考:

方法是透過 Action 來獲取。
如要查找 Event ID 可以安裝 Script Listener,安裝指引見 Photoshop Scripting Guide 的 73 頁。

但目前的 Code 只能獲取剛剛輸入的值,不能直接獲取既有的值…


2015年5月5日 星期二

[MAXScript] 簡易算圖管理工具 - JH Batch Camera Render

近日同事有些Render的需求且項目頗為繁雜,需要一個較方便的工具簡化作業流程,這類工具相當多,但約有一年沒碰3dsMax的我實在是很想寫寫MAXScript,因此做了這個工具,希望能讓同事節省時間,少做些無聊沒意義的事情。

參考
我從現在已有的工具中找了一個做參考,參考的是Batch Camera Render by Sergo Pogosyan,此工具做的很完善,功能十分強大,但我希望能夠更靈活的去編輯Task項目,我的Render需求也沒有那麼深入,所以也大幅簡化功能,只做出我需要的部份。

資料的儲存方式
Sergo的工具中Task項目的資料是透過Custom Attributes做儲存,好處是資料跟max檔案一體,不容易丟失,但就不符合我希望能靈活修改的需求,因此我改用外部檔案的方式去儲存,目前是使用了INI格式,但後來發現INI格式會帶來一些限制,降低了修改的便利性,因此未來打算再改成用自訂的格式去儲存。

單一max檔案
在max檔案中初次新增Task的同時,會在max檔案所在的資料夾下建立一個對應的INI檔案,裡面儲存的就是所有的Task資訊,之後在重新開啟此max檔案時,會從對應的INI檔案中讀取資料。

複數max檔案
而Batch功能則是可以選取多個max檔案(目前限制在同一個資料夾內),會輪流開啟這些檔案,並讀取對應的INI來獲取Task進行batching作業。

JH_BatchCameraRender.ms


2015年3月29日 星期日

[JSFL] Flash Keyframe Navigator

前一陣子寫的Script,可在Flash中快速選擇上一個或下一個關鍵影格,參考自Todd Slaughter的Script,做了一些修正與功能新增。

功能說明:
  • 主要功能
    • 選擇任何圖層上的上一個/下一個關鍵影格
    • 選擇當前圖層上的上一個/下一個關鍵影格(可作用於移動補間的關鍵影格)
  • 補充說明
    • 可以循環選擇關鍵影格(從最後一個關鍵影格跳到第一個關鍵影格)
    • 會略過Folder圖層
下載地址:
Flash ZXP檔案下載(Google Drive)
安裝方法:
安裝Extension後再去Flash中為命令設定Hotkey
問題待修:
  • 選擇無效影格時無法正確跳至下一個影格

2015年3月7日 星期六

[PNG] PNG壓縮工具 - 更佳的壓縮率 - TinyPNG

TinyPNG是個將圖片壓縮成8 bit且可有透明效果的PNG壓縮軟體,其透明效果處理相當好,也能夠有效壓縮圖檔容量,相當好用。TinyPNG的定位與先前介紹過得PNG Gauntlet有所不同,但對於一般狀況來說TinyPNG是比較好用。

有提供線上直接壓縮,也可以安裝Photoshop Plug-in
https://tinypng.com/


2015年1月8日 星期四

[DragonBones] New Feature - Hit Area

目前DesignPanel v3.01版本在測試新的功能「碰撞範圍」,可以在Flash中直接定義碰撞範圍,輸出到引擎中,讓DragonBones To Engine的流程更加順暢、直覺,不過此功能尚在測試中,所以不確定性非常高,在這邊只是做個紀錄…

實作方法是在Flash中建立導引線圖層並且圖層名稱以@開頭,然後在圖層內用基本形狀工具(矩形或橢圓形皆可)去定義碰撞範圍即可,不過目前的設計是hit area是隸屬於armature,且不具有時間軸,因此限制很大。如果想要不同動作有不同的hit area會不是這麼直覺,如果又想要hit area隨著動作演出而有改變的話,又更是困難了,雖不是完全沒辦法,但會變得頗複雜…很不直覺…

2014年12月31日 星期三

[Flash] Elec­tric Dog Flash Ani­ma­tion Power Tools for Animator

在Flash中製作2D動畫(在此指的是紙片人式2D動畫,類似骨骼動畫之形式)是相當麻煩的,原因之一是操作太過原始、瑣碎,浪費相當多的時間,而Elec­tric Dog Flash Ani­ma­tion Power Tools(以下簡稱EDAPT)這個工具,透過commands及metadata使的操作變得更加簡單快速,並且具有階層性骨架結構的操作功能。這個工具的好處是輕量能簡易上手,功能不龐大,適合單純使用Flash的使用者,唯使用此工具可能會需要一段時間做Setup,因此實際上是否能帶來更有效的製作流程得看製作需求與個人習慣而定。官方網站如下:
Flash Power Tool - Elec­tric Dog Flash Ani­ma­tion Power Tools
要注意這個工具是從強化Flash的操作之角度所設計,而其提供的一些功能(commands)其實都可以手動完成,EDAPT只是幫你做了自動化處理,當然也有手動無法替代的功能,這就是他最重要的部份。

此工具主要的功能是:
  1. Magnet Target
    透過預先設置在元件內的Magnet Target(一個作為定位用的元件),別的元件即可吸附到這個位置上(執行指令後,會去尋找最近的有效Magnet Target並將所選元件對齊該位置)。
    ※可以把Magnet Target想成是骨頭的結束點,而起始點就是元件的註冊點。
  2. Hierarchy Rig
    能夠定義骨架階層,建立一個骨架結構,再把場景上的元件綁定到骨架結構上,如此就可以達到具有骨架階層關係的操作系統,例如可以自動選擇所有子元件。
EDAPT原本提供的Set Magnet Target command並不是很人性化,因此我修改了一個版本,將該command的運作方式改為:
  1. 先選擇場景上想要成為Parent的元件
  2. 再選擇要成為Child的元件
  3. 執行Command
  4. 即可在父元件內的正確位置上產生Magnet Target
日後再將此command share出來。

[Flash]製作Extensions - 封裝ZXP擴充功能

本文寫的是針對Flash CS6版本的Extension製作,在CC版本中Extension的封裝已經改由Extension Packager負責。

製作Extension時必須要先製作一個mxi檔案,用於敘述這個Extension的資訊,而這個mxi檔案最機車的地方就是所有要封裝的檔案都必須要寫在其中…因此如果你有30個檔案就要寫30行…而這個mxi檔案主要需要編寫的地方是…

[PNG] PNG壓縮工具 - 更佳的壓縮率 - PNG Gauntlet

對遊戲研發來說,美術素材絕對是整個遊戲容量的最大問題來源,尤其現在的手遊市場、中國低階市場對遊戲容量(包)的要求更是嚴苛。那麼美術人員能夠做什麼樣的優化,讓美術資源佔用更少容量呢?從量最大的Texture來說,大部分的美術人員用Photoshop等工具存出圖檔後就不會再做任何處理,但其實Photoshop在檔案輸出的部份優化的並不是很好,我們可以透過其他的工具讓輸出的圖片容量更小,且達到幾乎完全相同的品質。在此就介紹一個可以有效壓縮PNG的軟體「PNG Gauntlet」,這個軟體是我在參與2013 GDC Taipei時聽到Qubit Games的創始人兼美術總監路致遠先生提到才知道的,因為過往我也是個不太care這個問題的美術…

PNG Gauntlet

http://pnggauntlet.com/

2014年12月17日 星期三

[Flash]Transformation Matrix


本篇僅做紀錄用

座標系
原點{x:0, y:0}在左上角
+x向右
+y向下
Affine transformation
Flash的Transformation Matrix:

2014年12月15日 星期一

[DragonBones]讓物件隱藏顯示又保有骨架繼承

由於DragonBones的骨架結構是具有繼承效果的(會繼承父骨頭的位置、傾斜),因此當父骨頭(圖層)沒有內容物(空白關鍵影格),而子骨頭又還有內容物時,就會造成子骨頭的位移繼承錯誤,跑出奇怪的動態結果,而這個問題的解決方法就是用隱藏內容物來替代刪除內容物。

隱藏內容物只是將影格中的元件不顯示,元件仍然存在在影格之中,如此可讓內容物不被看到但又不會丟失骨架繼承,但這個技巧只能作用在影片片段元件上,可以透過屬性面板中的顯示頁籤的『可見』參數設定該元件會不會被顯示出來,而DragonBones會把這個參數寫入匯出的資料中,在xml檔案內參數名稱是hide。

可見參數可以控制元件的顯示狀態
可見參數會被DragonBones輸出為hide參數

參考:

2014年12月13日 星期六

[Spine] Spine匯入Unity,使Spine中的Root motion在Unity中實現

Spine進Unity,是不會像FBX一樣可以把FBX中的Root motion直接當作Unity中Game object的Root motion,因此需要額外自己寫script實現,在Spine Forum中有一篇討論串有討論到這個問題:
Applying Root Motion
Mitch 提供了一個解決方案
Had to modify SkeletonAnimation and add a callback between Update and Apply because the Time and LastTime are set to be equivalent by the time UpdateBones is called.
修改了SkeletonAnimation.cs以及SkeletonRootMotion.cs兩個檔案,實現X軸的Root motion。但是我的需求是X及Y軸都需要實現,因此對SkeletonRootMotion.cs做了一些修改,修改後的結果post在Forum中,在這邊補充一下,我不是Programmer所以Code可能不盡完善、正確...
http://esotericsoftware.com/forum/viewtopic.php?f=7&t=1364&start=26
也可以在我的GitHub上查看,檔案內直接保留了Mitch原始的code,可以直接做比對:
https://github.com/januswow/TAG/blob/master/TouchActionGame/Assets/spine-unity/Assets/spine-unity/SkeletonRootMotion.cs
主要的重點是Spine的Frames Data是以[time, x, y, ... time, x, y]的格式寫入,因此在GetXYAtTime()時,frames變數(timeline.frames)的取用需要注意:
float lastFrameX = frames[frameIndex - 2];
float lastFrameY = frames[frameIndex - 1];
另外一個題外話,由於Spine輸出的資訊完全不同於FBX,因此尚無法搭配Mecanim系統,不過nicloay有寫一個Importer,使Spine能夠在Mecanim中運作,可惜的是無法支援全部的資訊,如FFD等...
http://esotericsoftware.com/forum/viewtopic.php?f=11&t=2012

動作流程控制參考: