はじめに
個人ゲーム制作などでスプライトアニメーションをさせたいときなどは、条件はあるが無料で使うことのできる SpriteStudio6 がおすすめだ。
ただ、このツールを使って作られたスプライトアニメ素材を、ただ単に3D世界に配置しただけだと影が落ちない。
どうにか影を落としたいと思うとShaderをいじる必要があるが、Shaderはかなりとっつきにくい。
初心者が特にShaderの勉強をせずに、今回の目標を達成しようとすると結構ハードルが高い。
なので、そのクリティカルパスをメモっておこうと思う。
環境
今回の環境は以下の通り
・Unity (2020.3.43f1)
・SpriteStudio6 (OPTPiX SpriteStudio Ver.6 Professional)
UnityにSpriteStudio6のスプライトアニメをあてがう方法はSpriteStudioの公式サイトから読み解いて下さい。
実装方法
その後、↓のShaderファイルを開いて、編集してください。
Shader "Custom/SpriteStudio6/SS6PU/Sprite"
{
Properties
{
/*省略*/
}
SubShader
{
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
}
Pass
{
Cull Off
ZTest LEqual
ZWRITE [_ZWrite]
Stencil
{
Ref 0
Comp [_CompareStencil]
Pass Keep
}
BlendOp [_BlendOperation]
Blend [_BlendSource] [_BlendDestination]
CGPROGRAM
#pragma vertex VS_main
#pragma fragment PS_main
#pragma multi_compile _ ETC1_EXTERNAL_ALPHA
#include "UnityCG.cginc"
// #define RESTRICT_SHADER_MODEL_3
#pragma multi_compile _ PS_NOT_DISCARD
#pragma multi_compile _ PS_OUTPUT_PMA
#include "Base/Shader_Lib_SpriteStudio6.cginc"
#include "Base/Shader_Data_SpriteStudio6.cginc"
#include "Base/ShaderVertex_Sprite_SpriteStudio6.cginc"
#include "Base/ShaderPixel_Sprite_SpriteStudio6.cginc"
ENDCG
}
// ここから下が今回追記した影を落とす処理(半分は↑の基本描画のコピペ)
Pass
{
Tags{ "LightMode"="ShadowCaster" }
CGPROGRAM
#pragma vertex VS_main
#pragma fragment PS_main
#pragma multi_compile_shadowcaster _ ETC1_EXTERNAL_ALPHA
#include "UnityCG.cginc"
// #define RESTRICT_SHADER_MODEL_3
#pragma multi_compile _ PS_NOT_DISCARD
#pragma multi_compile _ PS_OUTPUT_PMA
#include "Base/Shader_Lib_SpriteStudio6.cginc"
#include "Base/Shader_Data_SpriteStudio6.cginc"
#include "Base/ShaderVertex_Sprite_SpriteStudio6.cginc"
#include "Base/ShaderPixel_Sprite_SpriteStudio6.cginc"
ENDCG
}
}
FallBack Off
}
別ファイルにコピーを取って、コピー先のShaderファイルに実装する方法は今回は避けています。
(どうやら実行時にこのShaderをあてがう処理が自動で走っていて、コピー先のShaderをあてがっても上書き参照されちゃいます。その辺の処理を追いきれていないので今回の記事では触れません。)
↑のShaderが適応された状態が↓の動画です
残りの課題
とりあえず、影を落としたいだけでしたらこれで十分ですが、まだ問題はあります。
・裏面だと影が落ちない(単にY軸180度回転で左右反転した場合など)
・このスプライトアニメ側に別の何かの影を投影できない
↑の問題も今回手を加えたShaderファイルに追加の処理を書けばなんとかなるような気がしますが、僕はShader専門家ではないので、調べようとすると結構気合入れないとですね。
頼られると嬉しくなっちゃうので、いい感じにおだてて下さればもうちょっと調査頑張ってみます(苦笑)
何かあれば、↑のツイートにリプなどあれば対応するかも