private void OnTriggerEnter(Collider other)
{
// 장애물이 플레이어와 충돌
if (other.gameObject.CompareTag("Player"))
{
if (other.TryGetComponent<VanController>(out VanController vanController))
{
// 장애물에 맞는 이펙트 활성화
poolingManager.ActivateEffect(obstacleData.Id + 4, transform);
// 플레이어에게 영향
vanController.ObjectCollision(obstacleData);
}
// 충돌한 오브젝트는 비활성화
poolingManager.DeActivateObject(obstacleData.Id, this.gameObject);
}
}
소환되는 장애물에게 달려있는 Obstacle Manager
이는 플레이어와 충돌 시 일어나는 시스템을 관리해준다.
플레이어에게 영향을 주기 위해 VanController의 Object Collision 함수를 호출하고 해당 장애물의 데이터가 담긴 Obstacle Data를 전달해준다.
public void ObjectCollision(Obstacle obstacleData)
{
// 차의 속도와 부스터에 영향
vanEngine.AffectEngine(obstacleData);
// 차의 내구도와 콤보에 영향
crushManager.AffectVan(obstacleData);
combo = crushManager.UpdateCombo(obstacleData);
// 콤보가 5배수면 속도 증가
if (crushManager.IsMultiplesOfFive())
{
vanEngine.ComboSpeedUP();
}
// 현재 정보 업데이트
currentHP = crushManager.GetVanHP() / data.maxVanHP;
boosterAmount = vanEngine.GetBoosterAmount();
// UI 업데이트
NotifyObservers();
}
VanController는 Van의 엔진을 다루는 VanEngine << PlainClass >> ,
내구도와 콤보를 관리하는 CrushManager << Plain Class >> 등을 이용해 상태를 업데이트 한다.
public void AffectEngine(Obstacle obstacleData)
{
float damage = obstacleData.DamageVelocity;
if (damage <= 0.1f)
{
damage = 0.1f;
}
if (obstacleData.Id == 0)
{
// 라스트 스퍼트 상황이 아닌 경우 좀비랑 부딪힐때 부스터 저장
if (!lastSpurtActivate)
{
engineBoosterAmount += 0.025f;
}
else
{
vanStraightSpeed -= damage;
}
}
else
{
engineBoosterAmount -= 0.1f;
vanStraightSpeed -= damage;
}
}
public void AffectVan(Obstacle obstacleData)
{
if (obstacleData.Id == 0)
{
// 라스트 스퍼트 상황일때
if (lastSpurtActivate)
{
currentHP -= obstacleData.DamageHp;
}
}
else
{
currentHP -= obstacleData.DamageHp;
}
}
그리고 옵저버 패턴을 이용해 UI를 업데이트 한다.
public override void Notify(Subject subject)
{
if (vanController == null &&
subject.TryGetComponent<VanController>(out VanController _vanController))
{
vanController = _vanController;
}
// 콤보 업데이트
if (vanController.Combo > 0)
{
comboText.text = $"COMBO {vanController.Combo}";
if (comboText.gameObject.TryGetComponent<Animation>
(out Animation comboTextAnimation))
{
comboTextAnimation.Play();
}
Debug.Log("Hit");
}
else
{
comboText.text = "";
}
// 체력 UI 업데이트
hpImage.fillAmount = vanController.CurrentHP;
boosterImage.fillAmount = vanController.BoosterAmount;
}
Obstacle Data를 이용해 각 스크립트에서 상황에 맞는 작업을 해줌으로써 Scriptable Object 활용을 하여 상태 업데이트를 해주는 것이다.