플레이어와 Scriptable Object 상호작용

devKyoun·2024년 11월 1일
0

Unity

목록 보기
23/27

Obstacle Manager

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를 전달해준다.


VanController 의 ObjectCollision

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 >> 등을 이용해 상태를 업데이트 한다.

VanEngine

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;
    }

}

CrushManager

public void AffectVan(Obstacle obstacleData)
{
    if (obstacleData.Id == 0)
    {
        // 라스트 스퍼트 상황일때
        if (lastSpurtActivate)
        {
            currentHP -= obstacleData.DamageHp;
        }
    }
    else
    {
        currentHP -= obstacleData.DamageHp;
    }
}

그리고 옵저버 패턴을 이용해 UI를 업데이트 한다.

VanUIUpdater

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 활용을 하여 상태 업데이트를 해주는 것이다.

profile
Game Developer

0개의 댓글