今回は、敵の作成を行います。
目次
準備
敵機体のインポート
敵の機体のインポートをしてください。
自分は、下記のモノを使いました。
これでなくても、なんでもいいですよ。
Scriptの追加
[MyFolder]→[Script]の中に[EnemyControl]を追加してください。これに敵の動きなどを追加して書いていきます。
敵、3Dモデルの設定
まずは、インポートした3Dモデルを見てみましょう。
宇宙戦闘機と比べた時に、小さいですね。
なので、scaleをいじっていい感じの大きさに変えましょう。
scaleの変更
それぞれ、自分がインポートした3Dモデルに合わせていじってください。
自分と同じ3Dモデルで行っている場合は、scale[3]くらいがちょうどいいと思います。
Rotateの変更
次は、最初の回転角度をいじってみましょう。
敵なので、基本的にプレイヤーが動かす宇宙戦闘機とは対面になっています。
なので、最初の角度から180度回転させてみましょう。
[Inspector]→[Rotate]のY軸を180と入力してください。これで対面になりました。
EnemyControl
using UnityEngine; using System.Collections; public class EnemyControl : MonoBehaviour { public GameObject EnemyBullet; float Z_Speed = 0.7f; float intervalTime; // Use this for initialization void Start () { intervalTime = 0; } // Update is called once per frame void Update () { transform.Translate(0, 0, 1 * Z_Speed); Quaternion quat = Quaternion.Euler(0, 180, 0); intervalTime += Time.deltaTime; if (intervalTime >= 0.3f) { intervalTime = 0.0f; Instantiate(EnemyBullet, new Vector3(transform.position.x, transform.position.y, transform.position.z), quat); } } }
だいたい、StarFighterと同じだと思います。
違いは、つねにこっち側に動くようになっている事。
何も押さなくても、弾が発射されるように設定されている事です。
EnemyBulletには、宇宙戦闘機に追加した弾と色違いのものを選んで敵のモデルと同じように180度回転させて
宇宙戦闘機の弾に追加したScript[Bullet]と同じモノを追加して、Prefab化したモノを追加してください。
敵の出現位置
次は、敵の出現位置を設定します。
今回は、宇宙戦闘機の前に出るような設定にしたいと思います。
これで、宇宙戦闘機が前に前に進んでも敵はいい感じの位置から出続けてくれます。
敵のPrefab化
まずは、敵をPrefab化しましょう。
作成した敵を[MyFolder]→[Prefab]の中に入れてください。
StarfighterControlにコードの追加
次に、StarFighterControlに敵のPrefabを出現させるコードを追加します。
using UnityEngine; using System.Collections; public class StarfighterControl : MonoBehaviour { float X_Speed = 1; float Z_Speed = 1; public GameObject Prefab; public GameObject EnemyObject; float intervalTime; float enemyintervalTime; // Use this for initialization void Start() { intervalTime = 0; enemyintervalTime = 0; } // Update is called once per frame void Update() { float vertical = Input.GetAxis("Vertical"); float horizontal = Input.GetAxis("Horizontal"); if (Input.GetKey("up")) { transform.Translate(0, 0, vertical * Z_Speed); } if (Input.GetKey("down")) { transform.Translate(0, 0, vertical * Z_Speed); } if (Input.GetKey("left")) { transform.Translate(horizontal * X_Speed, 0, 0); } if (Input.GetKey("right")) { transform.Translate(horizontal * X_Speed, 0, 0); } intervalTime += Time.deltaTime; if (Input.GetKey("space")) { if (intervalTime >= 0.1f) { intervalTime = 0.0f; Instantiate(Prefab, new Vector3(transform.position.x, transform.position.y, transform.position.z), Quaternion.identity); } } Quaternion quat = Quaternion.Euler(0, 180, 0); enemyintervalTime += Time.deltaTime; if (enemyintervalTime >= 4.0f) { enemyintervalTime = 0; Instantiate(EnemyObject, new Vector3(transform.position.x, transform.position.y, transform.position.z + 200),quat); } } }
追加したのは
</pre> <pre>Quaternion quat = Quaternion.Euler(0, 180, 0); enemyintervalTime += Time.deltaTime; if (enemyintervalTime >= 4.0f) { enemyintervalTime = 0; Instantiate(EnemyObject, new Vector3(transform.position.x, transform.position.y, transform.position.z + 200),quat); }
です。
また、これに使った新しい変数です。
[ enemyintervalTime]が敵が出てくる間隔です。49行目の[if
(enemyintervalTime >= 4.0f)
]で4秒毎に敵を生成するという感じにしています。
出現位置は、[Instantiate(EnemyObject,
new
Vector3(transform.position.x, transform.position.y, transform.position.z + 200),
quat);
]で設定しています。
Z軸に+200して、宇宙戦闘機のZ軸の+200前に出るように設定されています。
また、宇宙戦闘機の[Inspector]→[StarFighterControl]に[EnemyObject]が追加されています。
これに、先ほど作成してもらった敵のPrefabを追加してください。
これで、実行すると4秒毎に前方に敵が生成されるようになったと思います。
まとめ
今回は、敵を作成してそれを出現されるところまでやりました。
前回までに行った事と同じ事が多かったので説明はかなり省かて書いてみました。
今回の記事で詰まるところがあれば、これまでの記事を見なおしてみてください。
きっと詰まったところと同じような事を行っていると思います。
次回は、弾が敵に当たるようにすること、敵の弾が当たるようにする事などを書いていきます。
では。
コメント
はじめまして。
タイトル通りの初心者がこちらのシリーズを元にUnity挑戦してみてます。
有用な記事をありがとうございます。
ただ一通り最後まで真似して作ってみて、一応動くようには出来たのですが
ゲームスタートすると敵機が180度回転せず後ろ向きに出現してしまうんですよ。
Prefab化する前のDroidFighterのTransformをいじっても、
Prefab内のTransformをいじってみても反映されないんですが
手順を間違えてるんでしょうかね?
HIROさんの方では問題なく表示されていますでしょうか?
指摘ありがとうございます。
記事を修正しました。
修正した部分は、[StarfighterControl.cs]の敵出現位置です。
ここで、敵の出現時の角度も設定するようにしました。
Quaternion quat = Quaternion.Euler(0, 180, 0);
そして、[EnemyControl.cs]の敵の進む方向も逆にするために
transform.Translate(0, 0, -1 * Z_Speed);をtransform.Translate(0, 0, 1 * Z_Speed);
に修正しました。
これでもう一度試してみてください。