#author("2023-12-02T09:01:31+09:00","default:post","post")
#author("2023-12-02T22:37:44+09:00","default:post","post")
*簡単なシェルの揚げ方 [#t8d16a3e]

シェルの作成は里々の領分ではないので、ここでは自力で絵を描ける・編集できる人向けのサクッと作る手順を紹介。~
参考情報/2023年11月時点。

----
#contents
----
~

シェルの仕様書は先人の努力の積み重ねもあって高機能だが、そのぶん複雑にもなっている。~
新機能もどんどん追加されているので、マニュアルがまだ追い付いていないことも多い。~
そこで、以下では現在の主流SSPを前提としたシンプルな手順を紹介。~

なにはともあれまずはSSP公式仕様書へ。~
着せ替えなどは解説が膨大になりやすいのでここでは割愛します。

-[[UKADOC - シェルの作り方>http://ssp.shillest.net/ukadoc/manual/dev_shell.html]]
-[[UKADOC - descript.txt>http://ssp.shillest.net/ukadoc/manual/descript_shell.html]]
-[[UKADOC - surfaces.txt>http://ssp.shillest.net/ukadoc/manual/descript_shell_surfaces.html]]


*シェル画像の用意 [#gd1ea871]
ゴースト名\shell\masterフォルダ内に画像を作る。~
(フォルダの構成は[[ファイル構成]]を参照)~
過去の仕様も使えるので色々こんがらがるが、''今は新機能によってpnaを用意したり背景を原色にする等は必要なくなった''。~

**ベース画像を描こう [#c84ba1fd]
画像形式は''PNG32(32bit-PNG、アルファチャンネル透明度つきPNG)''で保存しよう。~
ファイル名は自分で覚えやすいもので。~
#ref(surface_base.png);
※ここではあくまで例としてAIさんに描いてもらいました。

**差分画像を作ろう [#e8c92da6]
表情などの差分はできるだけ透明部分(元絵の外縁部)を含めないように切り取るのがポイント。~
解像度も変更しないのが吉。
#ref(surface_parts.png);
同じく形式は''PNG32(32bit-PNG、アルファチャンネル透明度つきPNG)''で保存しよう。~
こちらもファイル名は自分で覚えやすいもので。~

**当たり判定の画像を作ろう [#e2b6633c]
&color(#FF0000){なにそれ!?};…と思った人もいると思うが、これを使うとかなり手間を省ける。~
(当たり判定がいらない場合は下記はスルーして欲しい)~

ゴーストの当たり判定については触った事があると思う。~
従来はsurfaces.txtに書き込む情報なのだが、座標の数字を一つ一つ入力しなければならなかったため、これがまた非常に手間がかかるものだった。~
しかし、現在ではこれを画像で代用できるようになり、絵を描けるなら''この手間を省略できるようになった''。~
具体的には、2値ペンなどを使い、こういうものを作る。~

#ref(surface_region.png);

画像形式はPNG。特に気にせずPNG32でよい。~
ただし、塗った色情報(RGB)はきちんとメモに控えておくこと!~
この画像の例では

||&color(#ff0000){R};|&color(#00ff00){G};|&color(#0000ff){B};|h
|頭(Head)が赤|255|0|0|
|顔(Face)が緑|0|255|0|
|胸(Bust)が紫|255|0|255|

という色の情報をメモしておこう。~

作るときは下図のようなイメージで。~
使っているお絵描きツールで上から新規レイヤーで塗っていくとやりやすい。~

#ref(surface_region2.png);



*descript.txtを作る [#fc4afd70]

ここからはテキスト編集作業。~
メモ帳でもいいけど、なんかよさげなテキストエディタを選ぶと捗るはず。~
descript.txtはゴーストの辞書本体側(ghost)にも同じ名前のファイルがあるので、混同しないように気を付けて!~
こっちはシェル側のdescript.txt。

 charset,UTF-8
 
 craftmanw,作者名
 type,shell
 name,シェルの名前
 
 seriko.use_self_alpha,1

どれも重要だが、「seriko.use_self_alpha,1」に注目。~
これを書いておかないと用意したPNGの透明度が適用されない。~
また、下のsurfaces.txtに共通して、「charset」はShift_JISかUTF-8の文字コードを指定しよう。~
(今のwindowsで新規作成→テキストドキュメントで作った場合、文字コードは''UTF-8''になっているはず)~
これが違うと全角文字が化けるので、逆に化けていたなら文字コードが間違っているとも言える。~

*surfaces.txtを作る [#j1fe34ad]

これさえ終わればシェルの最低限の体裁は整う。頑張って。

 charset,UTF-8
 
 descript
 {
 	version,1
 }
 
 surface0
 {
 	element0,base,ベース画像.png,0,0
 	collisionex0,Head,region,当たり判定画像.png,255,0,0
 	collisionex1,Face,region,当たり判定画像.png,0,255,0
 	collisionex2,Bust,region,当たり判定画像.png,255,0,255
 }
 
 surface1
 {
 	element0,base,ベース画像.png,0,0
 	element1,overlayfast,差分画像その1.png,0,0
 	collisionex0,Head,region,当たり判定画像.png,255,0,0
 	collisionex1,Face,region,当たり判定画像.png,0,255,0
 	collisionex2,Bust,region,当たり判定画像.png,255,0,255
 }
 
 surface2
 {
 	element0,base,ベース画像.png,0,0
 	element1,overlayfast,差分画像その2.png,0,0
 	collisionex0,Head,region,当たり判定画像.png,255,0,0
 	collisionex1,Face,region,当たり判定画像.png,0,255,0
 	collisionex2,Bust,region,当たり判定画像.png,255,0,255
 }

こんな感じで書いていけばサーフェス番号(0)と(1)と(2)が完成!~

ざっくりな解説
-&color(#ff0000){descriptブレス};~
ここでversion,1を指定しておかないと、以下でふんだんに使っている新仕様が機能しない。必須。
-&color(#ff0000){surface*ブレス};~
これの*で指定した数字が、サーフェス番号に対応する。0番のサーフェスにはsurface0{}という風に。
-&color(#ff0000){element*,描画メソッド,ファイル名,X,Y};~
画像ファイルの指定。まんまお絵描きアプリの「レイヤー」。elementは数字の大きい方が上になる。~
画像ファイルの指定。まんまお絵描きアプリの「レイヤー」。*の数字が大きい方が上のレイヤーになる。~
描画メソッドはレイヤーの合成方法。baseはまるごと、overlayfastは透明部分以外を重ねるみたいな。~
要するに一番下のレイヤーはbaseで、上に重ねるレイヤーをoverlayfastにすればいい。~
XYは重ねる座標をpx単位でいじれる。ベースと差分画像の大きさが一緒なら0,0でいいから楽!
-&color(#ff0000){collisionex*,当たり判定名,region,ファイル名,R,G,B};~
画像のどの色を当たり判定にするかの指定。~
さっきメモした色情報を正確に書いていこう。

なお、このままシェルにぶちこんだ場合、SSPが「Surface10が存在しないよ!」とエラーを言ってくるが、これは伺かが伝統的に0番と10番を最初のデフォルト立ち絵として呼び出すため(メインが0、相方が10)なので、10番を定義すれば解消するし、surface10.pngという名前の画像ファイルを用意する事でも解決する。~
なお、このままシェルにぶちこんだ場合、SSPに「Surface10が存在しないよ!」とエラーを言われるが、これは伺かが伝統的に0番と10番を最初のデフォルト立ち絵として呼び出すため(メインが0、相方が10)なので、10番を定義すれば解消するし、surface10.pngという名前の画像ファイルを用意する事でも解決する。~
surface10.pngを用意する場合は1ドットの画像にしておくとよい。強制的に透明になる。~

いずれにせよ致命的なエラーではないので安心しよう。~


**もっと記述量を減らしたい! [#w507b105]
いちいちcollisionexの行をコピペしまくるのが面倒!~
って感じたなら上の例は下のように書き換えられる。~
これで記述する手間をかなり省けるはず。~

 charset,UTF-8
 
 descript
 {
 	version,1
 }
 
 surface0-2
 {
 	element0,base,ベース画像.png,0,0
 	collisionex0,Head,region,当たり判定画像.png,255,0,0
 	collisionex1,Face,region,当たり判定画像.png,0,255,0
 	collisionex2,Bust,region,当たり判定画像.png,255,0,255
 }
 
 surface.append1
 {
 	element1,overlayfast,差分画像その1.png,0,0
 }
 
 surface.append2
 {
 	element1,overlayfast,差分画像その2.png,0,0
 }

-&color(#ff0000){surface*};~
ここでのsurfaceブレスの*は「0-2」と書いてある。~
これは0番1番2番を意味しており、この全てにベース画像と当たり判定を設定するという意味になる。~
指定方法には「0-99」や「0,2,4」といったやり方もあり、「0-9,20-29」といった組み合わせも可能。~
-&color(#ff0000){surface.append*};~
これは*で指定したサーフェス番号に追記する時に使う。こちらも*に「0-2」とか「0,2,4」といった指定可。~
今回の例では同じベースや当たり判定はsurfaceブレスで一括で指定しておいて、~
surface.appendブレスで1番と2番のelement1に差分画像を設定するやり方。

なお、一つのサーフェス番号に対してsurfaceブレスは一度しか使えず、surface.appendブレスは何度でも使える仕様。~
アニメーションの定義の時も省力化に活用できるので覚えておくと便利。

*シェル制作TIPS [#j402e2be]

**差分の組み合わせは何を選べばいい?という話 [#ia04b9d6]
シェルの差分の組み合わせの方法は、大きく分類すると2パターンある。~
ここでは上とは別のAI氏に描いてもらった絵を加工したものを例に解説。

***パーツ分割タイプ [#qba50041]
こちらはベースをのっぺらぼうにしておいて、上に目・口といった差分パーツを重ねていく方法。
こちらはベースをのっぺらぼうにしておいて、上に目・口といった差分パーツを組み合わせる方法。

#ref(ex_parts1.png);

-&color(#0000ff){''利点''};~
パーツを一通り出力するだけで済む。~
また、この例では眉をちょっと修正したくなった…なんて時もそのパーツだけ直せばいいので修正が楽。~
パーツ単位で分解されているのでsurfaces.txtによって組み合わせの数が多彩。色々な表情を作れる。~
汗や怒りマークなどの有無も一行追加するだけで済むので手間がかからない。
パーツ毎に分かれているため後から画像の修正が楽。~
surfaces.txtによって多彩な組み合わせができ、色々な表情を作れる。
-&color(#0000ff){''難点''};~
surfaces.txtのテキスト編集作業が多い。~
組み合わせが多彩という事は、多彩なパターンを用意する分だけ作業量も膨大になるということ。~
パーツが少ない内はまだしも多様性と作業量はトレードオフ…。
surfaces.txtのテキスト作業量が多い。~
組み合わせが多彩という事は、多彩なパターンを用意する分だけ作業量も膨大になるということ。

***まるごとタイプ [#h15366e5]
こちらは差分画像をパーツ周辺で切り取る、もしくはサーフェス毎にまるごと一枚絵にする方法。

#ref(ex_parts2.png);

-&color(#0000ff){''利点''};~
パーツ分割タイプと比べ、surfaces.txtのテキスト作業量が極めて少ない。~
作業の大半を画像出力で賄う上、レイヤー調整しながら視覚的にサーフェスを作れるのでほとんどsurfaces.txtを意識せずに済む。
パーツ分割タイプと比べてsurfaces.txtのテキスト作業量が極めて少ない。~
レイヤーで調整しながら視覚的にサーフェスを作れる。
-&color(#0000ff){''難点''};~
絵の細部を修正したくなった場合、そのレイヤーを使っている全てのサーフェスを出力し直す必要がある。~
特に線画のフチ・はみ出ている部分など、実際に使ってみてから細部に気付くケースは多い。後から全部出力し直しとなると…。~
表情の数だけ画像を出力する必要がある。つまりサーフェス数が増えるほど作業量が膨大になる。~
線画のフチ・はみ出ている部分など、後で絵の修正を行おうとすると関連サーフェスが全て出力し直しになる。



*アニメーション [#ed6c90ac]
シェル(とSERIKOの仕様)ではそれぞれ独立した瞬き・口パクなどのアニメーションを行える。~
これも詳細はUKADOCを参照、ここではさわりだけ解説。


以下の定義はサーフェス0番に瞬きを追加する例。

 surface.append0
 {
 	animation0.interval,sometimes
 	animation0.pattern0,overlayfast,100,0,0,0
 	animation0.pattern1,overlayfast,102,50,0,0
 	animation0.pattern2,overlayfast,101,50,0,0
 	animation0.pattern3,overlayfast,100,50,0,0
 }
 
 // アニメーション用のサーフェス
 surface100
 {
 	element0,base,blink1.png,0,0
 }
 surface101
 {
 	element0,base,blink2.png,0,0
 }
 surface102
 {
 	element0,base,blink3.png,0,0
 }

-画像による解説
#ref(animation.gif);

アニメーションの定義方法は、SERIKOの新定義では以下のようになっている。~
-&color(#ff0000){animation*.interval,インターバル};~
-&color(#ff0000){animation*.pattern*,描画メソッド,サーフェスID,ウェイト,X座標,Y座標};~
この二つはワンセット。

&color(#ff0000){インターバル};はこのアニメの発生するタイミングを指定する。詳しくはUKADOC。常に再生したり、トークに合わせて再生したりなどができる。~
&color(#ff0000){animation*};はアニメ番号(さくらスクリプトの\i[番号]などで呼び出せる)。~
&color(#ff0000){pattern*};はアニメのコマで0から通し番号。小さい順に再生される。~
&color(#ff0000){描画メソッド};はelementのものと似ているが、より様々な指定方法がある。

そして&color(#ff0000){サーフェスID};について、ここが注意点。~
見ての通り''elementと違って画像ファイル名の指定ではない''。~
SERIKOによるアニメーションでは、サーフェスに別のサーフェスを重ねる形になるため。~
上の例では100番、101番、102番にて画像ファイルのサーフェスを設定しており、~
これを順次呼び出してパラパラマンガのように付け替えている。

&color(#ff0000){ウェイト};はそのコマを「描画するまで」の待ち時間で、単位はミリ秒。~
&color(#ff0000){X座標,Y座標};は貼り付ける位置を数値分ずらすことができる。

なお画像による例では全てX座標・Y座標に0を指定しているが、これを行う場合は(画像内に不要な部分が多くても)画像サイズはそのままにしておくのがミソ。~
画像の左上から切り取るようにしてもOK。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS