概要
前回の記事のプロジェクトをベースに敵を追加します。
次回以降にプレイヤーのライフゲージを作成するため、簡単なダメージ処理も同時に追加します。
この環境で追加した内容を以下の通りです。
- 敵(障害物)オブジェクトの追加
- 敵との接触時にプレイヤーのライフを減算する処理
- 敵との接触時にプレイヤーを後方に弾く処理
- 敵との接触時にプレイヤーを白く点滅させ被弾状況を知らせる処理
手順

ソースコード
Enemy.cs
public class Enemy : MonoBehaviour
{
void Update ()
{
// 親オブジェクトを取得してY軸回転させる
GameObject parent = transform.root.gameObject;
parent.transform.Rotate (new Vector3 (0, 45, 0) * Time.deltaTime);
}
void OnTriggerEnter (Collider other)
{
// プレイヤーだった場合、ダメージ処理を呼び出す
if (other.gameObject.CompareTag ("Player"))
{
Player player = other.gameObject.GetComponent<Player> ();
player.TakeDamage (10);
}
}
}
Player.cs
public class Player : MonoBehaviour
{
// 変更がない箇所は省略
Renderer m_Renderer;
int hp = 100; // ライフ
void Awake ()
{
m_Renderer = GetComponentInChildren<Renderer> ();
}
public void TakeDamage (int damage)
{
// ライフ減算
hp -= damage;
// プレイヤーの進行方向とは逆に弾く処理
// 仮の値なので反発係数はマジックナンバーとして許容する
m_Rigidbody.AddForce (transform.forward * -60f, ForceMode.Impulse);
// 点滅によるダメージ演出
StartCoroutine (Blink ());
}
private IEnumerator Blink ()
{
// 変更前のマテリアルのコピーを保存
var original = new Material (m_Renderer.material);
// キーワードの有効化する
m_Renderer.material.EnableKeyword ("_EMISSION");
// 白色に光らせる
m_Renderer.material.SetColor ("_EmissionColor", new Color (1, 1, 1));
// 0.1秒待機して元の色に戻す
yield return new WaitForSeconds (0.1f);
m_Renderer.material = original;
}
}
まとめ
0.1秒後にプレイヤーの色を白から元の色に戻す処理でコルーチンを使用しています。
Java(≒Android)では標準で用意されていないので、初めて使用しましたが本当に便利ですね。
今回は実装に至っていませんが、以下の拡張の余地を残しています。
- 敵(障害物)オブジェクトの移動処理
- 敵の自動ポップ処理
- 敵の攻撃処理
ソースコードはGitHubにアップロードしています。