プレイするゲームがないなら、自分で作ればいいじゃない!
ということで Unity 初心者が「ゲームを作る」ゲームをやっていきます!
今回は「敵に弾を撃たせる」の記事です
内容
「自機狙い」と「前方3方向(3WAY)」の弾を敵に撃たせる
弾の準備
まずは画像の用意
シーンに配置して、コライダーとスクリプトを追加します
弾のスクリプト
方向ベクトルに移動値をかけて加算するシンプルなもの
public class EnemyBullet : MonoBehaviour
{
[SerializeField] float moveSpeed = 3.0f; // 移動値
[SerializeField] Vector3 moveVec = new Vector3(-1, 0, 0); // 移動方向
void Update()
{
float add_move = moveSpeed * Time.deltaTime;
transform.Translate(moveVec * add_move);
}
public void SetMoveSpeed(float _speed)
{
moveSpeed = _speed;
}
public void SetMoveVec(Vector3 _vec)
{
moveVec = _vec.normalized;
}
}
Vector3.normalized
正規化されたベクトルを返す
正規化:方向は同じで長さが1のもの
最後にプレハブにします
敵に撃たせる
敵のスクリプトにショット情報を追加
enum ShotType
{
NONE = 0,
AIM, // プレイヤーを狙う
THREE_WAY, // 3方向
}
[System.Serializable]
struct ShotData
{
public int frame;
public ShotType type;
public EnemyBullet bullet;
}
// ショットデータ
[SerializeField] ShotData shotData = new ShotData { frame = 60, type = ShotType.NONE, bullet = null };
GameObject playerObj = null; // プレイヤーオブジェクト
int shotFrame = 0; // フレーム
void Start()
{
// プレイヤーオブジェクトを取得する
switch (shotData.type)
{
case ShotType.AIM:
playerObj = GameObject.Find("player");
break;
}
}
// ショット処理(これをUpdateなどで呼ぶ)
void Shot()
{
++shotFrame;
if (shotFrame > shotData.frame)
{
switch (shotData.type)
{
// プレイヤーを狙う
case ShotType.AIM:
{
if (playerObj == null) { break; }
EnemyBullet bullet = (EnemyBullet)Instantiate(
shotData.bullet,
transform.position,
Quaternion.identity
);
bullet.SetMoveVec(playerObj.transform.position - transform.position);
}
break;
// 3方向
case ShotType.THREE_WAY:
{
EnemyBullet bullet = (EnemyBullet)Instantiate(
shotData.bullet,
transform.position,
Quaternion.identity
);
bullet = (EnemyBullet)Instantiate(shotData.bullet, transform.position, Quaternion.identity);
bullet.SetMoveVec(Quaternion.AngleAxis(15, new Vector3(0, 0, 1)) * new Vector3(-1, 0, 0));
bullet = (EnemyBullet)Instantiate(shotData.bullet, transform.position, Quaternion.identity);
bullet.SetMoveVec(Quaternion.AngleAxis(-15, new Vector3(0, 0, 1)) * new Vector3(-1, 0, 0));
}
break;
}
shotFrame = 0;
}
}
GameObject.Find(string name);
name と 一致する GameObject を検索して返す
アクティブなゲームオブジェクトのみ検索する
処理が重いため、Update 処理では呼ばない方が良い
Quaternion.AngleAxis(float angle, Vector3 axis)
axis を軸として angle 度回転するクォータニオンを作成する
今回はZ軸で15度回転するクォータニオンを作って、Vector3(-1, 0, 0) を回転させています
2Dゲームですが、回転の処理はzも使用します
敵オブジェクトの情報を設定する
あとは弾を撃たせたい敵の ShotData を設定するだけ!
サンプル動画
さいごに
敵が攻撃してくると画面が賑やかになりますね!
コメント
敵が弾を撃ってくれませんどうすればいいですか
詳細が分からないので、何とも言えないですが、プレイヤー狙いの弾だった場合 playerObj が null だと弾が作成されない状態になります。
なので、playerObj = GameObject.Find(“player”);でnullになっているかもです。
“player”部分は狙いたいオブジェクトの名前になるので、適宜修正が必要になります。