UnityのJoint機能を使って木にアイテムを吊るし撃ち落とす

UnityのJoint機能を使ってオブジェクトを繋げてみる
Unityのジョイント機能を使ってゲーム中のオブジェクト同士を繋げてみます。

でJointの機能を使ってみました。

今回は実際のゲームで使ってみようと思います。

その記事の中の使い道でも触れていましたが、木につるされたアイテムを撃ち落として、手に入れる機能です。

スポンサーリンク

打ち落とすアイテムの準備

まずは撃ち落とすアイテムを作成していきます。

アイテムを繋げておく元のゲームオブジェクトをCreate Emptyで作り名前をItemRootとしておきます。

ジョイント8

ItemRootにはRigidbodyをAdd Componentで追加し、Is Kinematicにチェックを入れておきます。

次に3D Object→Cubeを作り、名前をKnifeItemに変更します。
今回の例で使うオブジェクトがナイフなのでこの名前にしてますが、自由につけてください。

ジョイント12

KnifeItem(Cubeだったもの)に新しくMaterialを設定します。
Rendering ModeをTransparentに設定し、Albedoの色の部分をクリックし透明度を0に設定します。

KnifeItemの子要素にSpotlightを取りつけます。

ジョイント9

Rangeはナイフを照らす程度の長さにします。今回はあまり光自体を重要視していません。
FlareにFlare Smallを設定します。ライトでアイテムをわかりやすくするのではなくフレアでわかりやすくします。

ジョイント10

階層は上のような感じになります。
上の画像ではナイフが3階層になってますが、KnifeItemの子要素にナイフのオブジェクト、ライトのオブジェクトがあればOKです。

ジョイント11

出来上がりは上のようになります。
透明度は0ですが少し透けて見えている感じになります。

ジョイント13

KnifeItemにはAdd Component→Physics→Rigidbodyを取りつけUse Gravityにチェックを入れます。

さらにAdd Component→Physics→HingeJointを取りつけ、LimitsのBreak ForceとBreak Torqueに適当な値を入れます。
(銃を撃った時に与える力の強さを考慮して設定してください)

Hinge JointのConnected BodyにはItemRootをドラッグ&ドロップしておきます。

これで空中にぶら下がるようになります。
新しいスクリプトJointBreakを取りつけます。これはジョイントが切れた時にItemRootを消す処理です。
スクリプトは後で作成します。

ItemRootを木の枝の辺りに移動し、その下にKnifeItemが来るように設定します。

アイテムを打ち落としたら吊っていたオブジェクトも削除する

それでは銃を撃ってKnifeItemのJointがItemRootから切れた時に実行するスクリプトJointBreakを作成します。

publicでdeleteObjを宣言します。あとでインスペクタ上でItemRootを指定してください。
OnJointBreak関数は自身のオブジェクトが持っているJointの機能がなくなったときに呼ばれるイベント関数です。

自身のJoint機能が銃を撃って壊れた時に設定していたdeleteObjを消しています。

吊るしていたアイテムが落ちた時は吊っていたItemRootはいらなくなるので削除しておきます。

これでJoint機能を使ってアイテムを吊るし、銃を撃ったらアイテムを落とす事が出来るようになります。

キャラクターがアイテムを取得する処理

落とすだけだとあれ(なに?)なので落ちたアイテムに主人公が触れた時にアイテムを取得する処理までやってみましょう。

CharacterControllerで主人公キャラを動かしている場合は主人公キャラ自身のスクリプトにOnControllerColliderHitを記述します。
OnControllerColliderHitはCharacterControllerを持っているキャラクターが他のコライダと接触した時に呼ばれます。

今回はサンプルなので新しいスクリプトTestGetItemというスクリプトを作成し主人公キャラに取りつけます。

KnifeItemのタグにBlockを設定しておきます。名前は各自変更してください。
銃を撃った時の当たり判定レイヤー用にFallObjを設定しておきます。こちらも各自変更してください。

今回のスクリプトではコンソールに「アイテムを手に入れた」と表示し、アイテムのゲームオブジェクトを削除しているだけですが、本来であれば消す前にアイテムの所持フラグなどでナイフのフラグをOnにしてからアイテムを削除する処理を加えればいいと思います。

それでは完成したのでUnityの実行ボタンを押して確認してみましょう。

ジョイント14

フレアでアイテムがあるのがわかりやすくなっています。

ジョイント15

また容量の関係で上のように荒くて短い動画になりますが・・・(^_^;)
アイテムが落ちて主人公が触れるとアイテムが消えます。

これでJoint機能を使って木にアイテムを吊るし撃ち落としてアイテムを手に入れる事が出来るようになりました。