Unityでスクリプトからコンポーネントを取り付ける

Unityではゲームオブジェクトを選択するとインスペクタの項目に取り付けてあるコンポーネントが表示されます。

通常であればUnityエディター上であらかじめコンポーネントを取り付けておき、設定値を変更したりして使用します。

ですがゲーム実行中にRigidbodyやスクリプト等のコンポーネントをスクリプトから取り付けたい事もあると思います。

そこで、今回はスクリプトからゲームオブジェクトにコンポーネントを取り付けてみようと思います。

スポンサーリンク

スクリプトからコンポーネントを取り付ける方法

スクリプトからゲームオブジェクトにコンポーネントを取り付ける方法は簡単です。

と記述するだけです。

取り付けるゲームオブジェクトにAddComponentで取り付けるコンポーネントの型を指定するだけです。

↑の例ではジェネリクス版を使用しましたが他のやり方もあります。

as コンポーネントの型

という部分は取り付けたコンポーネントの型をキャスト(強制で型変更)する為の記述です。

取り付けたコンポーネントを別の変数等に入れる時にしっかり型指定をして変数に代入したい時に指定します。

1番目は先ほど紹介したジェネリクス版で<>の中にコンポーネントの型を入れます。

2番目は()の中に文字列のコンポーネントを指定します。

3番目は()の中にtypeofで型を指定しています。

これらの事を考慮し、例えばCharacterControllerコンポーネントをスクリプトから取り付けたい場合は

とすればいい事になります。

コンポーネントと言うとあらかじめ用意されている何らかの機能という大げさな感じがしますが、自身で作成したスクリプトもコンポーネントなので、自前のスクリプトをゲームオブジェクトに取り付ける場合もAddComponentを使用する事が出来ます。

スクリプトからコンポーネントを取り付けてみる

スクリプトからコンポーネントを取り付ける方法がわかったので、実際に取り付けてみましょう。

サンプルの舞台を整える

まずは地面とキー操作で動かせるキャラクターをシーン上に設置します。

地面はヒエラルキー上で右クリック→3D Object→Planeを選択し作成します。

キャラクターはStandardAssets→Characters→ThirdPersonCharacter→Prefabs→ThirdPersonControllerをヒエラルキー上にドラッグ&ドロップします。

もちろん自前のキャラクターでもかまいません。

その他にヒエラルキー上で右クリック→3D Object→Cubeを選択し地面の上にいくつか設置しておきます。

それぞれのCubeにはTagにBlockという名前のタグを作成し設定しておきます。

地面、キャラクター、Cubeを設置した画像

↑が地面、キャラクター、Cubeをいくつか設置した画面です。

キャラクターが接触出来る範囲であればCubeは空中に浮いていても構いません。

Cubeはサイズ変更ぐらいしかしない

↑が設置したCubeの一つのインスペクタです。

設置して位置やサイズを変更しただけで特別コンポーネントを取り付けたりはしていません。

キャラクターがCubeに接触した時にコンポーネントを取り付けるスクリプト

サンプルの舞台が出来上がったので次にキャラクターがCubeと接触した時にCubeにコンポーネントを取り付けるスクリプトを作成していきましょう。

今回はキャラクターがCubeと接触した時にCubeにRigidbodyを取り付け、キャラクターが接触した方向に力を加えてCubeを動かしてみます。

powerは接触したCubeに加える力の度合いでインスペクタで設定出来るようにしておきます。

CubeはデフォルトではIsTriggerのチェックが入っていないので物理的にぶつかるようになっています。

Cube側ではキャラクターを検知出来ないので(キャラクターをRigidbodyで動かしている場合は別)、キャラクター側でCubeを検知するようにします。

キャラクター側で他のゲームオブジェクトの接触を確認するにはOnControllerColliderHitメソッドを使用します。

引数でControllerColliderHit型の値を受け取り、そのゲームオブジェクトのタグにBlockが設定されていたらそのゲームオブジェクトのRigidbodyを取得します。

Rigidbodyがnullだったら最初の接触なので、AddComponentを使ってCubeに自前のスクリプトAddComponentTextとRigidbodyコンポーネントを取り付けます。

Cubeに力を加える時にCubeが回転しないようにする為Constraintsの値を設定しています。

Constraintsの値の設定については

Unityで弾が当たったゲームオブジェクトの周りにも力を加える
Unityで物理的な弾が当たったゲームオブジェクトの周りにも力を加える機能を作成します。例えば手榴弾を投げて爆発した影響を爆発した周辺のゲームオブジェクトにも力を加えて飛ばすようにします。

ビット演算に関しては

Unityのナビゲーション機能で移動エリアの可・不可を設定する
Unityのナビゲーション機能でキャラクターが移動出来るエリアと移動出来ないエリアを作成します。また移動出来るエリアに移動コストを設定し移動コストが大きいエリアを回避して移動できるようにします

を参照してください。

~RigidbodyConstraints.FreezePosition

はX、Y、ZをFreeze(動かないようにする)にする設定を~で反転させ、X、Y、Z軸全てで動くようにしています。

スクリプト中でCubeに取り付けているAddComponentTextスクリプトは自前のスクリプトで

↑の用にデフォルトで作成されるスクリプトそのままを使用しています。

今回はスクリプトも他のコンポーネントと同じように取り付けられるというのを確認する為だけなので特別な処理は行っていません。

これでスクリプトは完成です。

スクリプトからコンポーネントが設定されるか確認する

CollisionCubeをキャラクターに取り付けてください。

Unityを実行したら設置したCubeに接触するようにキャラクターを動かし、Cubeにコンポーネントが取り付けられ力を加えられるか確認してください。

↑のようになりました。

キャラクターがCubeに接触すると、そのCubeにはRigidbodyが取り付けられ主人公が向いている方向に力を加えられて移動している事が確認出来ました。

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. 初心者2号 より:

    FixedUpdateで実行するにはどこを変えたらいいんでしょうか?

    • 勘違いしてました・・・(^_^;)

      記事内で『Update内で力を加えていますが』と言っていましたが、力を加えていたのはOnControllerColliderHit内なので全然関係ありません。

      Update内で定期的にAddForceを使って力を加える処理をしている場合はFixedUpdate内で力を加えた方がいいということですが、

      今回の記事ではそのような処理をしていないので問題はなかったです。

  2. 初心者2号 より:

    そうでしたか!返信ありがとうございました!

  3. 河合直人 より:

    ゲームの作り方Unityで覚える遊びのアルゴリズムのサンプルゲームの制作の再現ができなくて困ってます。
    本にはどんな手順で作ればいいのか、が示されていません。
    それで、だなたか再現に成功された方がいないか探しています。
    もし、再現に成功されていたら、再現手順をアップしてください。
    お願いします。

    • 改訂版前の本を持っていますが、サンプルプロジェクト等はWEB上からダウンロード出来たと思いますのでそちらをダウンロードして確認出来るのではないでしょうか?

      Unityのバージョンによっては多少修正が必要になるとは思いますけど。