見出し画像

【Unity VRゲーム制作】#30 オブジェクトを強調表示①<UnityFx.Outline:導入編>

こんにちは!ぶぁんぶーる・らぼの大島です。
前回は「Interactableオブジェクト」を数秒後に元の位置にもどす制御を追加しました。
今回は「Interactableオブジェクト」にホバーした際にアウトラインで強調表示されるようにしていきたいと思います。


UnityFx.Outlineとは

3Dオブジェクトにアウトラインを付けらえるプラグインアセットらしく、とくにURPに対応しているところがいいそうです。
今回作っている環境もURPになりますので、こちらのプラグインを使っていきたいと思います。

導入に際しては、こちらの記事を参考にしました。

導入手順

「Edit」→「Project Settings」を開き、「PackageManager」を選択してください。
Name:Arvtesh
URL:https://registry.npmjs.org
Scope(s):com.unityfx
記入することができたら右下にある「Save」をクリックしてください。

「Window」の「PackageManager」を開いてください。
「Packages:MyRegistries」を選択したら、「Outline toolkit(URP)」を選択して「Install」を実行してください。

「Outline toolkit」と「Outline toolkit(URP)」がインストールされていれば成功です。

アウトラインの設定のやり方

「Assets」の「Settings」にある「URP-HighFidelity-Renderer」をクリックしてください。

「URP-HighFidelity-Renderer」の「Inspector」にある「Add Renderer Feature」をクリックして、「Outline Feature」を追加してください。

「Outline Feature」を追加することができたら、アウトライン専用の「Layer」を用意します。
「Hierarchy」にある「Interactable kinematic」の「Inspector」にある「Layer」の「Default」をクリックしてメニューを開き「Add Layer」をクリックしてください。

たとえば、「Use Layer 8」に「Item」と書き込みましょう。

さきほどの「URP-HighFidelity-Renderer」の「Inspector」にある「Outline Feature」をもう一度表示してください。
このなかの「Outline Filter Settings」を「Use Layer Mask」に変更してください。その中にある「Layer Mask」をさきほど設定した「Item」に変更してください。

「Interactable kinematic」に戻り、「Layer」を先ほど設定した「Item」に変更してください。

レイヤーを選択すると「全ての子も変更しますか?」と聞かれるので、「Yes,change children」ですべてを変更してください。

そうすると3つあるオブジェクトのうち、レイヤーが「Item」の「Interactable kinematic」だけアウトラインが赤く表示されます。

複数のアウトラインを表示する

「URP-HighFidelity-Renderer」の「Inspector」にある「Outline Feature」をもう一つ追加してください。
同じように「Outline Filter Settings」で「Use Layer Mask」を選択し、「Layer Mask」を「Water」にしてください。
さらに、色を「青色」に変更してください。

「Hierarchy」にある「Interactable Instantaneous」の「Layer」を「Water」に変更することで青色のアウトラインを表示することができました。

Error:invalid subscript 'uv' at line 26を解決する

このエラーがどういった理由で発生するのかわかりませんが、エラーは気持ちよくないので解決策を探しました。

このエラーは「Reimport」しても直りません

こちらの記事で解決策が提供されておりました。

「Outline Color.URPshder」の「half4 FragmentAlphaTest」の「uv」がよくないようです。

	half4 FragmentAlphaTest(Varyings input) : SV_Target
	{
		half4 c = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
		clip(c.a - _Cutoff);
		return 1;
	}

解決方法は、同じ記事のコメント内にて提供されています。

1.Create a new Outline Resources file
2.Create a blank shader graph URP unlit shader
3.Set Render shader in the created resources file to the created shader
4.Set Outline shader to Outline.URP
5.Set Outline resources of all Outline feature render features in the Universal Renderer Data to the created resources file

https://github.com/Arvtesh/UnityFx.Outline/issues/63#issuecomment-1368667009

・Outline Resourcesを新しく用意します。
「Assets」の何もないところを右クリックしてメニューを開き、「Creat」→「UnityFx」→「Outline」→「Outline Resources」を選択してください。
「Outline Resources」の名前を「OutlineResources_original」に変更してください。

・Shader graph URP unlit shaderを新しく用意します。
「Assets」の何もないところを右クリックしてメニューを開き、「Creat」→「Shader」→「Unlit Shader」を選択してください。
「Unlit Shader」の名前を「UnlitShader_original」に変更してください。

・Outline ResourcesのReder shaderを入れ替えます。
先ほど作成した「Outline Resources」の「Inspector」で「Reder shader」が問題のある「Outline Color.URP」になっているので、これを「UnlitShader_original」にアタッチして変更します。
「Outline shader」はそのままで大丈夫です。

・Outline FeatureのOutline Resourcesを変更します。
「Assets」の「Settings」にある「URP-HighFidelity-Renderer」の「Inspector」で「Outline Feature」の「Outline Resources」をさきほど作成した「Outline Resources_original」に変更します。
なお、使用している「Outline Feature」のすべての「Outline Resources」を変更してください。

これで設定は完了です。
問題のあった「Outline Color.URP」の「Inspector」を見るとエラーがなくなっています。

念のため、Unityプロジェクトを再起動しましたが、エラーは再発されず、アウトライン表示も行われていました。

おわりに

ゲームオブジェクトに対する「UnityFx.Outline」を用いたアウトライン表示を切り替えることができました。
エラーが出ましたが、なんとかなくせました。

次回は、コントローラをホバーした際にアウトラインが強調表示されるようにしていきます。

ここまで読んでくださり、ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?