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;
}
}
'게임 개발' 카테고리의 다른 글
Enemy가 웨이포인트 주변에서 부르르 떨리는 이슈 (0) | 2024.07.19 |
---|---|
[Unity] 보스 키우기 (6) - 완성 (0) | 2024.06.26 |
[Unity] 보스 키우기 (4) - 원거리 몬스터 (0) | 2024.06.23 |
[Unity] 보스 키우기 (3) - 코루틴 최적화 (0) | 2024.06.21 |
[Unity] 보스 키우기 게임 (2) - FSM (0) | 2024.06.20 |