よくあるランゲームとかで、直線だけだとつまらないですよね。でも作った後に左右に曲がったり、アップダウンをつけたりするのは大変ですよね。ということでそれをシェーダーで解決しましょう!また、曲げるだけでは不十分で、スクリプトでの制御する方法も合わせて行います。
プロジェクト・シェーダーグラフ作成
今回は大きく3つに分けて解説を行います。
- プロジェクト・利用するシェーダーグラフ作成
- マテリアルへの適応、実際に曲げる
- スクリプトでの制御
まずはプロジェクト作成から行いましょう
URP対応のプロジェクトを作成
今回のCurve World Shaderは、シェーダーグラフを利用するためURP対応したプロジェクトの準備を行います。
すでに作っているプロジェクトにURPを適応する場合は別途手順が必要になります。まずは空のプロジェクトにシェーダーを作って、うまく行ってから利用プロジェクトに移動させるのがオススメです。
シェーダーグラフを作成する
右クリック>Create>Shader Graph>URP>Lit Shader Graph から作成します。シェーダーグラフを作成したら、ダブルクリックで編集を行いましょう。Shader Graphの名前は「CurveWorldShader」で作業続けます。
先に変数を作る/Blackboard
まずは利用する変数を用意しましょう。実際に曲げ始めて物足りない場合はRemapノード部分の数字を変更してください。
変数名 | 型 | 補足 |
---|---|---|
CruveX | float | Mode : Slider Min : -1 Max : 1 Default : 0 Reference : _CurveX |
CurveY | float | Mode : Slider Min : -1 Max : 1 Default : 0 Reference : _CurveY |
Texture2D | Texture2D | 特になし |
CurveX等は曲げ具合を外部から調整するために作成します。デフォルトだと変数名にアンダースコア付いたものがReferenceになっていると思います。あとでプログラムと連携させるときに利用します。
Shader Graphの編集
今回のShader Graphは以下!画像大きいの用意してますが、もっと詳細に確認したい場合はこちらのリンクから確認してください。
シェーダー自体は短め。Powerで曲げる・・・
マテリアルに適応・実際に曲げる
プロジェクトやシェーダーが準備できたら、実際に曲げて行きましょう。背景関係のモデルがあると一番いいですが、まずはPlaneを曲げてみるのが良いかと!
マテリアルを作成
CurveWorldShaderを右クリックして、Create>Materialからマテリアルを作成します。マテリアル名は「CurveWorldMaterial」としましょう。
既存のマテリアルからシェーダーを適応したい場合は、マテリアルを選択して、Shader選択部分からShader Graph > CurveWorldShaderを選択してください。
このあと設定するモデルにテクスチャなどがある場合はTexture2Dにセットしておいてください。
テスト用にPlaneを曲げる
まずはPlaneを用意して曲げてみましょう。空のシーンにPlaneをおいて、以下のような感じに見えるように調整してみてください。合わせる必要は無いですが、参考までにPlaneとCameraの設定を置いておきます。PlaneにはMaterialを「CurveWorldMaterial」に変更しておいてください。
設定ができたら、CurveShaderMaterialのCurveXやCurveYを変更してみてください。曲がるぜ
この時点でうまく曲がらない場合は、Shader Graphの内容を見直して見てください。Save Asset押してないとかはありがち。
Planeはテクスチャありませんが、テクスチャの存在するモデルのマテリアルの場合は、Texture2Dに同じテクスチャをセットしてください
スクリプトに連携
実際のゲームで利用するにはリアルタイムに変更できないと使えませんね。ということでそれ用のスクリプトを作ってみましょう。今回はインスペクターで変更した値が適応されるようにしますが、これをゲームで実際に変化しながら運用してください。
スクリプトを用意
今回は毎フレームCurveのパラメータを反映し続けるものを作ります。実際にはゲームの挙動に合わせてメンバ変数のcurveX,curveYを変化させる必要があります。
using UnityEngine;
public class CurveControl : MonoBehaviour
{
[Range(-1, 1f)] public float curveX = 0.0f;
[Range(-1, 1f)] public float curveY = 0.0f;
public Material[] materials;
void Update()
{
foreach (var mat in materials)
{
mat.SetFloat(Shader.PropertyToID("_CurveX"), curveX);
mat.SetFloat(Shader.PropertyToID("_CurveY"), curveY);
}
}
}
シーン内で適応してみる
何か空のGameObjectを作成して、上記で作成したスクリプトを貼り付けます。貼り付けた後は、CurveWorldShaderが適応されているマテリアルをインスペクター上でセットしてください(シーン内で利用されるものだけでOK)。今回の例のままだと、CurveWorldMaterial一つですが、
あとは再生しながらCurve系のパラメータを変更すると、実行中に曲がってくれるはずです。
コメント