1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Unity】【Shader】【SpriteStudio6】影を落とす方法

Last updated at Posted at 2023-06-20

はじめに

個人ゲーム制作などでスプライトアニメーションをさせたいときなどは、条件はあるが無料で使うことのできる SpriteStudio6 がおすすめだ。

ただ、このツールを使って作られたスプライトアニメ素材を、ただ単に3D世界に配置しただけだと影が落ちない。

どうにか影を落としたいと思うとShaderをいじる必要があるが、Shaderはかなりとっつきにくい。
初心者が特にShaderの勉強をせずに、今回の目標を達成しようとすると結構ハードルが高い。

なので、そのクリティカルパスをメモっておこうと思う。

環境

今回の環境は以下の通り
・Unity (2020.3.43f1)
・SpriteStudio6 (OPTPiX SpriteStudio Ver.6 Professional)

UnityにSpriteStudio6のスプライトアニメをあてがう方法はSpriteStudioの公式サイトから読み解いて下さい。

実装方法

その後、↓のShaderファイルを開いて、編集してください。

Assets/SpriteStudio6/Sprite_SpriteStudio6.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専門家ではないので、調べようとすると結構気合入れないとですね。

頼られると嬉しくなっちゃうので、いい感じにおだてて下さればもうちょっと調査頑張ってみます(苦笑)
何かあれば、↑のツイートにリプなどあれば対応するかも

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?