「おっこの立ち絵可愛い! ダウンロード!」→「組み合わせ差分多すぎだろ...」
anmの作成や編集ミス防止の観点では、衣装×腕などの組み合わせ差分が多いと手間が増えやすい
その場合の対応はだいたい以下の①~④
- 衣装ごとの腕用anmを作り、衣装を切り替えたら腕用anmも変える
- 立ち絵を衣装ごとに分割→共通のanmで使い回せるように差分レイヤー名を統一
- 諦めて使う衣装差分を1~2種に絞る
- もっと諦めて別の立ち絵を使う
anmの書き方次第では①と②の手間を解消することができ、結果的に③と④も諦めなくて良くなる
衣装差分×腕差分を例として記載するが、組み合わせのある他の差分にも応用できる
本anmファイルの書き方によって得られる恩恵
このように衣装を変えても腕差分用のスライダーは使い回せるしデフォルト衣装なのに腕は制服用、のような破綻は起こらなくなる
この立ち絵は衣装が2種類だが、衣装が10種類あるような立ち絵でも同じことができる
配布anm
とはいえスクリプトを書いたことない人がいきなり書くには難しい内容だと思うので、まずは配布しているanmをダウンロードするのをおすすめする
立ち絵制作者の方から許可を得て公開させていただいています。許可をくださりありがとうございました。
基本的な考え方
- スライダーでの選択値を判定に利用
- 判定結果によって、差分レイヤーのパスに追記する文字列or差分テーブルを切り替える
コード解説
色んな立ち絵に流用できるよう、スライダー登録処理を関数化している
配布anmは同一の関数ではないが大体の機能は同じ
function buildSlider(trackNo, layerList, layerPrefix, sliderSlots)
if not layerList or #layerList == 0 then return end
sliderSlots = sliderSlots or #layerList
local values = {}
--layerPrefixに引数がある場合は、差分レイヤー名と結合させて、差分レイヤーのパスを組み立てる(※1)
local buildLayer = layerPrefix
and function(var) return layerPrefix..var end
or function(var) return var end
--差分テーブルを逆順でスライダーに登録する(※2)
for i = #layerList, 1, -1 do
values[#values +1] = buildLayer(layerList[i])
end
--スライダーの最大値に対して、登録差分レイヤー数が少ない場合に最後の差分レイヤーで埋める(※3)
while #values < sliderSlots do
values[#values +1] = buildLayer(layerList[1])
end
PSD:addstate(values, trackNo)
end
※1 空文字""を追記でも大体問題ないが、口パクや目パチ差分に空文字が追記されるとエラーになるため
※2 PSDToolKitウィンドウから差分レイヤーをコピーしてくると立ち絵での並びと逆になってしまうので、元通りにしてからスライダーに登録
※3 空き枠を選ぶと立ち絵のデフォルト状態が適用され、立ち絵が破綻する場合があるため常に何かしらの差分が選ばれるようにしておく
--track0:衣装,1,4,0,1
--track1:左手,1,8,0,1
--track2:右腕,1,5,0,1
--track3:右手,1,6,0,1
local clothes = {
"v1.本体/茜ちゃん/本体/本体/*制服/*ジャージ",
"v1.本体/茜ちゃん/本体/本体/*制服/*+ジャージ",
"v1.本体/茜ちゃん/本体/本体/*制服/*通常",
"v1.本体/茜ちゃん/本体/本体/*通常服",}
local armL = {
"v1.本体/茜ちゃん/手/左手/*開き",
"v1.本体/茜ちゃん/手/左手/*指差し",
"v1.本体/茜ちゃん/手/左手/*がお",
"v1.本体/茜ちゃん/手/左手/*凸",
"v1.本体/茜ちゃん/手/左手/*ちょい出",
"v1.本体/茜ちゃん/手/左手/*ドーナツ",
"v1.本体/茜ちゃん/手/左手/*よっ",
"v1.本体/茜ちゃん/手/左手/*包丁セット",}
--完全パスではなく差分レイヤー名のみでテーブルを作成
--渡す文字列は後ほど判定する
local armR = {
"/*腰に手",
"/*だらん",
"/*ちょい上げ",
"/*ちょい上",
"/*上げ",}
local handRhigh = {
"v1.本体/茜ちゃん/手/右手/*上/*通常",
"v1.本体/茜ちゃん/手/右手/*上/*閃き",
"v1.本体/茜ちゃん/手/右手/*上/*指差し",
"v1.本体/茜ちゃん/手/右手/*上/*ドーナツ",
"v1.本体/茜ちゃん/手/右手/*上/*エビフライセット",
"v1.本体/茜ちゃん/手/右手/*上/*包丁セット",}
local handRlow = {
"v1.本体/茜ちゃん/手/右手/*下/*開き",
"v1.本体/茜ちゃん/手/右手/*下/*指差し",
"v1.本体/茜ちゃん/手/右手/*下/*がお",
"v1.本体/茜ちゃん/手/右手/*下/*凸",
"v1.本体/茜ちゃん/手/右手/*下/*ちょい出",}
--スライダーの選択値取得
local sel_clothes = obj.track0
--逆順追加したので選択値そのままではなく補正値を利用。最低値を1にしているが今回の例では無意味
local idx_clothes = math.max(1, #clothes - sel_clothes +1)
--差分テーブル[補正した選択値]で選択中の差分レイヤー名を取得できる
local name_clothes = clothes[idx_clothes]
local sel_arm = obj.track2
local idx_arm = math.max(1, #armR - sel_arm +1)
local name_arm = armR[idx_arm]
--差分レイヤー名によくある*はluaだとエスケープ文字のため、findはplainをtrueにする
local isDefault = name_clothes:find("通常服",1,true) ~= nil
local handTbl,armPrefix
--テーブル内の各差分レイヤーに渡す文字列を決定するパターン
if isDefault then
armPrefix = "v1.本体/茜ちゃん/本体/右腕/*右腕(通常服)"
else
armPrefix = "v1.本体/茜ちゃん/本体/右腕/*右腕(制服)"
end
--登録するテーブルを決定するパターン
if name_arm:match("上げ$") and not name_arm:match("ちょい上げ$") then
handTbl = handRhigh
elseif name_arm:match("ちょい上$") and not name_arm:match("ちょい上げ$") then
handTbl = handRlow
end
--テーブル登録処理
buildSlider(obj.track0, clothes)
buildSlider(obj.track1, armL)
buildSlider(obj.track2, armR, armPrefix, 5)
buildSlider(obj.track3, handTbl, nil, 6)
使用する差分テーブルやそのパスの文字列を動的にすることで、多くの差分をより簡単に扱えるようになる
最後に
組み合わせや分岐の多い立ち絵は表現の幅が広がるため大変ありがたいが、切り替えや切り替え忘れの確認等で手間が増えやすいのも事実
それが解消され、差分がより多く活用されるようになってほしいと思いこのページを書いた
