Unityに関連する記事です

 以下の内容で順番に実装を進めていきます。

手順7 −スクリプト同士の繋がりを実装−
11.PlayerController スクリプトを作成し、マウスの左クリック(タップ)をしたらバレットを上方向に発射させる制御を追加する
12.Bullet スクリプトを修正して、外部のスクリプト(PlayerController スクリプト)から ShotBullet メソッドへの命令を受けられるようにする
13.PlayerController スクリプトを修正して、生成したバレットの情報を取得して ShotBullet メソッドを実行するように命令する



 新しい学習内容は、以下の通りです。

 ・Instantiate メソッド  欅数の種類と内容−
 ・Instantiate メソッド◆ 写瓩蠱佑粒萢僉
 ・ピリオドによる処理の読み解き方



11.PlayerController スクリプトを作成し、マウスの左クリック(タップ)をしたらバレットを上方向に発射させる制御を追加する

1.設計


 最初にマウスの左クリック(タップ)をしたら、バレットのゲームオブジェクトのクローンをプレファブ(設計図)から生成するようにします。
生成が出来たら、次は、バレットのゲームオブジェクトにアタッチされている Bullet スクリプトの情報を取得して、移動させる命令を出します

 先ほどと同じように、まずは日本語で処理をスクリプト内にコメントとして記述してください。
それを参考にしながらプログラムを作成してみましょう。

 Bullet スクリプトの処理の流れが参考になるはずです。

Update メソッド {
    // マウスの左クリックが押されたら

  // バレットを生成

}

 バレットの生成には、Update メソッド内に処理を直接書くのではなく、生成処理を行うメソッドを作成しておいて、それを呼び出すようにしましょう。


2.PlayerController スクリプトを作成する


 Project 内の Scripts フォルダの中で右クリックをしてメニューを開き、Create => C# Script を選択してください。
新しいスクリプトファイルが作成されますので、名前を PlayerController に変更し、ダブルクリックをして Visual Studio エディターを開いて編集します。

 まずは最初に、実装したい処理を日本語でコメントを書いてみましょう。
それから順番に処理を考えていってください。


PlayerController.cs

 <= クリックすると開きます。


 スクリプトを記述したらセーブしてください。


3.<Instantiate メソッド   欅数の種類と内容−>


 Instantiate(インスタンシエイト)メソッドは、オブジェクトを元にクローンのゲームオブジェクトを生成するための命令です。
この命令を実行することによって、プレファブからバルーンのクローンをゲームオブジェクトとして生成しています。

Unity公式スクリプトリファレンス
Object.Instantiate
https://docs.unity3d.com/ja/2018.4/ScriptReference...


  Instantiate(bulletPrefab, transform);

 今回の処理が実行されると、第1引数で指定している GameObject 型の bulletPrefab 変数の情報がクローンとして生成されます。
この変数には Bullet ゲームオブジェクトのプレファブが登録されていますので、この処理によって、Bullet ゲームオブジェクトのプレファブのクローンが生成されることになります。

 第2引数には様々な指定の方法がありますが、今回は Transform 型の情報を指定しています。
この場合、生成された Bullet ゲームオブジェクトのクローンは、この PlayerController スクリプトがアタッチされているゲームオブジェクトの
Transform(あるいは RectTransfom) の Position と Rotaion の情報を指定されて生成されます。また、この Transform コンポーネントの情報には親子関係も含まれているため、
結果として、PlayerController スクリプトがアタッチされている PlayerSet ゲームオブジェクトの位置と回転情報を参照した上で、PlayerSet ゲームオブジェクトの子オブジェクトとして生成されます


参考サイト
@Tecah様
オブジェクト生成の仕方 Instantiate
https://qiita.com/Teach/items/c28b4fe5ca8dc4c83e26
Samurai Blog様
【Unity入門】Instantiateを使いこなそう!使い方・使用例まとめ!
https://www.sejuku.net/blog/48180


4.PlayerSet ゲームオブジェクトに PlayerController スクリプトをアタッチして設定を行う


 作成した PlayerController スクリプトを、ヒエラルキーにある PlayerSet ゲームオブジェクトにドラッグアンドドロップしてアタッチしてください。
アタッチしたら必ずゲームオブジェクトのインスペクターを確認し、正常にアタッチされているかを確認してください。


PlayerSet ゲームオブジェクト インスペクター画像




 インスペクターの PlayerController スクリプトに public 修飾子で宣言している bulletPrefab 変数が表示されていますので、
こちらに、Prefabs フォルダにある Bullet ゲームオブジェクトのプレファブをドラッグアンドドロップしてアサインしてください
この変数に登録されているゲームオブジェクトのクローンが Instantiate メソッドによって生成されるようになります。


