今回はUnityのSplinesについて見ていきたいと思います。
Splinesを使うとスプライン曲線をUnityエディター上で編集でき、スプラインに沿ってゲームオブジェクトの配置が出来たりします。
スプライン曲線は複数の制御点を通る滑らかな曲線の事で、制御点の移動や制御点の接線を操作する事で曲線を変更することが出来ます。
Splinesを使うにはUnity2022.1以降のバージョンである必要があります(この記事ではUnity2022.2.1f1で確認しています)。
Splinesのインストール
まず初めにSplinesをインストールします。
UnityエディターのメニューからWindow→PackageManagerを選択します。
Package Managerウインドウで左上のパッケージの種類をUnity Registryにし、Splinesを選択してInstallボタンを押します。
Splinesのサンプルのインポート
Splinesのサンプルもインポート出来ます。
Package ManagerウインドウのSplines項目を選択した状態でSamplesタブを選択しImportボタンを押すとサンプルをインポートできます。
Assets/Samples/Splinesにサンプルファイルがインポートされます。
Splineを作ってみる
Splinesをインストール出来たので実際に作ってみましょう。
ヒエラルキーで右クリック→Spline項目から形状を選択することでスプラインを作成することが出来ます(その他UnityメニューのGameObject→Spline、空のゲームオブジェクトにSplineコンポーネントの追加でも出来ます)。
Draw Splines Toolを選択すると、シーンビュー上でマウスクリックすることでノットを作成する事が出来、次々マウスクリックすることでスプラインを作成出来ます(自分で形状を作ることが出来る)。
Squareは四角形のスプラインを作成します。
Rounded Squareは四隅が丸みを帯びた四角形のスプラインを作成します。
Circleは円形のスプラインを作成します。
Polygonは六角形のスプラインを作成します。
Helixは螺旋形のスプラインを作成します。
Starは星形のスプラインを作成します。
特定の形状を作りたい場合は該当する形状の項目を選択し、自分で形状を作る場合はDraw Splines Toolを選択するという感じですね。
どちらにせよ、どれを選んでもDraw Splines Toolでシーンビューで編集が出来ます。
ノット
ノットはスプラインを構成する接続点の事です。
セグメント(切片)を使って相互に接続されます。
タンジェント
タンジェントはスプラインの接続点の接線の事です。
ヒエラルキーで右クリックからSpline→Draw Splines Toolを選択しスプラインを作ってみます。
ヒエラルキーのSplineゲームオブジェクトを選択するとシーンビューでスプラインを編集することが出来ます。
赤い四角部分を押すとスプラインの編集モードに移行し、緑の四角部分を押すとDraw Splines Toolが有効になりノットの追加を行ってスプラインの作成と編集が出来ます。
適当にシーンビュー上をクリックし、最終的に最初に作ったノットをマウスクリックして繋いだらEscキーを押すかToolsのDraw Splines Toolを押して終了します。
上の画像のように4つのノットのどれかを選択するとElement Inspectorが表示されます。
表示されていない場合はシーンビューのTools Settingの所に隠れているかもしれません。
隠れていた場合はシーンビュー上にドラッグ&ドロップしてください。
スプラインのインスペクタの表示
ヒエラルキーのSplineを選択するとインスペクタでは以下のような感じで表示されます。
スプラインごとに各ノットが表示されシーンビューでノットを選択するとインスペクタでもそのノットが選択されます。
スプラインのClosedにチェックを入れると、そのスプラインの最初と最後のノットの間にセグメントを作成します(繋がります)。
Element Inspector
Element Inspectorはノットやタンジェントの情報を表示します。
位置や回転
最初のXYZはノットの位置で次のXYZは回転を示していて、それぞれ値を変更する事が出来ます。
ノットの位置や回転はToolsを使って通常のゲームオブジェクトと同じようにも変更出来ます。
接線の設定
その次のLinear、Auto、Bezierでタンジェントの切り替えをすることが出来ます。
Linearはタンジェントは自動生成され直線的になり操作は出来ません、Autoは自動で滑らかな曲線を作成し、操作は出来ません、Bezierはベジエ曲線の接線を作成し操作をすることが出来ます。
Bezierを選択するとその下の項目を変更することが出来ます。
BezierのMirroredはミラーモードで接線の反対方向が同じ大きさになります。
BezierのContinuousは連続モードで接線が独立しており大きさをInとOutで独立して変更することが出来ます。
BezierのBrokenは完全に接線が独立しており、各接線の大きさと方向を直接変更することが出来ます。
ノットの操作
その下のボタンを使うとノットの操作を行う事が出来ます。
Linkはノットを同じ位置に合わせて結びます。各ノットを移動させるとリンクされているので同じ位置に移動するが回転をすると接線が独立するので反対側は回転しません。
UnLinkは結んだノットを解除します。
Splitはノットの接続を分割し二つのスプラインに分けます。
Splitを押した後は二つのスプラインに分けられるので各ノットを移動させたりすると以下のような感じになります。
元々ひとつのスプラインだったものが以下のようにインスペクタで二つのスプラインに分割されているのを確認出来ます。
Joinは二つのノットを接続します。
LinkとJoinはちょっと似てるので混乱しますね・・・・(´Д`)
Reverse Spline Flowを押すとスプラインの流れが反転します。
Spline Instantiateコンポーネント
Spline Instantiateコンポーネントを使用するとスプライン上にゲームオブジェクトをインスタンス化することが出来ます。
なので木やフェンス等をスプラインに沿って配置したいときに便利です。
まずは元となるスプラインを以下のような感じで作成します。
次に出来たSplineゲームオブジェクトのインスペクタのAdd ComponentからSplines→Spline Instantiateコンポーネントを選択して取り付けます(別のゲームオブジェクトに取り付けてもOK)。
Containerはどのスプライン上にゲームオブジェクトをインスタンス化するかで、スプラインを設定します。
Items To Instantiateにはインスタンス化するプレハブ、もしくはヒエラルキー上のゲームオブジェクトを複数設定出来ます。プレハブ等を設定するとその右側にリストの中から何パーセントの確率でインスタンス化されるかを設定することが出来ます。
Instantiated Object Setupを見ていきます。
Up Axisはゲームオブジェクトの上向き、Forward Axisは前方を設定します。
Align Toはインスタンス化したゲームオブジェクトの方向を指定する設定で、Spline Elementはゲームオブジェクトがインスタンス化された位置に近いノットの回転から計算し補間された方向に向けます。
Spline Objectはスプラインの方向に向けます。
World Spaceはワールドスペースの方向に向けます。
Instantiationを見ていきます。
Instantiate Methodはインスタンス化する方法を設定します。
Instance Countはスプライン上にCountで設定した数のゲームオブジェクトをインスタンス化します。
Spline Distanceはスプライン上のDistで設定した距離毎にゲームオブジェクトをインスタンス化します。
Linear Distanceは直線的にDistで設定した距離毎にゲームオブジェクトをインスタンス化します。
Instance CountとSpline DistanceはExactにすると設定した数値を使いますが、Randomを設定するとMinとMaxの間のランダム値を使用します。Linear DistanceはExactはそのままの数値で、Autoは自動で設定されます(スプラインに収まる数を自動で設定)。
Position Offsetは位置のオフセットを設定出来ます。
Rotation Offsetは回転のオフセットを設定出来ます。
Scale Offsetはスケールのオフセットを設定出来ます。
Override spaceにチェックを入れると選択した座標空間にオフセット値を適用出来ます(チェックを入れない場合はAlign Toで指定した座標空間が適用される)。
Spline Objectはスプラインゲームオブジェクト
Spline Elementはインスタンス化された位置に近いノットの回転から計算し補間された方向
World Spaceはワールドスペース
Instantiated Objectはインスタンス化されたゲームオブジェクトのローカルの方向
が座標空間となります。
Generationを見ていきます。
Auto Refresh Generationにチェックを入れるとスプラインやSpline Instantiateコンポーネントの値を変更した時に自動でゲームオブジェクトのインスタンス化を再実行します。
Randomizeボタンを押すとランダムな範囲に設定されたすべての値を再生成して再度インスタンス化を実行します。
Regenerateボタンを押すとスプライン上に再度ゲームオブジェクトをインスタンス化します。
Clearボタンを押すとスプライン上にインスタンス化したゲームオブジェクトを削除します。
設定項目を見てきたので、試しにSpline Instantiateコンポーネントの機能を確認してみましょう。
まずはインスタンス化するゲームオブジェクト、またはプレハブを適当に2、3個用意します(木やフェンス等)。
用意するのが面倒な方はCubeやSphere等のプリミティブな図形を設定しても大丈夫です。
用意したらSpline InstantiateコンポーネントのItems To Instatiateの+を3回押し、各ゲームオブジェクトにインスタンス化したいプレハブもしくはゲームオブジェクトを設定します。
SplineゲームオブジェクトにSpline Instantiateコンポーネントを取り付けた場合はContainerに自身のSplineコンポーネントが自動で設定されると思いますが、設定されていなければ設定してください。
わたくしの場合は自作の人型キャラクターであるkamekumechanを60%と二つの木を各20%にしたアイテムを設定してみました。
以下のようにスプラインにそってアイテムがインスタンス化されたのを確認出来ます。
ゲームビューで見ると以下のようにスプラインの線は表示されません。
Spline Animateコンポーネント
Spline Animateコンポーネントを使用するとゲームオブジェクトの位置と回転をスプラインに沿ってアニメーション化することが出来ます。
決まった道を移動するキャラクターや車等を作りたい時に便利かもしれません。
Splineにはどのスプラインに沿ってアニメーションをするかなので、スプラインを設定します。
Animated Object Setupを見ていきます。
Up Axisはゲームオブジェクトの上方向とする軸を設定します。
Forward Axisはゲームオブジェクトの前方とする軸を設定します。
Align Toはゲームオブジェクトの向きを何に合わせるかの設定です。
Noneはなし、Spline Elementはゲームオブジェクトに最も近いノットの回転から計算された補間された方向に合わせます。Spline Objectはスプラインの向きに合わせます。World Spaceはワールドスペースに合わせます。
Movementを見ていきます。
Play On Awakeにチェックを入れるとゲームオブジェクトがロードされたときにアニメーションが開始されます。
Start Offsetはスプライン上でのアニメーション開始位置を0~1の間で設定出来、0はスプラインの最初、1はスプラインの最後になります。
Methodはアニメーションの方法を設定します。
Timeは秒単位で設定した期間(Durationで設定)でスプライン上をアニメーションし、Speedは毎秒単位で設定した速さ(Speedで設定)でスプライン上をアニメーションします。
Easingはアニメーションの滑らかさを設定出来ます。
Noneは何もしない、Ease In Onlyはアニメーションがゆっくり始まり、その後スピードアップ
Ease Out Onlyはアニメーションが最後遅くなります。
Ease In-Outはアニメーションの最初と最後がゆっくりとなります。
Loop Modeはアニメーションのループの設定です。
Onceは1度だけ
Loop Continuousは連続でループ再生
Ease In Then Continuousはアニメーションをゆっくりと開始し、終了後にループで再生されます。EasingでEase In OnlyまたはEase In-Outが選択されている場合は最初の1回の再生時のみゆっくり再生されその後のループではイージングは適用されません。
Ping Pongはスプライン上を行ったり来たり(ピンポン)するようにループします。
Previewを見ていきます。
Playは再生、Pauseは一時停止、Resetはリセットして最初(Timeを0)に戻します。
Previewボタンを使うとUnityエディターのPlayボタンを押して確認せずとも直ぐに確認することが出来ます。
試しにSpline Animateコンポーネントを使ってみましょう。
まずは適当にスプラインを作成します。
今回は以下のように1周するようなスプラインを作成しました。
次にキャラクターをヒエラルキーに配置し、AnimatorのControllerに常に歩くモーションだけが再生されるAnimatorControllerを取り付けます。
そしてキャラクターのインスペクタのAdd ComponentからSplines→Spline Animateコンポーネントを選択し取り付けます。
Spline AnimateコンポーネントのSplineにヒエラルキーにあるスプラインゲームオブジェクトをドラッグ&ドロップして設定します。
キャラクターの向きを一番近いノットの回転から計算された補間された方向に向ける為Align ToをSpline Elementにします。
ゲームオブジェクトがロードされた時にすぐに歩かせたいのでPlay On Awakeにチェックを入れます。
MethodはSpeedにし、毎秒5m進むようにします。
EasingをEase In Onlyにして最初だけイージングを適用します。
Loop ModeではEase In Then Continuousにし、最初だけイージングを適用し、ループ再生する時はそのままのスピードでアニメーションするようにします。
Spline Extrudeコンポーネント
Spline Extrudeコンポーネントを使用するとスプラインに合わせてメッシュを生成することが出来ます。
ヒエラルキー上で右クリックからDraw Splines Toolを選択し、適当にスプラインを作成します。
わたくしは以下のようにしました。
スプラインのゲームオブジェクトを選択し、インスペクタのAdd ComponentからSplines→Spline Extrudeコンポーネントを選択し取り付けます。
Splineコンポーネントを持つゲームオブジェクトにSpline Extrudeコンポーネントを取り付けるとSplineに自動で自身のスプラインが設定され、スプラインにメッシュが反映されます。
Splineにはスプラインを設定します。
Geometryを見ていきます。
Radiusはメッシュの半径
Profile Edgesはメッシュの半径が持つ辺の数
Segments Per Unitはメッシュの1単位に対する辺のループ数
Cap Endsにチェックを入れるとメッシュの両端を閉じます。
Advancedを見ていきます。
Rangeはメッシュを押し出すスプラインの範囲をメーターで指定出来ます。
Percentageはメッシュを押し出すスプラインの範囲を数字で指定出来ます。
Auto-Regen Geometryにチェックを入れると実行時、またはスプラインの設定値に変更があった時にメッシュを再生成します。
Rebuild FrequencyはAuto-Regen Geometryにチェックを入れると表示され、メッシュが再生成される1秒当たりの最大回数を設定出来ます。
Update Collidersにチェックを入れるとメッシュが生成された時に取り付けてあるコライダ―コンポーネントを自動的に更新します。
スプラインの回りにメッシュの生成ではなくスプラインに沿って平らなメッシュを生成してくれたらスプラインに沿って道路を作るのも簡単に出来そうなんですが、Spline Extrudeでは出来なさそうなので、自分でスプライン上の点から平らなメッシュを生成していくしかないのかも・・・(^_^;)
Unityのサンプルの中にあるので興味のある方は見てみるといいかもしれません。
参考サイト
終わりに
今回はスクリプトを使った操作はしませんでしたが、Splinesのサンプルの中に機能の作り方が載っているのでサンプルを見ながら応用する(応用せずとも)とゲームの舞台の道の生成やスクリプトを使ったサンプルを確認出来ます。
道のメッシュ生成スクリプトが難しいなぁ・・・・。
メッシュ生成に関しては以下の記事を参照してみてください。
わたくし完全に忘れましたよ・・・・(^_^;)