
でJointの機能を使ってみました。
今回は実際のゲームで使ってみようと思います。
その記事の中の使い道でも触れていましたが、木につるされたアイテムを撃ち落として、手に入れる機能です。
打ち落とすアイテムの準備
まずは撃ち落とすアイテムを作成していきます。
アイテムを繋げておく元のゲームオブジェクトをCreate Emptyで作り名前をItemRootとしておきます。
ItemRootにはRigidbodyをAdd Componentで追加し、Is Kinematicにチェックを入れておきます。
次に3D Object→Cubeを作り、名前をKnifeItemに変更します。
今回の例で使うオブジェクトがナイフなのでこの名前にしてますが、自由につけてください。
KnifeItem(Cubeだったもの)に新しくMaterialを設定します。
Rendering ModeをTransparentに設定し、Albedoの色の部分をクリックし透明度を0に設定します。
KnifeItemの子要素にSpotlightを取りつけます。
Rangeはナイフを照らす程度の長さにします。今回はあまり光自体を重要視していません。
FlareにFlare Smallを設定します。ライトでアイテムをわかりやすくするのではなくフレアでわかりやすくします。
階層は上のような感じになります。
上の画像ではナイフが3階層になってますが、KnifeItemの子要素にナイフのオブジェクト、ライトのオブジェクトがあればOKです。
出来上がりは上のようになります。
透明度は0ですが少し透けて見えている感じになります。
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を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | using UnityEngine; using System.Collections; public class JointBreak : MonoBehaviour { [SerializeField] private GameObject deleteObject; public void OnJointBreak() { Destroy(deleteObject); } } |
インスペクタでdeleteObjectにItemRootを設定します。
OnJointBreakメソッドは自身のオブジェクトが持っているJointの機能がなくなったときに呼ばれるイベントメソッドです。
自身のJoint機能が銃を撃って壊れた時に設定していたdeleteObjectを消しています。
吊るしていたアイテムが落ちた時は吊っていたItemRootはいらなくなるので削除しておきます。
これでJoint機能を使ってアイテムを吊るし、銃を撃ったらアイテムを落とす事が出来るようになります。
キャラクターがアイテムを取得する処理
落とすだけだとあれ(なに?)なので、落ちたアイテムに主人公が触れたらアイテムを取得するようにしてみましょう。
CharacterControllerで主人公キャラを動かしている場合は主人公キャラ自身のスクリプトにOnControllerColliderHitメソッドを記述します。
OnControllerColliderHitはCharacterControllerを持っているキャラクターが他のコライダと接触した時に呼ばれます。
今回はサンプルなので新しいスクリプトTestGetItemというスクリプトを作成し主人公キャラに取りつけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | using UnityEngine; using System.Collections; public class TestGetItem : MonoBehaviour { void OnControllerColliderHit(ControllerColliderHit col) { if(col.gameObject.tag == "Block") { Debug.Log("アイテムを手に入れた"); Destroy(col.gameObject); } } } |
KnifeItemのタグにBlockを設定しておきます。名前は各自変更してください。
今回のスクリプトではコンソールに「アイテムを手に入れた」と表示し、アイテムのゲームオブジェクトを削除しているだけですが、本来であれば消す前にアイテムの管理スクリプトでナイフの所持フラグをOnにしてからアイテムを削除する処理を加えればいいと思います。
それでは完成したのでUnityの実行ボタンを押して確認してみましょう。
フレアでアイテムがあるのがわかりやすくなっています。
また容量の関係で上のように荒くて短い動画になりますが・・・(^_^;)
アイテムが落ちて主人公が触れるとアイテムが消えます。
これでJoint機能を使って木にアイテムを吊るし撃ち落としてアイテムを手に入れる事が出来るようになりました。