PlayerSet ゲームオブジェクト アサイン後インスペクター画像



 以上で設定は完了です。


4.ゲームを実行して動作を確認する

 
 設定が完了しましたので、ゲームを実行して左クリックをしてみましょう。

 左クリックをするたびに、PlayerSet ゲームオブジェクトの位置にバレットが生成されます。
GameビューやSceneビューでは、キャラの画像の上に白いバレットが生成されます。

 また、それがPlayerSet ゲームオブジェクトの子オブジェクトとして生成されていれば制御成功です。
ヒエラルキーを確認し、PlayerSet ゲームオブジェクトの子オブジェクトとして生成されていることを確認してください。


<実行動画>
動画ファイルへのリンク


ヒエラルキー画像



 もしもバレットがキャラの画像の上に生成されない場合(例えば、キャラよりも上の位置など)には、バレットのプレファブの位置情報の設定を見直す必要があります。
1つ前の手順の一番最後にあるプレファブの作成部分を読み返してください。

 無事にバレットの生成処理が実装できました。次はこの左クリックで生成されたバレットを移動させる処理を実装します。


12.Bullet スクリプトを修正して、外部のスクリプト(PlayerController スクリプト)から ShotBullet メソッドへの命令を受けられるようにする

1.設計


 移動させる処理自体はすでに Bullet スクリプトに用意してあります。
そのため、生成した Bullet ゲームオブジェクトにアタッチされている Bullet スクリプトの情報を取得できれば
Bullet スクリプトに記述されている ShotBullet メソッドに対して、PlayerController スクリプトから命令を出すことが出きます

 ただしそのためには、ShotBullet メソッドが外部のスクリプトからでも呼び出せる設定になっていなければなりません。
外部のスクリプトから呼び出せるメソッドにするためには、対象のメソッドの修飾子を private => public に変更すれば、外部のスクリプトから呼び出せるメソッドとして機能できます。

 最初に、Bullet スクリプトを修正し、その後で、PlayerController スクリプトを修正します。


2.Bullet スクリプトを修正して、ShotBullet メソッドを外部のスクリプトより呼び出せる状態にする


 また、PlayerController スクリプトから ShotBullet メソッドを実行してバレットを移動する処理を行うようになりますので、
先ほどまで利用していた Start メソッドの処理と Update メソッドの処理はどちらも不要になります。
コメントアウトするか、削除してください。ここでは処理が長くなるのを防ぐため、どちらも削除して掲載しています。


Bullet.cs

 <= クリックしたら開きます


 スクリプトを修正したらセーブしておきます。この手順は完成です。


13.PlayerController スクリプトを修正して、生成したバレットの情報を取得して ShotBullet メソッドを実行するように命令する

1.設計


 Bullet スクリプト側の修正が完了しました。これで、ShotBullet メソッドは、Bullet スクリプト以外のスクリプトからも呼び出し命令を実行出来るようになりました。

 それに合わせて PlayerController スクリプトも修正を行う必要があります。



 まずは、生成された Bullet ゲームオブジェクトですが、PlayerController では現在、クローンの生成処理は行っているものの
この Bullet ゲームオブジェクト自体を管理している変数がないため、クローンを作っただけの状態になっています。

 スクリプトからゲームオブジェクトへ制御の命令を実行するには、そのゲームオブジェクトの情報を変数に代入する処理が必要になります
そうしなければ、大量にクローンを生成しているような場合に、どのBullet ゲームオブジェクトに命令を出すのか、特定することもできないためです。

 クローンを生成する Instantiate メソッドは戻り値を持つ、非常に便利なメソッドです。
この戻り値の機能を利用すると、メソッド実行時に、左辺に同じ型の変数を用意しておくことにより、生成された Bullet ゲームオブジェクトの情報を変数に代入してくれます
つまり、Instantiate メソッドでは、クローン生成と同時に、必要な Bullet ゲームオブジェクトの情報も一緒に変数に対して提供してくれるような作りになっています。



 Bullet ゲームオブジェクトの情報が変数に代入できれば、この変数を利用することで、Bullet ゲームオブジェクトの持つ情報、
つまり、Bullet ゲームオブジェクトにアタッチされているコンポーネントやスクリプトの情報を取得することが可能になります。

 今回処理を行いたいのは、Bullet スクリプトにある ShotBullet メソッドです。
そのためには、Bullet スクリプトの情報を取得できれば、先ほど public 修飾子にしておいた ShotBullet メソッドに対して命令を出せるようになります。

 どのようにして取得していければよいかを、考えてみてください。


