敵機の動きが単調すぎるので、もう少しいろんな動きを追加したいなと思います。
敵機の動きに変化を付ける
敵機の回転
現在のところ、敵機の動きは下のコードになっています。
rb.linearVelocity = transform.up * speed;
これは、オブジェクトが向いている方向に進むことを表しています。今は敵機は下を向いているので、下方向に向かって真っ直ぐに進んでいます。そこで、敵機を回転させれば、回転した方向に敵機を進ませることが出来ます。オブジェクトを回転させるのは、以下のコードで実現できます。
transform.Rotate(x軸の回転角度, y軸の回転角度, z軸の回転角度);
2Dのゲームの場合、x軸とY軸は回転させることはないので、0になります。
考えなければいけないのは、どのタイミングでどれだけ回転させればいいのかということです。そこで、Enemyクラスにタイマーを持たせることにします。タイマーと言っても、Update関数が1回呼ばれる度に1増やすだけの簡単な整数の変数です。※60fpsの場合、1秒間に60増加します。
int lifeTime = 0; //生成されてからUpdate関数が何回呼ばれたかをカウントするタイマー
・・・途中省略・・・
void Update()
{
lifeTime++; //1ずつ増やす
}
lifeTimeの値を見て、回転させるタイミングを図ることにします。
lifeTime++; //1ずつ増やす
if (lifeTime % 10 == 0){
transform.Rotate(0f, 0f, 0.5f);
}
%は剰余演算子と言って、右側の数値で割った余りを計算します。上記のコードはlifeTimeが10で割り切れる場合(10の倍数の場合)オブジェクトを反時計回りに0.5度回転させます。これにより、Updateが10回呼ばれるごとに(毎回だと回転が速すぎるので)、オブジェクトが少し傾きます。
このまま実行すると、オブジェクトは回転しますが、進行方向は変わりません。つまり回転しながら真っ直ぐ落ちていくことになります。そこで、向きを変えたときは進行方向を変えるようにします。具体的には、rb.linearVelocity = transform.up * speedを、向きを変えたときにも実行するようにします。
using UnityEngine;
public class Enemy : MonoBehaviour
{
//このクラスの変数など
Rigidbody2D rb;
const float speed = 1f;
int lifeTime = 0; //生成されてからUpdate関数が何回呼ばれたかをカウントするタイマー
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
rb = GetComponent<Rigidbody2D>();
rb.linearVelocity = transform.up * speed;
}
// Update is called once per frame
void Update()
{
lifeTime++; //1ずつ増やす
if (lifeTime % 10 == 0){
transform.Rotate(0f, 0f, 0.5f);
rb.linearVelocity = transform.up * speed; //向きを変えた後はオブジェクトの向いている方向に進行方向を変更する
}
if (transform.position.y < -6)
{
Destroy(gameObject);
}
}
void OnTriggerEnter2D(Collider2D collision)
{
Destroy(gameObject);
}
}

敵機が曲がってくるようになりました。しかし、画面の右の方から出てきた場合は、左に向かって曲がってほしいものです。ついでに、変更する角度も変数にしておきます。生成されたオブジェクトのx座標を調べて、x座標が0より大きい場合は真ん中より右にあるので、回転の角度を反転(0.5度の場合は-0.5度)させます。これにより左に曲がるようになります。
using UnityEngine;
public class Enemy : MonoBehaviour
{
//このクラスの変数など
Rigidbody2D rb;
const float speed = 1f;
public float roll = 0.5f;
int lifeTime = 0; //生成されてからUpdate関数が何回呼ばれたかをカウントするタイマー
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
rb = GetComponent<Rigidbody2D>();
rb.linearVelocity = transform.up * speed;
if (transform.position.x > 0) roll = -roll;
}
// Update is called once per frame
void Update()
{
lifeTime++; //1ずつ増やす
if (lifeTime % 10 == 0){
transform.Rotate(0f, 0f, roll);
rb.linearVelocity = transform.up * speed; //向きを変えた後はオブジェクトの向いている方向に進行方向を変更する
}
if (transform.position.y < -6)
{
Destroy(gameObject);
}
}
void OnTriggerEnter2D(Collider2D collision)
{
Destroy(gameObject);
}
}

今回はここまでです。お疲れ様でした。
コメント