본문 바로가기
게임 개발

[Unity] 보스 키우기 (5) - 버프 몬스터

by chobbo 2024. 6. 25.

 

 

EnemyBuffState.cs

using System.Collections.Generic;
using UnityEngine;

public class EnemyBuffState : CharacterBaseState
{
    private EnemyStateMachine eStateMachine;
    private Enemy enemy;
    private bool bIsPlayed = false;
    private bool bIsBuffed = false;

    public EnemyBuffState(CharacterStateMachine stateMachine) : base(stateMachine)
    {
        eStateMachine = stateMachine as EnemyStateMachine;
        enemy = eStateMachine.Character as Enemy;
    }
    public override void Update()
    {
        base.Update();
        Buff(); 
    }

    void Buff()
    {
        if (!bIsPlayed)
        {
            enemy.Animator.SetTrigger(eStateMachine.Character.AnimationData.BuffParameterHash);
            bIsPlayed = true;
        }
        float nomalizedTime = GetNormalizedTime(enemy.Animator);
        if (!bIsBuffed && nomalizedTime > stateMachine.Data.BaseAtkTransitionTime)
        {
            ApplyBuff();
            bIsBuffed = true;
        }
        if(nomalizedTime >= 1)
        {
            bIsPlayed = false;
            bIsBuffed = false;
            eStateMachine.ChangeState(eStateMachine.IdleState);
        }
    }

    void ApplyBuff()
    {
        List<Enemy> enemyList = GameManager.Instance.Stage.SpawnEnemyList;

        BuffEffect buffAreaEffect = GameManager.Instance.Pool.SpawnFromPool(EPoolObjectType.BuffAreaEffect).ReturnMyComponent<BuffEffect>();
        buffAreaEffect.SetPosition(enemy);

        foreach (Enemy em in enemyList)
        {
            em.Health.Heal(enemy.Stat.HealAmount);
            enemy.Buff.IncreaseAttackPower(em, enemy.Stat.IncreaseAttackPowerAmount);

            BuffEffect buffEffect = GameManager.Instance.Pool.SpawnFromPool(EPoolObjectType.BuffEffect).ReturnMyComponent<BuffEffect>();
            buffEffect.SetPosition(em);
        }
        enemy.Buff.AlreadyBuffed();
    }

    float GetNormalizedTime(Animator animator)
    {
        AnimatorStateInfo currentInfo = animator.GetCurrentAnimatorStateInfo(0);

        if (!animator.IsInTransition(0))
        {
            float result = currentInfo.normalizedTime;
            return result;
        }
        else
        {
            return 0f;
        }
    }
}

 

 

EnemyBuff.cs

using System.Collections;
using UnityEngine;

public class EnemyBuff : MonoBehaviour
{
    [SerializeField] private float buffCoolDown;

    public bool IsAlreadyBuffed { get; private set; }

    private float curBuffCoolDown;

    private void OnEnable()
    {
        curBuffCoolDown = buffCoolDown;
        IsAlreadyBuffed = true;
    }

    private void Update()
    {
        if (IsAlreadyBuffed)
        {
            curBuffCoolDown -= Time.deltaTime;
            if (curBuffCoolDown <= 0)
            {
                curBuffCoolDown = buffCoolDown;
                IsAlreadyBuffed =false;
            }
        }
    }

    public void IncreaseAttackPower(Enemy enemy, float amount)
    {
        enemy.Stat.AttackDamage += amount;
    }

    public void AlreadyBuffed()
    {
        IsAlreadyBuffed = true;
    }
}

 

BuffEffect.cs

using System.Collections;
using UnityEngine;

public class BuffEffect : PoolObject
{
    private Enemy target;

    private void Update()
    {
        if(target != null)
        {
            // 처리 안해주면 넉백 시 버프가 허공에 뜸
            transform.position = target.transform.position + Vector3.up;
        }
        if(target.Health.IsDie)
        {
            gameObject.SetActive(false);
        }
    }

    public void SetPosition(Enemy enemy)
    {
        target = enemy;
    }
}