【第19回】斜方投射でボールの予想経路を示す・スクリプト準備編

【第19回】斜方投射でボールの予想経路を示す・スクリプト準備編

前回のチュートリアルでは、経路を表示するためのオブジェクトをPrefab化する方法をお送りしました。

今回はいよいよスクリプトから、ガイドとなるオブジェクトをインスタンス化する方法に着手します

いきなりいっぱいインスタンス化するのではなく、実験的に1つのオブジェクトをインスタンス化することから始めましょ。

前回のチュートリアルはこちらから。

 

今回の目的

斜方投射で予想される経路を3Dの球を並べて表示します。

今回はその下準備として、経路を示すための3Dオブジェクトをインスタンス化するスクリプトを作成します。

Materialの作成、Prefabの作成、スクリプトの作成と盛りだくさんなので、何回かに分けてやっていきます。

プロジェクトの準備

前回のチュートリアルで作成したプロジェクトをそのまま使います。

このページに先にたどり着いた方は、チュートリアルの初回から追っていただけるといいかもしれません。

Prefabのインスタンス化

Prefabを手動でインスタンス化する方法は前回のチュートリアルでお送りしましたが、今回はスクリプトからインスタンス化してみます。

まずは実験的に1つのオブジェクトをインスタンス化するスクリプトを作ります。

その準備として、インスタンス化したPrefabの親オブジェクトを作成しましょう。『Hierarchy』ウィンドウの最上位の階層でインスタンス化しちゃうと、こんな悲劇が起こります。

Prefabのインスタンス化
悲劇の例

 

この悲劇を繰り返さないためにも、空オブジェクトを作成して整理するようにしましょ。右クリックまたは二本指タップでコンテキストメニューを開き、[Create Empty]を選択します。

CreateEmpty
空のオブジェクトを作る

 

例のごとくTransformを[Reset]し、名前を[GuideParent]にします。『Hierarchy』ウィンドウで『FallChecker』オブジェクトの下に配置しましょうか。子オブジェクトにしないように注意。

TransformのReset
FallCheckerの下あたりに移動

 

この『GuideParent』オブジェクトの子オブジェクトとして、Prefabを作成していきます。

親オブジェクトが作成されたので、次はスクリプトファイルの作成を行いましょ。『Project』ウィンドウで『Scripts』フォルダを開き、右クリックまたは二本指タップでコンテキストメニューを開きます。[Create] -> [C# Script]を選択してスクリプトファイルを作成します。

スクリプトの作成
スクリプトを作成するのだポッター

 

名前は[GuideManager]にします。ガイドの表示、配置する位置の決定などはこのスクリプトにお任せします。

GuideManager
君の名前はGuideManager

 

このGuideManagerに実装したい機能はこんな感じ。

  • 『Sphere』オブジェクトの位置を基準にガイドを表示する
  • Prefabをインスタンス化する

まずはこの2つから。後々、『Sphere』オブジェクトに加わる力や角度からガイドを配置していきます。

上記の機能を実装したスクリプトが以下のもの。

上から順に解説を行なっていきます。

まず、メンバ変数には[SerializeField]としてplayerを用意。ここに『Sphere』オブジェクトへの参照をセットします。

実際にガイドとして使う場合には、『Sphere』オブジェクトの位置を元に各ガイドの位置を決めていきます。ここでは相対的な位置を仮置きしてrelativePosとしています。

今回はひとまずPrefabをインスタンス化することが目的なので、Start()から1回だけインスタンス化用メソッドのInstantiateGuidePrefabs()を呼んでいます。

このメソッド内では、インスタンス化するPrefabの位置を決め、GameObjectとして『Resources/Prefabs』フォルダから『Guide』Prefabを読み込んでいます。『Resources』フォルダより下に置いたファイルはResources.Loadを使って読み込むことができるんです。そのために前回フォルダを作ったんですねー(伏線回収)

これらの情報を元に、Instantiate()を使ってシーンの中にPrefabを配置しています。

Prefabをインスタンス化するためには、どのオブジェクトを、どこに、どの向きで作る、という情報が必要なんです。なので、『Guide』オブジェクトを、guidePosの位置に、親の軸に合わせて作る、と指定しています。

なお、Quaternion.identityなんて聞きなれない引数がありますが、これはオブジェクトの回転を表していて、「親の軸に合わせる」という指定です。なんのこっちゃ。

Quaternionの話は突っ込むと地獄を見るので、今は「回転を表している何か」くらいの認識で。

インスタンス化した後は、親オブジェクトとして今回作った『GuideParent』を指定し、名前も設定しています。

 

動作確認

スクリプトを保存したら、Unityに戻って『GuideParent』オブジェクトにGuideManagerをアタッチします。『GuideParent』オブジェクトを選択し、[Add Component] -> [Scripts] -> [GuideManager]と選択してアタッチするか、『Project』ウィンドウからドラッグ&ドロップでアタッチします。

Playerフィールドに『Sphere』オブジェクトをセットするのもお忘れなく。『Hierarchy』ウィンドウからドラッグ&ドロップするか、右の丸ボタンから『Sphere』オブジェクトを選択します。

スクリプトのアタッチ
GuideManagerをアタッチ

 

んじゃ実行しましょ。前回作成したPrefabオブジェクトがインスタンス化され、『Sphere』オブジェクトの右上あたりに配置されました。

Prefabのインスタンス化
おわかりいただけただろうか

 

また、『Hierarchy』ウィンドウを見ると、『GuideParent』オブジェクトの子オブジェクトとして『GuideFromScript』オブジェクトが作成されています。

生成されたGuideオブジェクト
指定した情報がセットされている

 

ではこのまま予想経路の計算を盛り込んで……とすると胸焼けしそうなレベルで長くなるので、今回はここまでです。

次回は予想経路の計算と、リストを使ったオブジェクトキャッシュあたりを扱ってみましょ。

まとめ

今回は作成したPrefabファイルをスクリプトから読み込み、インスタンス化するチュートリアルでした。

Prefabをスクリプトからインスタンス化するのはかなり使うテクニック。あれ? 最近紹介しているのはそんなのばっかりのような……。

次回は予想経路をどうやって計算するか考え、今回のPrefabのインスタンス化を使ってガイドを表示してみます。

アセット作ってます!

CTA-IMAGE

Unityでの開発に役立つアセットを作っています。

3DダンジョンRPGを開発するスピードを200%加速するAssetや、ファンタジーRPGのダンジョンを彩るパーツを取り揃えています。

特に3DダンジョンRPGのゲームを1から作るのは結構時間がかかります。ダンジョン部分の作成はこうしたアセットを使って、開発をブーストさせてみませんか?