第5回 - 敵を実装しよう【Unity講座2022】
敵を実装しよう
1. 敵のプレハブを作成する
まず敵のプレハブを作成します。
解説:プレハブ(Prefab)とは?
オブジェクトのテンプレートのことです。
プレハブは同じものを複数使用するときなどにプレハブを使用することで、同じオブジェクトを一度に生成することができたり、プレハブのインスペクターを編集することで複製されたオブジェクト(インスタンス)のインスペクターの内容も変更されるので、管理も便利です。

1-1. プレハブを作成
1-1-1. フォルダを作成
プレハブを入れるPrefabsフォルダをAssetsフォルダ直下に作成します。
1-1-2. プレハブを作成
Prefabsフォルダ内にプレハブを作成します。
Projectウィンドウで右クリックし、Create > Prefabを選択します。名前は「EnemySkeleton」にしておきます。
1-1-3. Inspectorウィンドウでコンポーネントを追加する。
プレハブをダブルクリックするとプレハブの詳細画面が表示されます。
以下の画像を参考にしながら
- Sprite Renderer
- BoxColloder 2D
- Rigidbody 2D
を追加してください。


1-1-4. GameSceneに配置する
GameSceneを開き、作成したプレハブをHierarchyウィンドウにドラッグアンドドロップして配置します。
以下の画像のようにプレハブオブジェクトは普通のオブジェクトと違い、青色で表示されます。

2. 敵の動作を実装する
今回の敵には、
- ゲーム開始後からずっと進み続ける
- プレイヤーに当たったら消える
- 壁に当たったら進む方向を反転する
という機能を実装します。
2-1. 触れたことを検知するためのオブジェクトを作成する
これらの機能を実装するには、敵が床に立っているのか、壁に触れているのか判別しなくてはいけません。
なので、「地面用」「右半身」「左半身」の3つのオブジェクトを実装します。
2-1-1. Prefabを開く
Assets / Prefabs / EmenySkelton.prefab をダブルクリックして詳細を開きます。
2-1-2. 床に触れたことを検知するためのオブジェクトを作成する
EnemySkelton直下に「Leg」という名前のオブジェクトと作成します。
2-1-3. Colliderを追加する
-
Inspectorウィンドウで
Box Collider 2Dを追加します。 -
Is Triggerを
true(チェックを入れる)にします。 -
Offsetの値を
x: 0y: -1.25に設定します。 -
Sizeの値を
x: 0.5y: 0.5に設定します。
すると、画像のように足元に小さな正方形の当たり判定が出来ました。
敵本体よりも小さな理由は、壁に当たったことを検知しないようにするためです。
もし、当たり判定を本体と同じ幅にしてしまうと、壁に当たった時も反応してしまいます。それを防ぐために小さくするのです。

2-1-4. 実践:右半身に触れたことを検知するためのオブジェクトを作成しよう
条件
オブジェクト名は「ArmRight」にしてください
ヒント
床に当たったことを検知してしまわないためには...
2-1-5. 実践:左半身に触れたことを検知するためのオブジェクトを作成しよう
条件
オブジェクト名は「ArmLeft」にしてください
ヒント
床に当たったことを検知してしまわないためには...
2-2. ゲーム開始後からずっと進み続けるプログラムを書く
ただひたすら進み続けるコードを書きます。
2-2-1. C#ファイルを作成する
Projectウィンドウで「EnemyController」という名前のC#ファイルを作成してください。
2-2-2. 実践:左右移動を実装してみよう
左に進み続けるだけの処理と右に進み続けるだけの処理を実装してみましょう。
ただし、関数を使用して実装してみてください。
条件
- 左移動の関数名は「MoveLeft」にしてください
- 右移動の関数名は「MoveRight」にしてください
- 移動速度は「0.05f」にしてください
解説:関数の使い方
C++講座でも教わったと思いますが、C#での関数の使い方を解説します。
まず、関数はpublic class /*FileName*/直下で定義するのが基本です。Update関数内でも定義できますが、その場合はStart関数内ではその関数を使用できなくなるため注意が必要です。
また、そのファイル内のみで使う関数の場合はprivate void /*関数名*/とすることで、別のファイルからその関数を使うことができなくなるため、安全性が向上します。
逆に別のファイルでも関数を使いたい場合はpublic staticとすることで可能になります。
【Unity】classにstaticを付けるべきときはいつ?
関数の使用例プログラム
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class /*FileName*/ : MonoBehaviour
{
void Start()
{
FuncA();
}
void Update()
{
FuncA();
FuncB();
}
private void FuncA () {
// 処理を書く
}
private void FuncB () {
// 処理を書く
}
}
2-3. 身体の向きを変える処理を実装する
身体は、敵が右に進んでいるときには右向き、左に進んでいるときには左向きになるのが普通です。
なので、進んでいる方向に合わせて体の向きを変える処理を実装します。
2Dの場合、体の向きを変える方法はいくつかありますが、今回はSpriteRendererのFlipを用います。
2-3-1. Flipを試してみる
EnemySkeltonオブジェクトのInspectorウィンドウから「Sprite Renderer」を見つけます。
上から3つ目の「Flip」のXとYにチェックを入れるとオブジェクトの向きが変わっていることが分かります。

2-3-2. 向きを変える処理を実装する
プログラム自体はコードを見てください。
-
public class直下にSpriteRenderer変数を作成します。 - Start関数内で、このプログラムが充てられているオブジェクトにあるSpriteRendererコンポーネントを取得し、変数に代入する処理を実装します。
- 2-2で実装した関数内に、Flipにチェックをつけるかどうかの処理を実装します。
左移動時はチェックをつけ、右移動時はチェックを外すことで期待した動作になります。
身体の向きを変えるプログラム
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyController_05th : MonoBehaviour
{
Vector2 position;
SpriteRenderer spriteRenderer;
private float moveSpeed = 0.005f;
void Start()
{
spriteRenderer = GetComponent<SpriteRenderer>();
}
void Update()
{
position = transform.position;
MoveLeft();
}
private void MoveLeft () {
position.x -= moveSpeed;
spriteRenderer.flipX = true;
transform.position = position;
}
private void MoveRight () {
position.x += moveSpeed;
spriteRenderer.flipX = false;
transform.position = position;
}
}
2-4. 実践:プレイヤーに触れたら消える処理を実装しよう
この敵オブジェクトがプレイヤーに触れたらオブジェクト自体を削除する処理をEnemyController.cs内で実装してみましょう。
ヒント1
触れたオブジェクトがプレイヤーと判断するには「Tag」をつけてみよう
ヒント2
ゲームオブジェクトを削除するにはDestroy関数を使おう
Destroy(/* 削除したい gameObject */);
ヒント3
地面との設置を検知する方法と似ているよ
2-5. 壁に衝突したときに進む方向を変える処理を実装する
本当はここまで行きたかったのですが、情報量があまりにも多くなってしまったため、次回行います。
次→
第6回 - 敵の動作を実装する・カメラがプレイヤーを追従するようにする【Unity講座2022】
https://inct-densan.kibe.la/shared/entries/1de55cbb-1b11-41c0-b395-9bcdca72c3ef