見出し画像

【Unity】3Dローグライクゲームの作り方〜Step12-1〜

前回の記事はこちら
前回は状態異常が回復するアイテム効果を実装しました。
Step11はとりあえず飛ばします。理由としては、ゲームのレベル調節をするにはやはりダンジョンの自動生成やレベルアップなどの実装が不可欠だと考えるからです。
この二つの実装が完了したら、Step11に戻ろうと思います。

上り階段のオブジェクトの作成

今回から階段の上り下りの実装をしていきたいと思います。
それを行うには階段自体が無いと駄目ですね。という訳で作成していきます。
まず、ヒエラルキータブ内のField階層下に「Stairs」という名前の空オブジェクトを作成します。
次にその階層下に「UpStairs」という空のオブジェクトを作成し、その下に階段のオブジェクトをいれます。筆者はキューブを3段階段状に並べて、上り階段を表現することにしました。
(勿論階段の3Dモデルがある方はそちらを使って頂いても構いません。もしくは、エフェクトなどでワープゾーンを作り、それを階段の代わりにしてもいいかもしれません)

スクリーンショット 2020-05-27 16.48.32

なおこの階段の形状にする場合、キャラクターなどと重なった時そのモデルがめり込みますが、今回はこのまま行かせて頂きます。
マテリアルの設定などが終わったら、UpStairsをプレハブ化しておきます。ヒエラルキータブ内からは削除しないようにします。
(なおこの画像内ではFloor階層下にStairsを入れていますが、必ずField階層下に配置して下さい!)

下り階段のオブジェクトの作成

次は下り階段です。Stairsの階層下に「DownStairs」という空のオブジェクトを作成し、その中に下り階段もしくはそれに相当するオブジェクトを入れて下さい。
(階段をワープで表現する場合はここから先は飛ばして貰ってもいいです)

さてここで問題が発生します。下り階段を表現する為には床の下に階段を表示する必要がありますが、その場合床が邪魔になって階段が見えなくなってしまうのです。
これを改善する方法は2通り考えられます。
一つは床のオブジェクトを1マスごとに表示するようにして、下り階段のあるマスだけ床のオブジェクトを表示しないようにすることです。
ただこれはコードをそれなりに書き換える必要がありますし、オブジェクトが増えすぎてパフォーマンスに影響が出る可能性が考えられます。
それは避けたいということで、2つ目の方法を採用したいと思います。
その二つ目の方法とは、シェーダーを使います。早速やっていきましょう。
なおこれを書くに辺り、参考にさせて頂いた記事はこちら。感謝です!

まず、Assetsフォルダ内に「Shaders」フォルダを作成します。その中で右クリック→「作成」→「シェーダー」→「標準サーフェイスシェーダー」を選択します。そして、名前を「CutOutShader」にします。
次に、そのCutOutShaderシェーダーを開き、中身を以下の通り書き換えます。

Shader "Custom/CutOOutShader" {
   Properties {
       _Color ("Color", Color) = (1,1,1,1)
   }

   SubShader {
       Tags {"Queue" = "Geometry+1"}

       Pass{
           Zwrite On
           ColorMask 0
       }
   }
}

保存したら、Resources/Materialsフォルダ内に新しいマテリアルを「CutOut」という名前で作成して下さい。それにCutOutShaderシェーダーをアタッチします。
そしてDownStairs階層下に平面を作成し、CutOutマテリアルをアタッチしましょう。(この時、作成した平面のY座標の位置を0.1上げておくといいです)
もう一つシェーダーを作ります。名前を「FloorShader」にしましょう。
そして、中身を以下のように書き換えて下さい。

Shader "Custom/FloorShader"
{
   Properties
   {
       _Color ("Color", Color) = (1,1,1,1)
       _MainTex ("Albedo (RGB)", 2D) = "white" {}
       _Glossiness ("Smoothness", Range(0,1)) = 0.5
       _Metallic ("Metallic", Range(0,1)) = 0.0
   }
   SubShader
   {
       Tags { "Queue"="Geometry+2" }
       LOD 200

       CGPROGRAM
       // Physically based Standard lighting model, and enable shadows on all light types
       #pragma surface surf Standard fullforwardshadows

       // Use shader model 3.0 target, to get nicer looking lighting
       #pragma target 3.0

       sampler2D _MainTex;

       struct Input
       {
           float2 uv_MainTex;
       };

       half _Glossiness;
       half _Metallic;
       fixed4 _Color;

       // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
       // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
       // #pragma instancing_options assumeuniformscaling
       UNITY_INSTANCING_BUFFER_START(Props)
           // put more per-instance properties here
       UNITY_INSTANCING_BUFFER_END(Props)

       void surf (Input IN, inout SurfaceOutputStandard o)
       {
           // Albedo comes from a texture tinted by color
           fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
           o.Albedo = c.rgb;
           // Metallic and smoothness come from slider variables
           o.Metallic = _Metallic;
           o.Smoothness = _Glossiness;
           o.Alpha = c.a;
       }
       ENDCG
   }
   FallBack "Diffuse"
}

そしてこれをFloorマテリアルなど、床色を指定しているマテリアルにアタッチします(床色を変えていない方は新しくマテリアルを作成し、Floorオブジェクトのマテリアルに指定して下さい)。
するとこのように中央に穴が空いたはずです。

スクリーンショット 2020-05-27 18.59.04


最後に階段をキューブで再現し、下り階段の完成です。

スクリーンショット 2020-05-28 0.48.39

Floor以外のマテリアルをこのキューブにアタッチするなり、調節が終わったらDownStairsもプレハブ化しておきます。こちらもヒエラルキータブ内からは削除しないようにして下さい。

という訳で今回はここまでに致します。
次回はマップデータから階段の位置を読み込めるようにしたいです。

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