Unityで作る「シューティングゲーム」。前回までで「スコア」とプレイヤーの「HP(ヒットポイント」を管理するプログラムと「UI(ユーザー・インターフェイス)」部分がいったん完成しました。
今回からは2番目の敵を作っていきたいと思います。今回もいわゆる「ザコキャラ」、でも1体目の敵とはちょっと違う動きを考えてみたいと思います。それでは早速作っていきましょう!
1,敵2の準備
①まずは取得済みのアセットから好きなキャラクターを選択します。サンプルでは「Fighter1」という画像を選びました。各自好きなキャラを選んでみてください!
キャラが決まったら、それをHierarchy上にドラッグ&ドロップします。
②画像が小さいので、素材の大きさを変更します。先ほど選んだ元画像を選択して、Inspectorを表示させます。「Pixcels Par Unit」というパラメータを25に変更します。この数字は選択したキャラクターや好みによって変更してください。1つのユニットにいくつの素材が入るか?という単位なので、値を小さくするほど画像は大きくなります。
数字を指定したら右下の「Apply」ボタンを押して確定します。
Hierarchy上でキャラクターを選択し、Inspectorからそれぞれのコンポーネントの値を指定していきます。
③まずは名前を「Enemy2」にしておきます。
さらに 「Tag」に「Enemy」を指定します。
④「Transformコンポーネント」では「Position」の値を借り指定しておきます。数字に意味はありませんが、[0,3,0] などと指定し、見えやすい場所に配置します。
「Rotation」は角度ですね?Zの値、つまりZ軸に対する角度を180に指定します。Z軸とは画面の手前から奥に伸びる軸です。これでキャラクターが下向きになります。
⑤「SpriteRendererコンポーネント」では「Sorting Layer」に「Enemy」を指定します。
続いてコンポーネントを追加します。
⑥まずはコライダー。今回は「CapsuleCollider2D」にしてみましょう。その名の通り、カプセルの形をしたコライダーですね。
「EditCollider」で形を調整(デフォルトでいいと思います)します。
さらに「IsTrigger」にチェックを入れておきます。これで敵同士が重なっても互いにに物理的な影響を受けません。
⑦続いて物理的な動きを管理する「Rigidbody2D」を追加。
「GravityScale」を 0 にして重力の働きを無効にします。
これで最初の設定は完成です。
2,敵2の移動プログラム
つづいてスクリプトファイルを作っていきましょう。
[Enemy2Controller] というスクリプトファイルを作成し、今回作成したEnemy2にアタッチします。
Enemy2 には下の図のような動きをつけたいと思います。
❶まずは画面外から登場、横の位置は乱数で指定します。
登場時はEnemy1と同じようにシールドを貼って、ダメージを受けないようにしましょう。
❷一旦停止して動き出します。まずは横方向に乱数で取得したスピードで移動。
❸続いて縦方向に移動。
以降は❷と❸を繰り返し、Y座標が画面外に出たら削除する。
では[Enemy2Controller] のスクリプトファイルを開いて、以下のコードを記述します。
bool IsMove = false; //❶登場と通常の動きを判定するフラグ
Rigidbody2D enemyRb2d; //❷敵のRigidbody
//❸敵の登場とその後の動き
IEnumerator Move()
{
//初期位置
transform.position = new Vector3(Random.Range(-15f,15f), 12f, 0);
enemyRb2d.velocity = new Vector2(0, -1f); //下方向に移動
yield return new WaitForSeconds(3); //3秒継続
enemyRb2d.velocity = transform.up * 0; //移動を止める
yield return new WaitForSeconds(0.5f); //0.5秒停止
IsMove = true; //フラグをtrue
while (transform.position.y>-10f) //y座標が-10まで継続
{
float moveX = Random.Range(-7.0f, 7.0f); //x方向の速さを乱数で指定
enemyRb2d.velocity = transform.right * moveX; //横方向の移動
yield return new WaitForSeconds(2); //2秒継続
enemyRb2d.velocity = transform.right * 0; //移動を止める
yield return new WaitForSeconds(0.5f); //0.5秒停止
enemyRb2d.velocity = new Vector2(0, -2f); //下方向に移動
yield return new WaitForSeconds(1); //1秒継続
}
Destroy(gameObject); //オブジェクトを削除
}
void Start()
{
enemyRb2d = GetComponent<Rigidbody2D>(); //❹Rigidbody2D を取得
StartCoroutine(Move()); //❺コルーチンを発動
}
まずは変数を2つ指定します。
❶「変数:IsMove」は「Enemy2」が動き出したかどうか判定するフラグです。登場時には false にしてダメージを受けないようにしましょう。
❷「変数:enemyRb2d」これは「Rigidbody2D」コンポーネントを管理する変数ですね。
順番が前後しますが、❹でRigidbody2D の情報を取得して enemyRb2d に代入しています。
❸でコルーチンを使った関数を作成します。
コルーチンは以前学習しましたが、ウェイト時間を管理することができる関数でしたよね?
ポイントは2つ。
まず関数の宣言時に「IEnumerator」を指定すること。ちなみに「アイ・イニュメレイター」「アイ・エニュメレイター」などと読みます。
もう一つは「yield return」で待ち時間(戻り値)を返すこと。
Move()関数ではまず、乱数を使って出現場所を指定しています。
その後は取得したRigidbody2D の「velocity」と乱数を活用して、動きを作っています。登場が終わったタイミングで、❶で宣言した「IsMove」をtrue にして、この後の実際の動きに移動します。
実際の動きは、while (transform.position.y>-10f) でEnemy2のy座標が-10を下回るまで以下の処理を繰り返し実行させます。
float moveX = Random.Range(-7.0f, 7.0f);
では横方向の速度を乱数で指定。
enemyRb2d.velocity = transform.right * moveX;
yield return new WaitForSeconds(2);
取得した速度を「velocity」の横の動きに掛けて2秒間継続させます。
enemyRb2d.velocity = transform.right * 0;
yield return new WaitForSeconds(0.5f);
動きを止めて、0.5秒間待機します。
enemyRb2d.velocity = new Vector2(0, -2f);
yield return new WaitForSeconds(1)
続いて垂直方向に1秒間移動させます。
y座標が-10を下回った段階でWhile文を抜け出し、Destroy関数でEnemy2を削除します。
Start関数では❹の他に、今作った❸のコルーチンを発動しています。
コルーチンを発動する際は「StartCoroutine()」で、コルーチン名を指定するだけですね。
ではこの状態で動かしてみましょう。Enemy2が上から出現して徐々に下方向に移動していく動きを確認することができたと思います。
今回はここまでです。
教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。
お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。
過去の作品はこちらから。
Vol.01~Vol.10 は下のVol.11 文末のリンクからどうぞ
コメント