Unity Visual Scripting 入門第7回:RaycastとListを使って的あてゲームを作る(前編)

この記事はVisual Scripting 入門の第7回です。前回の記事は下記のリンクから確認できます。

本記事は前後編でRaycastとListを使って的あてゲームを作る方法を解説します。

今回(前編)の記事で学べる事

 

  • Listへの要素の追加
  • Random
  • For文
  • Instantiate

完成イメージ

完成イメージ

完成イメージ

Random関数でランダムな座標を作成する

Random関数とは指定した数の範囲内でランダムに数を出力してくれるものです。

Hierarchyの+ボタンをクリックし、空のGameObjectを作ります。

GameObjectを作成

GameObjectを作成

名前を[AimLabManager]とします。

[AimLabManager]

[AimLabManager]

[AimLabManager]にScriptMachineをアタッチし、新しいグラフをMacrosというフォルダに作成し、そこに保存します。

グラフの名前は[AimLabGraph]とします。

[AimLabGraph]

[AimLabGraph]

数秒ごとに的を生成したいので、タイマーを設定します。

時間を計測する変数を追加します。[AimLabManager]のVariableにFloat型の変数[Time]を追加し、Graph Editorに[Time]を追加します。

[AimLabManager]にFloat型の変数[Time]を追加

[AimLabManager]にFloat型の変数[Time]を追加

Graph Editorに以下のノードを追加してください。

 

  • Get Delta Time 
  • Add 
  • If 
  • Greater 
  • Set Object Variable ×2
  • Float Literal

※ノードの画像はわかりにくいもののみ載せています。

Get Delta Time 

Get Delta Time


Add

Add

ノードを以下のように接続します。

今回は0.5秒ごとに的を生成するので、Greaterに0.5を入力します。

0.5秒を超えたら[Time]を0に戻します。そのためSet Object Variableを2つ用意します。

Set Object Variableを2つ用意

Set Object Variableを2つ用意

次にランダムな座標を作ります。Graph EditorにRandom Range, Vector3 Create(X,Y,Z)を追加します。

Random RangeはResult(Float Output)のものを選んでください。

Int型のものを選ぶと整数でランダムな数が選択されてしまいます。

今回はランダム性に幅をつけたいのでFloat型の変数を選びます。

また、今回はX軸とY軸にランダム性を持たせるのでRandom Rangeを2つ作ります。

Random Range

Random Range


Vector3 Create(X,Y,Z)

Vector3 Create(X,Y,Z)

ノードを以下のように接続します。

Random Rangeは上の変数が最小値、下の変数が最大値としてその間でランダムに数を出力します。 

今回はX軸は-4〜4、Y軸は0〜3にします。

ノードを接続

ノードを接続

Instantiateでオブジェクトをで成してListに追加する

Instantiateを使ってオブジェクトを生成することができるので、これを使って的を作ります。

まず、的のPrefabを作ります。Hierarchyの+ボタンをクリックし、3DObject→SphereをクリックしてSphereを作ります。

名前[Target]とします。

Sphereを作成

Sphereを作成

TargetをProject内のAssetフォルダにドラッグ&ドロップしてPrefab化します。

ドラッグ&ドロップしてPrefab化

ドラッグ&ドロップしてPrefab化

Prefab化したらHierarchyのTargetを削除します。

Prefab化したTargetをGraph Editorにドラッグ&ドロップすると以下のようなウィンドウがでるのでエンターを押して追加します。 

Prefab化したTargetをGraph Editorにドラッグ&ドロップ

Prefab化したTargetをGraph Editorにドラッグ&ドロップ

Graph EditorにInstantiate、Get Identityを追加します。

Instantiate、Get Identity

Instantiate、Get Identity


Instantiate、Get Identity

Instantiate、Get Identity

ノードを以下のように接続します。Instantiate のそれぞれのポートについて説明します。

Originalポート 生成するオブジェクトのPrefabを接続します。
Positionポート(Vector3型の変数) 生成するオブジェクトの座標を接続します。
Rotationポート(Quaternion型の変数) 生成するオブジェクトの回転を接続します。

Get IdentityにはQuaternion型の(0,0,0,1)の値が入っています。

ノードを接続

ノードを接続

実行します。ランダムな座標に[Target]を生成することができました。

ランダムな座標に[Target]を生成

ランダムな座標に[Target]を生成

For文を使ってListのオブジェクトに番号をつける

VariableにAot List型のListを追加します。名前は[TargetList]とし、Graph Editorに追加します。

Aot List型のListを追加

Aot List型のListを追加

Graph Editorに以下のノードを追加してください。

 

  • Add Item
  • Count Item
  • For Loop
  • Get List Item
  • Integer To String
  • Set Name

※ノードの画像はわかりにくいもののみ載せています。

Integer To String

Integer To String


Get List Item

Get List Item


Set Name

Set Name

以下のようにノードを接続します。

Instantiateの右の下のポートから生成したオブジェクトが出力されているので、それをAdd Itemを使ってリストに追加します。

Add Itemは左の真ん中のポートが追加先のリストを接続し、下のポートにはリストに追加するオブジェクトを接続します。

その後、リストに入っているTargetに名前を付けなおします。

For Loopとはある数を入力してその回数分Bodyに接続されている処理を繰り返すというものです。

Firstのポートには初期値が入力されています。

Stepの数が毎処理ごとにFirstの数に足されていき、Lastの値と同じになった時にFor Loopの処理を終え、Exitから処理が出ます。

Body後の処理を説明します。

Indexは今何回目のループかをInt型で出力しています。

To String を使ってIndexをString型に変換しています。

リストの番号は格納された順番で0から番号が振られます。

Get ItemはIndexに接続された番号のリストに格納されている情報を得ることができます。

最後にSet Nameを使い名前を付けなおします。

上から2番目のポートには名前を帰るオブジェクトを接続し、その下のポートには変更する名前を接続します。

ノードを接続

ノードを接続

実行します。生成したオブジェクトに0から順に番号を入れることができます。

オブジェクトに0から順に番号が入っている

オブジェクトに0から順に番号が入っている

的が生成される数を制限する

Variableの[Target List]をGraph Editorに追加します。

Graph Editorに以下のノードを追加してください。

 

  • Count Items 
  • Greater 
  • If

※ノードの画像はわかりにくいもののみ載せています。

If

If

On Updateの後に以下のノードを付け足します。

今回は4つまで生成ます。

Greaterの変数に3を入力します(カウントは0から始まるので、0から3で4つという数え方です)。

[Target List]の要素が4を超えたら Greater がTrueになるので、Ifの後の処理が動かなくなります。

ノードを接続

ノードを接続

シーンを実行します。的を生成する数を4つまで制限することができました。

生成する数を4つまで制限

生成する数を4つまで制限

今回のVisual Scripting のノードの全体図です。

ノードの全体図

ノードの全体図

後編の記事では的をクリックすると消える仕組みを紹介します。