タワーディフェンス講座の第3回では敵オブジェクトを作っていきます。
今回からスクリプトも書いていきます。
前回の記事↓

敵オブジェクトの作成
まず、空の敵オブジェクトを作ります。
Hierarchyビューで 右クリック→CreateEmpty で空のGameObjectを作ります。(または、CTRL+SHIFT+Nでも構いません)
Inspectorビューで名前は Enemy に変更し、Transform の Position は X,Y,Z ともに 0 にしておきます。(Transform の … から Reset を選んでも良いです)
次に敵の画像として、Assets/Images から、character_roundPurple を使いたいと思います。
このcharacter_roundPurpleをHierarchyビューの先ほど作ったEnemyオブジェクトの子要素になるようにドラッグアンドドロップします。
描画順の問題で後ろに隠れてしまっているのと、Sprite(画像)の名前がそのままオブジェクト名になってしまっていると思いますので、Inspectorビューで
- Order in Layer を 2
- 名前をcharacter_roundPurple から sprite
にしておきましょう。
スクリプトの新規作成
次に、スクリプトを追加していきます。
Enemyオブジェクトを選択し、Inspectorビューで Add Component ボタンを押します。
今回は既存のスクリプトではなく、1から作る事になるので、一番下にあるNewScriptを選択します。
すると、このように Name に新しく作るスクリプトの名前が指定できるので、今回はEnemyと入れ、下部のCreate and Add ボタンを押してください。
EnemyオブジェクトにEnemyスクリプトが割り当てられた状態になったと思います。
なお、このようにInspector上で追加したEnemyスクリプト本体はAssets/に自動で作成されます。
このままでもゲーム制作に大きな支障は出ませんが、ゲームの複雑さが増すごとに関連するファイルが増えてきてどこに何があるかが非常に分かりづらくなってきてしまいます。
スクリプト入れるためのフォルダ Assets/Scripts を第1回で作ってあると思いますので、今回作成したEnemyスクリプト(ファイル名としてはEnemy.cs)もAssets/Scriptsに移動しておきましょう。
スクリプトの編集
スクリプトの編集はUnityEditorだけでは出来ず、何か外部の統合開発環境(IDE)やテキストエディタなどで行うことになります。
それでは実際にスクリプトの中身を書いていきます。スクリプトをダブルクリック、またはInspectorの割り付けられているスクリプトの薄くなっている部分をダブルクリックしてください。
すると、既定のIDEまたはテキストエディタが起動します。本記事の環境ではVisual Studio Community 2019が起動しています。
起動すると、下のようにEnemyファイルが開かれた状態になります。この時、5行目を見てみると、クラス名がEnemyになっていることが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
なお、自動で作られるスクリプトには最初からStart関数とUpdate関数があります。
最初から書いてあるコメントにも英語で書いてありますが、Start関数はゲームオブジェクトが生成されてからUpdateの前に一度だけ実行される関数です。そのため変数の値の初期化などに使用されます。
対してUpdate関数は毎フレーム(例:1秒間に60回)実行される関数です。そのためキーの入力取得や徐々に数値を変化させたい時などに使用されます。
必要なパラメータを用意し、敵オブジェクトの移動処理プロトタイプを作る
タワーディフェンスの敵に必要なものを考えていきます。
- HP
- 進行速度
- 倒した時に手に入るお金
あたりは必ず必要です。
それぞれ
- HP → 整数型(int) hp
- 進行速度 →浮動小数点型(float) speed
- 倒した時に手に入るお金 →整数型(int) gold
としてプログラムに記述していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour { public int hp; public float speed; public int gold; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
プログラムの修正を行ったら保存(CTRL+S)をし、UnityEditorに戻ってみましょう。
スクリプトに追加した Hp,Speed,Gold がそれぞれInspectorに表示されました。
これで、InspectorからEnemyのパラメータが指定できるようになりました。
それでは
- HP 3
- Speed 1
- Gold 100
を設定してみてください。
この状態でUnityEditorの再生をしてみましょう。 再生は上部にある三角ボタンです。
どうでしょうか。 一切動かないですね。それはそうです。何かが動くようなスクリプトを書いていません。
一旦停止し(もう一度再生ボタンを押して、ボタンが青くなくなることを確認してください)またスクリプトを修正していきます。
では、今度はEnemyがちょっとずつ右に動くようにしましょう。
- Enemyがちょっとずつ右に動く。
もう少し詳しく、プログラム的に表現すると
- Enemyの位置のx座標を徐々に増やす(右に動かす)
ということになります。
この「徐々に数値を変化させたい時」に使うのは・・・そう、Update関数です。
オブジェクトの位置を表すのは transform.positionになるので、それをUpdate関数の中で徐々に変化させます。
1 2 3 4 5 |
void Update() { var v = Vector3.right; //移動方向 今回は右 transform.position += v * speed * Time.deltaTime; } |
プログラムの修正を行ったら保存(CTRL+S)をし、UnityEditorに戻って再生ボタンを押してみましょう。
(まだ沢山やることはありますが)とりあえず1体敵オブジェクトが作れました!!
しかし、敵が1パターンだけではさみしいですね。
もう2パターンほど作りましょう。
今作った Enemy を Hierarchyビューで選択して、CTRL+D(複製)を2回します。
Enemy (1) と Enemy (2) が作られましたね。
なお、複製は同じ場所に作られてしまい分かりづらいので、各Transform の Position Y を
- Enemy (1) は Position Y を -1
- Enemy (2) は Position Y を -2
にしておきましょう(注:この時、Enemy ではなく、その子要素の sprite の方のPosition を変更しないように気をつけましょう。)
では、Enemy (1) は
- 足が遅いがHPが高く、GOLDもちょっと高い
という、感じにしましょう。
Enemy(1)を選択し、Inspectorビューで
- HP 5
- Speed 0.8
- Gold 150
に設定します。
そして、同じ見た目だと見分けがつかなくて困るので、画像を差し替えます。
Enemy (1) の子オブジェクトの sprite を選択しSpriteRendererに指定されているSpriteをAssets/Images/character_squareYellow に変更します。
方法は2つあるのですが、1つは下のように、Sprite(画像)をそのままSpriteRendererのSpriteの枠にドラッグアンドドロップすることです。
もう一つの方法は、
上の図でいう、赤い四角の中の◎部分をクリックすると、そこにセット出来る候補の一覧が出てくるのでそこからSpriteを選択することもできます。
どちらも良く使いますので、両方覚えてきましょう。
では、 Enemy(2) も変更しましょう。
- 足が速いがHPが低く、GOLDも安い
ステージをかく乱する敵にしましょう。
- HP 1
- Speed 2
- Gold 50
- Sprite を Assets/Images/character_squareGreen
に変更してみてください。(ちょっとしたおさらいですね)
どうでしょうか。変更できましたでしょうか。
なお、再生ボタンを押して確認してみると、このように速度の差がわかります。
もし、このようになっていない場合は少なくとも各EnemyのSpeedが異なっているかもしれません。一度見直してみてください。
ただ、この数値は後からいくらでも変更できる(というより、ここをうまく変更することがゲーム性・レベルデザインの見せ所になる)ので、今のところはある程度適当でも構いません。
今回作った3体のEnemyは、ゲームに何匹も出てくることになり、使いまわす前提なのでprefab化をしておきましょう。
Enemy,Enemy (1),Enemy (2) をそれぞれ Assets/Prefabs にドラッグアンドドロップしてprefab化しておきます。

ブロックと合わせてprefabが5つになっていることを確認しましょう
prefab(プレファブ)化とはなんなのか
「prefab化」と簡単に言っていますが、これは何なのか、どんな利点があるのか疑問に思っている方もおられると思います。
ざっくり言うとprefabとは「見本」や「原型」のようなものです。
誰かに何かの作成を依頼するときに「手順書」を書く事もありますが、現物の「見本」を渡して「これと同じものをよろしく」で済むならそれはそれで簡単ですよね。
特にコンピュータ内の世界では複製はお手の物です。
Hierarchyで青くなっているオブジェクトは「何か(prefab)を見本にして作ったよ」という証であり、個々のオブジェクトは「見本としたprefab」が記憶されています。
そのため、青くなっているオブジェクトを右クリックすると
「Select Prefab Asset」や「Open Prefab Asset」 といった、「見本としたPrefab」を選択や編集する項目がありますし、逆に「Unpack Prefab」のように、見本(prefab)とのリンク(関係)を切断する項目もあります。
この「見本としたprefabを覚えている」というのがキモです。
例えば、見本(prefab)に誰かがいたずらをして余計なパーツを付けたとします。するとUnityEditorは即座に「見本(prefab)」の変更を検出して、「見本(prefab)」と同じになるようにシーンを作り直してくれます。
これは現実世界ではありえない話ですが(車を工場で作った後に、設計書にタイヤを一つ追加したって既に作られた車にタイヤは追加されませんよね)一括で色や形などを変更できるので上手く使うと色々な手間を省くことが出来て便利です。
(またprefabは往々にしてスクリプト上からオブジェクトを生成(複製)をするのに使用されますが、その話はまた次回以降に・・・)
おさらいと次回予告
今回は敵(Enemy)の作成と、Prefabの説明を簡単にしました。
次回は、この作った敵の移動経路を設定する仕組みを作成していきます。
次回の記事↓

コメント