내일배움캠프 77일차 8/02 TIL + 영웅과 스킬 추가
작업 내용
영웅과 스킬 추가
플레이어의 유닛을 강화할 수 있게 진화된 버전인 영웅을 3가지 추가했다.
영웅은 보병, 궁수, 마법사 영웅이 있다.
보병은 쿨타임마다 강화된 공격을 하고, 궁수는 쿨타임마다 일정 시간 공격 속도가 증가한다. 마법사는 쿨타임마다 공격 시 공격된 지역을 불로 태우며 지나가는 적들에게 데미지를 주는 효과를 쓴다다.
using System.Collections;
using UnityEngine;
public class ActiveSkill : MonoBehaviour
{
public string Name { get; private set; }
public string Description { get; private set; }
public int SkillCoolTime;
[SerializeField] protected GameObject SkillEffect;
[SerializeField] protected UserUnit userUnit;
protected float damageMultiplier = 1.5f;
protected WaitForSeconds turnOffTime = new WaitForSeconds(0.6f);
public virtual void Setting()
{
}
public virtual void ActivateSkill()
{
TurnOnEffect();
StartCoroutine(TurnOffEffect());
}
protected virtual void TurnOnEffect()
{
SkillEffect?.SetActive(true);
}
protected virtual IEnumerator TurnOffEffect()
{
yield return turnOffTime;
SkillEffect?.SetActive(false);
EndSkillEffect();
}
protected virtual void EndSkillEffect()
{
}
}
스킬 구현을 위해 기반 클래스인 ActiveSkill
클래스를 만들었다.
기본적으로 필요한 클래스들을 받아오고, 쿨타임, 스킬 데미지 수치를 세팅한다. 그리고 스킬을 실행할 함수를 public
으로 두고 실행 시 기본적으로 애니메이션을 실행하고 일정 시간 뒤에 꺼지게 해준다.
이 함수는 AttackBehaviour
에서 호출되어 공격 시 쿨타임이 돌았으면 자동으로 발동된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SingleMeleeTargetSkill : ActiveSkill
{
private Vector3 effectOriginPosition;
private UnitType unitAttackType;
[SerializeField] private bool effectPositionToTarget;
public override void Setting()
{
base.Setting();
effectOriginPosition = SkillEffect.transform.position;
unitAttackType = userUnit.Stat.UnitAttackType;
}
public override void ActivateSkill()
{
base.ActivateSkill();
userUnit.Action.TargetEnemy.TakeDamage((int)(userUnit.Stat.Atk.TotalValule * damageMultiplier), unitAttackType);
}
protected override void TurnOnEffect()
{
if (effectPositionToTarget)
{
SkillEffect.transform.position = effectOriginPosition + userUnit.Action.TargetEnemy.transform.position;
}
base.TurnOnEffect();
}
}
상속자인 단일 타겟 스킬은 단순하게 이펙트가 발동될 위치를 설정해주고 스킬 이펙트 발동 후 데미지를 준다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SelfBuffSkill : ActiveSkill
{
[SerializeField] private float skillDuration;
[SerializeField] private StatType buffType;
[SerializeField] private float buffAmount;
private float originalStat;
private AttributeStat buffStat;
public override void Setting()
{
base.Setting();
turnOffTime = new WaitForSeconds(skillDuration);
switch (buffType)
{
case StatType.AttackSpeed:
buffStat = userUnit.Stat.AttackSpeed;
break;
}
}
public override void ActivateSkill()
{
base.ActivateSkill();
originalStat = buffStat.BaseValue;
buffStat.BaseValue = originalStat / buffAmount;
}
protected override void EndSkillEffect()
{
base.EndSkillEffect();
buffStat.BaseValue = originalStat;
}
}
자가 버프 스킬이다. 여기서는 애니메이션 지속 시간을 늘려주고 애니메이션을 버프형 애니메이션을 적용해준다. 그리고 지속 시간이 끝나면 꺼지게 해주고 스탯 유형에 따라 해당 스탯을 버프해준다. 스킬이 끝나면 스탯을 원래대로 되돌려준다. BaseValue
는 게임 시작 시 주어지는 고유 값으로 유저가 스탯을 업그레이드해도 BonusValue
에 추가될 것이기에 고정적으로 유지되어도 된다.
다음으로는 단일 타겟 원거리 스킬을 만들고 땅을 불태우는 지속 효과와 이펙트를 추가하면 된다.
public class SkillProjectileBehaviour : FireBalt
{
[SerializeField] private SkillEffect skillEffect;
protected override void DestroyThis()
{
GameObject skillEffectObject = UserData.Instance.SkillObjectPool.SpawnFromPool(skillEffect);
skillEffectObject.transform.position = transform.position;
skillEffectObject.SetActive(true);
base.DestroyThis();
}
}
기존에 파이어볼트를 상속받아 마지막에 파괴될 때 땅 불태우는 이펙트를 켜주고 사라진다.
public class ScorchedFloor : MonoBehaviour
{
private List<Enemy> enemies = new List<Enemy>();
private UnitType type = UnitType.Magic;
private WaitForSeconds waitForSeconds;
private SkillEffect effectType = SkillEffect.ScorchedFloor;
[SerializeField] private int damage;
[SerializeField] private float period;
[SerializeField] private float duration;
private void OnEnable()
{
waitForSeconds = new WaitForSeconds(period);
StartCoroutine(periodicDamage());
StartCoroutine(DisableEffect());
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Enemy"))
{
enemies.Add(collision.GetComponent<Enemy>());
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.CompareTag("Enemy"))
{
enemies.Remove(collision.GetComponent<Enemy>());
}
}
private IEnumerator periodicDamage()
{
while(true)
{
foreach (Enemy enemy in enemies)
{
enemy.TakeDamage(damage, type);
}
yield return waitForSeconds;
}
}
private IEnumerator DisableEffect()
{
yield return new WaitForSeconds(duration);
UserData.Instance.SkillObjectPool.ReturnObject(effectType, this.gameObject);
}
}
땅 태우기 이펙트는 일정 시간동안 지속되며 범위에 들어온 적을 주기적으로 데미지를 준다.
마무리
오늘은 영웅을 추가했다. 스킬 만들기는 처음 해봐서 막막했지만, 하나씩 기반 클래스와 단순 클래스부터 만들어가니 어렵지 않았다. 처음 만들어봐서 구조를 어떻게 짤지 고민이 되었는데, 다 만들고 나면 구조를 좀 더 고민해볼 가치가 있어 보인다. 추가로 팀원들이 미니맵과 스테이지 등을 추가해서 이제 게임에 필요한 기능들이 거의 완성되어간다. 다음 주가 기대된다.