Menu
CoddyTech

ボス戦

CoddyのUnityジャーニー「Unityにおけるゲームアーキテクチャ」セクションの一部。レッスン 50/50。

石のゴーレムが闘技場の出口の門を守っています。ゴーレムはあなたに向かって踏み鳴らしながら近づき、近づくと一瞬こぶしを振り上げて地面を叩きます。そのとき、まだ近くにいるとダメージを受けます。叩いた後は休み、その間だけ剣でダメージを与えられます。歩いている間や攻撃の構えをしている間は、石の皮膚があらゆる攻撃をはね返します。色は行動を示しています。歩いているときは灰色、構えているときは赤、休んでいるときはシアンです。体力を0にすると門が開きます。画面上部のバーは、攻撃を受けるたびに変化します。

各状態をクラスとして実装し、ステートマシンでゴーレムの脳を作成しましょう。Bossと、BossStates.cs内のChaseState、WindupState、RestStateを実装します。プレイヤー、体力バー、門、IState、StateMachine、IDamageableは用意されています。

challenge icon

チャレンジ

難しい

InspectorでBossにplayer、speed (2)、slamRange (2.5)、windupTime (1)、restTime (2)、slamDamage (2)、maxHealth (6)を設定し、onDefeated UnityEventをGateのOpenに接続します。PlayerDistance()とTint(color)は用意されています。

  • BossはIDamageableを実装します。Awakeでは体力をmaxHealthに設定し、StateMachineと3つの状態を作成して、publicフィールドmachine、chase、windup、restに保持します(各状態のコンストラクターにはbossを渡します)。Startでは体力とmaxHealthを使ってHealthChangedを発行し、chaseから開始します。毎フレーム、machineを更新します。
  • ChaseState:ゴーレムをColor.grayに色付けし、地面に沿ってspeedでプレイヤーに向かって歩かせます。プレイヤーがslamRange内に入ると、windupに切り替わります。
  • WindupState:ゴーレムをColor.redに色付けし、windupTime秒間その場に立たせます。その後、Slam!をログに出力し、プレイヤーがまだslamRange内にいれば、プレイヤーのIDamageableを通じてslamDamageを与え、restに切り替わります。
  • RestState:ゴーレムをColor.cyanに色付けし、restTime秒間待ってからchaseに戻ります。windupとrestは毎回、設定された時間いっぱい続きます。
  • TakeDamageは、ゴーレムがrest状態で、まだ倒れていない間だけダメージを受け付けます。受けた量を体力から差し引き、HealthChangedを発行します。体力が0になると、The golem fallsをログに出力し、onDefeatedを呼び出して、自身を無効化します。

Playを押し、スラムを避けて休んでいる間に攻撃し、その後Checkを押してください。

自分で試してみよう

using System;
using UnityEngine;
using UnityEngine.Events;

public class Boss : MonoBehaviour
{
    public Transform player;
    public float speed = 2f;
    public float slamRange = 2.5f;
    public float windupTime = 1f;
    public float restTime = 2f;
    public int slamDamage = 2;
    public int maxHealth = 6;

    public event Action<int, int> HealthChanged;
    public UnityEvent onDefeated;

    // 地面に沿って測ったプレイヤーまでの距離。
    public float PlayerDistance()
    {
        Vector3 d = player.position - transform.position;
        d.y = 0f;
        return d.magnitude;
    }

    // 歩いている間は灰色、攻撃の準備中は赤、休んでいる間はシアン色。
    public void Tint(Color color)
    {
        GetComponent<Renderer>().material.color = color;
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityにおけるゲームアーキテクチャのすべてのレッスン