この記事は「Unity アセット真夏のアドベントカレンダー 2019 Summer!」の8月11日の記事です。
前回、8月10日の記事は、Nakaji Kohkiさんの 【Unity】uGUIでバーチャルパッドが使える『Joystick Pack』を、もっと便利に拡張してみる でした。
アセット概要
ポイント同士を結んでパスを作ることができます。パスに沿って移動することもできるし、オブジェクトを配置したり、メッシュを生成することもできます。
パスの軌道は色々調整できます。
下の動画は公式のプロモーションです。大体何ができるか把握できるのではないかと。
基本の使い方~パスの作成~
アセットをインポートするとCurvyメニューが追加されます。

最初にパスを作ってみます。
メニューのGameObjectからCurvy➡Splineをクリック。
「CurvySpline」コンポーネントを持ったオブジェクトと、CurvyGlobalというオブジェクトが自動で生成されます。
そして、Hierarchy内のSplineオブジェクトを選択すると、シーンビュー内に以下画像のようなメニューが表示されているはずです。
DrawSplineをクリック。

Ctrl(MacならOption?)キーを押しながらクリックしていくと「CurvySplineSegment」コンポーネントを持ったオブジェクトを生成していきます。
このオブジェクトの座標同士を結んで曲線を生成していきます。
普通のオブジェクトを操作するように移動できます。オブジェクトを消せば自動でパスを補完してくれます。
パスのつながり方は、「CurvySpline」コンポーネントのInterpolationプロパティから色々変更できます。直線、曲線、ベゼル曲線。実際に触りながらやってみた方が分かりやすいかと。
基本の使い方~パスに沿って移動~
SplineControllerを使う
簡単な方法は用意されているコンポーネントを使うことです。
Hierarchyで右クリックしてCurvy➡Controller➡Spline。
「SplineController」コンポーネントのGeneralタブ➡Splineプロパティに、「CurvySpline」を持ったオブジェクトを設定します。
MoveタブのSpeedプロパティを変更すれば、パスにそって移動します(実行時のみ)。
スクリプトから動かす
スクリプトから自分で動かしたいときに使いそうなメソッド。
Vector3 p; //引数のVector3の値から、パス上の一番近い位置を0~1のfloat値で返す //パス全体の半分の位置に近いところにいたら0.5が返ってくる //out pにはパス上のワールド座標が入ります //一番使う値だと思います float mTF = spline.GetNearestPointTF(transform.position, out p); //次のパスへ向かう前向きの方向を返す //これをAddForceとかで使えば、パスにそって移動させることができます Vector3 forwardDirection = spline.GetTangentFast(mTF); myRigid.AddForce(forwardDirection * moveSpeed, ForceMode.Acceleration); //パス上のmTF値のワールド座標を返す //開始位置が0、終点が1になります //GetNearestPointTFのout pと似たような値だと思います Vector3 currentPositionOnPath = spline.InterpolateFast(mTF); //mTFの位置の上向きを取得します //パスは向きも設定できるので旋回しながら動くオブジェクトも作れます Vector3 UpDirection = spline.GetOrientationUpFast(mTF);
デモの11:RigidBodyシーンとRigidBodySplineController.csファイルが参考になると思います。
こんな感じで曲線にそって色々できたり、パスを簡単に作れるアセットなわけです。
でもこれだけじゃありません。
パスに沿ってメッシュ生成
パスにそってメッシュを生成することができます。
メッシュの形状もパスの形にすることができます。
Hierarchy内で右クリック➡Curvy➡Generatorでオブジェクトを作って、CurvyGeneratorインスペクタのノードっぽい絵が描かれているボタンをクリックするとGeneratorウィンドウが開きます。
ウィンドウ内で右クリック➡AddTemplate➡ShapeExtructionでメッシュ生成の処理をまとめてしてくれます。ノード(小さい枠)がいくつか作られるはずです。
ShapeExtructionノード内の「InputSplinePath」タブからSplineプロパティの「+」ボタンをクリックすると、パスが生成されます。生成されたパスを動かすと、その通りにメッシュが動きます。
マテリアルのUV値を設定するのがちょっと手間でした。
マテリアルを変更するときはVolumeMeshノードのMat0タブからMaterialプロパティを変更します。
ShapeのパスポイントごとにUVを調整したりできます。
ShapeExtrusionノードのCrossタブから、HardEdgesとExtendedUVプロパティにチェックを入れます。
InputSplineShapeノードに設定してあるパスのゲームオブジェクトを選択してインスペクタの「MetaCGOptions」コンポーネント内のExtendedUVカテゴリのUVedgeにチェックをいれて、FirstUとSecondUの値を調整します。
パスに沿ってオブジェクト生成
パスにそってオブジェクトを指定距離ごとに生成することができます。
Hierarchy内で右クリック➡Curvy➡CurvyGeneratorをクリック。
インスペクタのノードっぽいボタンをクリックしてGeneratorウィンドウを開く。
VolumeSpotsノード内のGeneralタブ➡Simulateプロパティにチェックを入れておくべきです。最高で10000個配置することができますが、大量にオブジェクトを生成しようとして低スペックのPCだと時が止まることがあります。
Generatorウィンドウ内で右クリック➡AddTemplateからSpotGameObjectsを選択。
ウィンドウ内で右クリック➡Add➡Input➡SplinePathでInputSplinePathノードを追加。
同じくAdd➡Build➡RasterizePathノードを追加。
InputSplinePathノード内でSplineプロパティの「+」ボタンをクリックしてパスを設定。
InputSplinePathーRasterizePath-VolumeSpotsみたいにノード同士を線でつなぎます。
あとはInputGameobujectsノードのSerializedPropertyに生成したいゲームオブジェクトのプレハブを設定すればパスにそってオブジェクトが生成されるはずです。
簡単な使い方をざっくり書いてみました!
他にもUIのテキストをパスにそって動かしたりもできます。
とても応用の利くアセットだと思いました。
今のところアップデートもばっちりされてるみたいですし。
レベルデザインにも便利。
パスにそって動くということに焦点を当ててゲームも作れそうな気がしてきます。予感はします。実際作ろうとしたら色々問題でてくると思いますが。
アセットのデモを見てみると他にも色々出来るみたいです。
是非購入して確認してみてはいかがでしょうか。
明日、8月12日の記事は、 ゆーじさんの 無料3Dモデルを爆活用してみたです。
コメント