2.PlayerController スクリプトを修正して、生成したバレットに対して ShotBullet メソッドを実行するように命令する


 スクリプトを修正するイメージはわきましたでしょうか。

 まずは今までと同じように、日本語でコメントを書いてからプログラムを考えて記述していきます。
 

PlayerController.cs

 <= クリックすると開きます。



3.<Instantiate メソッド◆ 写瓩蠱佑粒萢僉次


 Instantiateメソッドには、第1引数に指定した同じ型の戻り値があります。

 今回の処理では第1引数に bulletPrefab 変数を指定しています。この変数の型は GameObject 型です。
よって Instantiate メソッドを実行すると、生成した Bullet ゲームオブジェクトの情報を GameObject 型の戻り値として取得することが出来ます。

 そのため、Instantiate メソッドを実行する際には、左辺に戻り値と同じ型の変数を用意しておくことで、生成したゲームオブジェクトの情報を左辺へ用意してある変数へと代入処理を行うことが出来ます。
代入処理は、左辺 = 右辺 という条件でなければ成立しませんので、両辺が同じ型である必要があります。

  GameObject bulletObj = Instantiate(bulletPrefab, transform);

 この処理を型で見てみると、次のようになります

  GameObject = GameObject(Instantiate メソッドの戻り値の型)

 左辺で用意している変数は GameObject型であり、Instantiateメソッドの戻り値の型も GameObject型 です。
以上の事からこの代入処理が成立して、bulletObj 変数の中には生成されたばかりの Bullet ゲームオブジェクトの情報が代入されます


4.<ピリオドによる処理の読み解き方>

C# プログラムにおいて、変数間のピリオド(ドット)は非常に重要な役割を持ちます。これをしっかりと理解していかないと、処理を読み解くことが出来ません。

 処理は左側から読み解いていきます。ピリオドとピリオドまでが1つの命令になっています。

  // bulletObj 変数(Bullet ゲームオブジェクトが代入されている)に、アタッチされているBullet スクリプトの情報を取得し、ShotBullet メソッドに処理を行うように命令を出す
  bulletObj.GetComponent<Bullet>().ShotBullet();

 コメントにある日本語の「、」の部分をそのまま「.」の位置で読み替えてください。そのまま読み解けるはずです。



 1つの命令文にピリオドがある場合、そのピリオドの次につながる右側にある処理は、その前にあるピリオドによって扱える情報になっていて、その処理を受けて実行しています。
まずは1つずつ、バラバラにして読み解いていきましょう。

 bulletObjt.GetComponent<Bullet>()

 上記の処理は、bulletObj 変数が扱うことが出来る情報(変数やメソッド)のうちの、GetComponent メソッドを実行している、という処理になります。
この際の GetComponent メソッドの処理は、bulletObj 変数に代入されている値(今回は Bullet ゲームオブジェクト)に対して実行されることになります。
その結果、Bullet ゲームオブジェクトにアタッチされている Bullet スクリプトを取得する、という処理が実行されています。

 そして、この時点で、処理の対象者は、GameObject 型の情報ではなく、GetComponent メソッドで取得した Bullet 型に変更になっています



 次のピリオドの処理を見ていきます。これは先ほども書いたように、Bullet 型の情報が GetComponent メソッドによって取得できていますので、
この時点で、Bullet スクリプトの扱える情報に対して、何か処理を行うという処理になります。

 GetComponent<Bullet>().ShotBullet();

 Bullet スクリプトには、先ほど public 修飾子に変更した ShotBullet メソッドがあります。
ここでは、Bullet スクリプトの情報を扱える状態になっていますので、ピリオドの処理を使って、ShotBullet メソッドを実行しています


 このように、1つずつピリオドの処理を行うことによって、その処理を行う対象の型が変化していき、採集的に ShotBullet メソッドを実行出来るようになっています。

 C# のすべての処理はこの読み解き方が基本系になりますので、もしも処理の中にピリオドの処理があった場合には、左側から順番に1つずつ読み解いていってください


5.ゲームを実行して動作を確認する


 すべての手順が終了しましたので、ゲームを実行してマウスの左クリックをしてください。
生成されたバレットが上方向に移動すれば制御成功です。

 PlayerController スクリプトから Bullet スクリプトへの命令処理が無事に実行されています。


<実行動画>
動画ファイルへのリンク


 今後も、異なるスクリプト同士で命令を出す処理が増えていきます。
学習した内容を確認しながら、処理の流れ、読み解き方、戻り値、外部のスクリプトへの命令の出し方を復習しておきましょう。


 以上でこの手順は終了です。

 次は 手順8 −タップした位置情報をゲーム内に反映する処理を実装− です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます