前回までで、敵キャラが主人公キャラに接近したら追いかけてくるというスクリプトを組みました。
今回はその敵キャラを最初から配置するのではなく、自動で配置してみようと思います。
敵キャラを完全にランダムな位置に出現させるのも面白いですが、主人公が行けないエリアに発生するリスクもあるので、今回は出現場所を決め、そこから一定時間毎に敵キャラを出現させるようにしたいと思います。
出現場所自体をプレハブで作成し、出現場所プレハブをフィールドに配置していきます。
永遠に敵キャラが出現すると困るのでその出現場所で出現出来る人数も制限します。
シーン上のゲームオブジェクトをプレハブ化する方法
まずは今までシーン上に配置していたキャラクターをProjectのAssetsフォルダにprefabフォルダを作り、そこにドラッグ&ドロップしてプレハブにします。(Assetsフォルダにシーンのゲームオブジェクトをドラッグ&ドロップするとプレハブになります)
シーン上に配置したキャラはいらないので削除します。(プレハブにする前に削除して最悪の事態を招かないよう気を付けてください)
プレハブにするとスクリプトからそのプレハブをシーンに配置する事が可能になります。
最初から配置するキャラクターやオブジェクトも使いますが、量産型のものはプレハブにしてスクリプトでシーンに配置した方がかなり楽になります。
敵キャラの出現場所を作成しプレハブ化する
それでは次に敵キャラの出現場所を作ります。ヒエラルキー上で右クリック→Create Emptyで空のオブジェクトを作り、名前をAppearance(名前はご自由にお付けください)とします。
Appearanceの位置をx:17、y:0、z:18とし、AppearScriptという新しいスクリプトを作りコンポーネントに追加します。
ここを敵キャラの出現場所とします。
出来たAppearanceをAssetsフォルダにドラッグ&ドロップしてプレハブにし、出現させたい場所にこのAppearanceプレハブを配置します。
敵キャラを出現場所に登場させるスクリプトの作成
AppearScriptの中身を作成していきます。
フィールドの宣言とStartメソッド
まずはフィールドの宣言とStartメソッドを作成します。
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 UnityEngine; using System.Collections; public class AppearScript : MonoBehaviour { // 出現させる敵を入れておく [SerializeField] GameObject[] enemys; // 次に敵が出現するまでの時間 [SerializeField] float appearNextTime; // この場所から出現する敵の数 [SerializeField] int maxNumOfEnemys; // 今何人の敵を出現させたか(総数) private int numberOfEnemys; // 待ち時間計測フィールド private float elapsedTime; // Use this for initialization void Start () { numberOfEnemys = 0; elapsedTime = 0f; } } |
出現させる敵はインスペクタのEnemysに設定します。
appearNextTimeは次にその場所から敵が出るまでの時間で、maxNumOfEnemysはこの場所から出現させる敵の数で、numberOfEnemysは実際に出現させた敵の数、elapsedTimeは最後に敵を出現させてからの経過時間が入ります。
Startメソッドでは出現させた敵の人数と経過時間を初期化しています。
敵を出現させるかどうかの判定処理
敵を出現させるかどうかはUpdateメソッドで行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | void Update () { // この場所から出現する最大数を超えてたら何もしない if (numberOfEnemys >= maxNumOfEnemys) { return; } // 経過時間を足す elapsedTime += Time.deltaTime; // 経過時間が経ったら if (elapsedTime > appearNextTime) { elapsedTime = 0f; AppearEnemy (); } } |
出現させた敵の数が最大出力数と同じ以上であればreturnを使ってその後の処理をさせません。
まだこの場所から出現させる事が出来るなら、経過時間を増やし、次に出現させる時間を超えた時にAppearEnemyメソッドを呼び出し敵を出現させます。
敵を登場させる処理
敵を登場させる処理はAppearEnemyメソッドで行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // 敵出現メソッド void AppearEnemy() { // 出現させる敵をランダムに選ぶ var randomValue = Random.Range (0, enemys.Length); // 敵の向きをランダムに決定 var randomRotationY = Random.value * 360f; GameObject.Instantiate (enemys[randomValue], transform.position, Quaternion.Euler (0f, randomRotationY, 0f)); numberOfEnemys++; elapsedTime = 0f; } |
敵のプレハブの配列から敵を選んでインスタンス化する為、Random.Rangeを使ってランダム値を作成します。
また敵を登場させる時の角度もRandom.valueを使ってランダム値を取得します。
Random.valueは0.0~1.0の値のランダム値が得られるので、そこに360をかけて0~360の間の角度を取得します。
プレハブからインスタンス(シーン上に配置したオブジェクトの実体)を作成するには、
GameObject.Instantiateを使います。
Instantiateの引数をインスタンス化するゲームオブジェクトの1つだけ指定すると
ゲームオブジェクトがインスタンス化される位置はVector3.zero(0, 0, 0)、角度はQuaternion.identityになります。
Quaternion.identityは生成したインスタンスの親の角度、親がなければワールド(ルート)の角度が指定されるみたいです。
敵の位置はAppearanceゲームオブジェクトの位置で、角度はY軸の角度だけをランダムにしたいので(XやZを変えると傾く為)Y軸の角度だけを指定しています。
AppearEnemyスクリプトの設定
AppearEnemyスクリプトが出来たのでインスペクタで設定をします。
敵のプレハブが1つしかないので、masasi君を敵に見立てて設定してみました。
終わりに
これでスクリプトから敵のプレハブをシーンに登場させる事が出来るようになりました。
敵キャラを攻撃して敵キャラが倒されて数が減る、という機能をまだ作っていないので、同時出現数の機能は省きました・・・。
敵を倒せるようになれば、AppearEnemyスクリプト内でリスト等を使ってここから出現させた敵を管理しておき、敵が倒された時は敵のスクリプトからAppearEnemyスクリプト内の処理を呼び出し、リストから削除する事によって同時出現での制限をする機能も追加出来ると思います。
敵キャラクター出現時に何の音も表現もないのでいつどこに出現しているか解り辛いです。
その為、次回は敵キャラクターが登場した時にエフェクトを加えてみたいと思います。
エフェクトだけだとそうとう短い記事になりそうな予感・・・・・。
最後にこれまでで出来ているサンプル画像です。
あまりにも文字ばっかりで味気ないので追加してみました。
UnityWebPlayerでアップしようと思ったんですが容量オーバーで出来なかったので画像になります。
うまく映像が保存出来ませんでしたが、こんな感じです。