【Unity2022】スプラインに沿ってオブジェクトを配置する

柵や木などを曲線に沿って配置する簡単な方法はないの?

Unity公式のスプラインツールを使えばこの辺が簡単に出来るわ。

Unity 2022.1以降で使用可能なSplinesパッケージの機能を用い、スプラインに沿ってオブジェクトを配置する方法の紹介です。

結論を述べると、Spline Instantiateコンポーネントを使えば以下のようなパスに沿った配置が簡単に実現できます。

参考:Class SplineInstantiate | Splines | 1.0.1

オブジェクトをどのような位置や向きで配置するかの指定も可能で、例えば次のような配置ができます。

配置例
  • 柵のようにスプラインの向きに揃えて配置する
  • 木々のように位置や向きにバラつきを持たせて配置する
  • スプラインの周囲に位置をずらして配置する

道の周りにオブジェクトを配置させるような用途などに適していると言えるでしょう。

本記事では、Unity公式スプラインであるSplinesパッケージのSpline Instantiateを用い、パスに沿ってオブジェクトを配置する方法について解説していきます。

動作環境
  • Unity 2022.1.11f1
  • Splines 1.0.1

スポンサーリンク

前提条件

Unity 2022.1以降Unityプロジェクトが作成され、Splinesパッケージがインストールされているものとします。

本記事では、以下のような作成済みのスプラインに沿ってオブジェクトを配置していくものとします。

ここまでの手順が分からない方は、以下記事をご覧ください。

【Unity2022】スプラインツールの導入方法と使い方
Unity 2022.1 TECH ストリームがリリースされてから、Unity公式のスプラインツールが使えるようになりました。 Unity 2022.1以降では、次のようなことがサードパーティー製アセットなしで実現できま ...

設定手順

まず、適当なゲームオブジェクトにSpline Instantiateコンポーネントを追加します。

例ではスプラインオブジェクトにアタッチするものとします。

追加したSpline InstantiateコンポーネントのContainer項目に、スプライン(Splineコンポーネント)をアタッチします。

Items To Instantiate項目一覧配置したいPrefabを指定します。

例では、黄色と緑色のキューブを指定することにします。

指定する内容はPrefab出現確率の重みです。

参考:Struct SplineInstantiate.InstantiableItem | Splines | 1.0.1

例では均等な確率(1:1)で黄色と緑色のキューブを選択するようにしました。

最終的に以下のようにContainerとItems To Instantiate項目が設定されていれば機能するようになります。

回転の基準設定

Instantiated Object Setup以下の設定項目では、オブジェクトの上方向や前方向の軸どの向きに沿って回転させるかなどを設定することができます。

設定内容は以下の通りです。

Up Axis上方向の基準軸。初期設定ではy軸正方向。
Forward Axis前方向の基準軸。初期設定ではz軸正方向。
Align To揃える向きの基準となる座標系。初期設定ではスプラインに沿った向きを基準とする。

参考:Class SplineInstantiate | Splines | 1.0.1

参考:Enum SplineInstantiate.Space | Splines | 1.0.1

例えば、Up AxisObject X+Forward AxisObject Y+にすると、x軸正方向が上向きy軸正方向が前向きになるような回転になります。

また、Align ToWorld Spaceにすると、ワールド空間基準の向きになります。

配置間隔の設定

オブジェクトの配置間隔は、Instantiation以下の項目から設定できます。

設定内容は以下の通りです。

Instantiate Method配置方法。Instance Countなら指定個数で配置、Spline Distanceならスプラインに沿った距離Liner Distanceならオブジェクト間の距離指定での配置となる。
Count / SpacingInstantiate MethodInstance Countなら配置するオブジェクトの個数それ以外なら配置間隔を指定する。

また、2つ目の設定項目は、Instantiate MethodがInstance CountSpline Distanceの場合、固定値(Exact)指定範囲のランダム値(Random)から選択できます。

Randomが指定された場合は、値の下限(Min)上限(Max)を指定できます。

Instantiate MethodがLiner Distanceの場合は、SpacingにExactのほか自動的に間隔を決定するAutoを指定できます。

参考:Enum SplineInstantiate.Method | Splines | 1.0.1

例えば、Instantiate MethodをSpline Spaceにして、Spacingを1~2の範囲のランダムな間隔にすると、以下のような配置になります。

配置位置・回転・スケール補正の設定

スプラインに沿って配置するオブジェクトの位置、回転、スケールに対して補正値を加えることができます。

また、補正値はある範囲でランダムに変化させることができます。これにより、バラつきを持たせた配置が可能になります。

位置、回転、スケールの補正値は、それぞれPosition OffsetRotation OffsetScale Offset項目から設定できます。

初期設定では無効化されているため、補正が必要な項目にチェックを入れて有効化します。

各項目では、以下のような設定を行います。

Override space補正値を加える基準となる座標系。デフォルトではスプラインに沿った座標系となっている。
Xx軸成分の補正値。
Yy軸成分の補正値。
Zz軸成分の補正値。

xyz各成分に設定する補正値は、固定値のExactのほか、指定範囲のランダム値のRandomを設定できます。

参考:Class SplineInstantiate | Splines | 1.0.1

例えば、位置、回転、スケールそれぞれでランダム値にすると、次のようにばらけた配置にできます。

位置のx成分だけ固定の補正値を加えた場合、次のように左右に位置をずらすことができます。

ただし、急カーブなどでは破綻してしまう可能性があるので、上手く位置調整する必要があるかもしれません。

オブジェクトの再配置

オブジェクトの配置は何度でもやり直すことができます。

これらの操作は、Generation以下のボタンから行います。

ボタンの内容は以下の通りです。

Randomize乱数に使うシード値を更新する。
Regenerate乱数のシード値を変えずにオブジェクトを再配置する。
Clear配置済みのオブジェクトを一旦すべて削除する。

参考:Class SplineInstantiate | Splines | 1.0.1

実際にボタン操作すると以下のような挙動になります。

さいごに

Spline Instantiateコンポーネントを用いれば、スプラインに沿ってオブジェクトを配置するような実装が簡単に実現できます。

配置にはランダム性を持たせることが可能なため、木や草などを道に沿って配置するといった用途にも対応できます。

ただし、道路や線路のようなメッシュの変形機能は有していないため、あくまでもパスに沿ってオブジェクトを配置したい用途で使用すると良いでしょう。

参考サイト

スポンサーリンク