クーラー風邪
エアコンで室内を冷やしすぎて風邪をひいた免疫力弱目な皆さんこんにちは。梅雨なのに真夏ような暑さが訪れて、辛抱たまらずエアコンのスイッチをONにしたのですが、その所為か朝起きたら喉と鼻を痛めてました、あと体もだるいし。日本の季節って本当に夏と冬だけになったのかもしれない。
ロープを作ろう
Untiyで3Dの曲線を作ろうと思うと、Unity標準SplneのSpline Extrudeを用いて線を描画するか、Spline沿ってLineRendererで描画するか、の手法が考えられるかと思いますが、どちらも描画後に曲線を変形させようとすると実装に骨が折れます。
例えば電柱をつなぐ電線やブランコの鎖など、風やその他の影響で自然に変形するような3D曲線を作ろうと思えばアセットの力を借りるのが手っ取り早い、とうわけで今回は手軽にロープが作れるRope Toolkitのご紹介
Unityでロープを作るアセットと言えばObiRopeが有名なんですが、Rope ToolkitはBurstコンパイラを使用しており、より高速な処理が望める為、スマホ等のモバイルデバイスでの使用も可能との事。丁度アセットストアで2$セールの対象となっていたので興味本位に購入してみました。
準備
前述のようにRope toolkitではBurstコンパイラを使用しているため、このアセットの導入前にPackageManagerからBurstをプロジェクト内にインストールしておく必要があります。
Rope Toolkitで生成されるロープはUnityエディタのゲーム実行時に生成される為、シーン内にはロープのオブジェクト(Prefab)を配置するのではなく、空のオブジェクトにRope生成用のコンポーネントをアタッチして、そこにロープを生成させるための設定を行うことでロープが作られます。
上の動画はアセットに含まれているデモシーンを実行した映像ですが、実行前は下の図ような感じでシーン内にはロープのオブジェクトは存在していません。
ロープの生成
Rope Toolkitでロープを定義するには最初にシーン内に空オブジェクトを生成し、そこに「Rope」コンポーネントをアタッチします。
シーン内にSpawnPointsのダイアログが表示されるので二回押下、これがロープの始点と終点になりますが、後でそれらの位置は変更できるので最初は適当な場所で構いません。
始点と終点の位置を変更するにはシーン内のナビゲーションコントロールからハンドアイコンを押下します。
Ropeコンポーネントにはほかにもロープの半径(Radius)やMaterialを設定する欄があるのでそちらも設定します。
ロープの動作定義
つぎにロープの始点と終点の動作を定義します。Ropeコンポーネントをアタッチしたゲームオブジェクトに始点と終点分のRopeConnectionコンポーネントを追加します。
これはつり橋のようにロープの両端が固定されている場合、振り子のようにロープの片側が固定されてもう片側は接続されたオブジェクトの動きに影響を受けるような場合等々、作成したいロープの動作をRopeConnectionコンポーネントで設定します。
設定できるタイプは以下の通り
- Pin Rope to Transform:トランスフォームは自由に動き、ロープが追従する
- Pin Transform to Rope:ロープは自由に動き、トランスフォームが追従する
- Pull Rigidbody to Rope:ロープでリジッドボディを引っ張る
- Two Way Coupling Between Rigidbody And Rope:ロープはリジッドボディに反応し、リジッドボディにフィードバックインパルスを返す
今回は両端が固定されたロープを定義するので、始点と終点のどちらにも「Pin Rope To Transform」を設定します。
そして、ロープを固定する始点と終点のGameObjectをシーン内に作成し、Tranform SettingsのTransformにそれぞれを設定します。
この時、始点側のRopeConnectionにはRope Locationには0を、終点側のRope Locationには1を設定します。
球が始点を固定するGameObject、Cubeが終点を固定
この状態でゲームを実行すると先ほど指定した始点、終点のゲームオブジェクトにつながったロープが生成されます。
ロープのカスタマイズ
例えばロープの中間点にロープをピン止めする定義を増やしたい場合、。RopeコンポーネントをアタッチしたゲームオブジェクトにRopeConnectionコンポーネントを追加します。
そして先ほどと同様に固定するためのGameObjectを作成してTranform SettingsのTransformに設定しますが、この時、タイプには「Pin Rope To Transform」を設定して、Rope Locationには0.5を指定します。
これを実行すると
中間点をピン止めしたロープが作られます。
これとは逆にロープの中間点に何か重い物がつけられているような動作としたい場合は、中間点のGamesObjectにRigidboyを追加し、RopeConnectionのタイプには「Two Way Coupling Between Rigidbody And Rope」を指定、Rigidboy Settingsのbodyに中間点のGamesObjectを指定します。
これを実行すると
中間点が垂れ下がるような動作となります。
最後に
Rigidboy Settingsには「Stiffness(剛性)」や「Damping(減衰)」の項目があり、Rigdibodyに影響されるロープの挙動を調整できますが、思ったような挙動をさせるにはRopeConnectionだけでなく、Ropeコンポーネント側の「Stiffness(剛性)」や「Energy Loss」「Collisions」の項目をアレコレと調整して挙動を確認する必要があります。
例えば上のようにロープの終点側を固定せず振り子のような挙動をさせたい場合、終点側のRopeConnectionの設定を変えるだけでなくRope側の設定も色々変更して調整する必要がありました。
調整後のRopeパラメータ
幸いサンプルシーンには「つり橋」「ブランコ」「振り子」等のロープを使ったギミックの例を参照できるので、それらを確認しながらSettingを行ってい下さい。
一応英語ですがDocumentも付属しています。