이번에는 스킬을 구현할 계획인데, 플레이어 입장에서 상황에 따라 장착할 스킬 또는 해제할 스킬이 있을 것이다.
조작법은 Z로 공격키 X, C, V로 스킬을 다양하게 장착하고 사용할 구상이다.
먼저 플레이어에 어울려보이는 스킬을 구현해보자
참격
플레이어가 검을 소지한 상태로 스킬을 사용하면 베는 효과를 내어 적에게 대미지를 주는 효과를 구현한다.
참격이 나가면 참격하는 효과가 나타나고 일정 시간이 지나면 파티클로 사라지는 효과를 나타냈다.
참격을 프리팹으로 구현한 이유는 플레이어가 착용한 스킬을 사용 및 해제하기위해 스킬 로드를 하여 원하는 스킬이 나가게 했다.
여기서 코드를 보자면
using UnityEngine;
public class ChamGyukSkill : BaseSkill
{
//스킬을 종류별로 나눌까?
[SerializeField] private ActiveSkill skillData;
private Vector2 spawnPos; //시작 위치
private float maxDistance = 3f; //최장 거리
private float particleTime = 0f; //파티클 지속시간
private void Start()
{
//쿨타임 설정
CoolTime = 2f;
//초기 설정
spawnPos = transform.position;
trigger.enabled = true;
particle.Stop();
particleTime = 0f;
}
private void Update()
{
//한정거리보다 넘어가면
if (Vector2.Distance(spawnPos, transform.position) > maxDistance)
UseParticle();
}
private void FixedUpdate()
{
//rgdby를 제어하기 위해
rgdby.AddForce(Vector2.left, ForceMode2D.Force);
}
private void OnTriggerEnter2D(Collider2D collision)
{
//캐릭터와 충돌했을 때 해당 레이어에서 다음 매서드를 수행한다.
if (collision.gameObject.layer.Equals(LayerMask.NameToLayer("Player")) ||
collision.gameObject.layer.Equals(LayerMask.NameToLayer("Enemy")))
{
UseTrigger();
UseParticle();
}
//상대에게 닿으면 상대.hp -= skillData.Damage;
}
//인터페이스 함수
public override void UseParticle() //참격이 끝나면 파티클로 부서지는 효과
{
rgdby.velocity = Vector2.zero;
if (!particle.isPlaying)
{
particle.Play();
sprite.enabled = false;
}
else
{
particleTime += Time.deltaTime;
if (particleTime > 0.5f)
gameObject.SetActive(false);
}
}
public override void UseTrigger() //참격의 피격을 유효화
{
}
public override void ShowSkillInfo() //파라미터는 해당 UI로 받게 (정보 표시용)
{
//이름
//설명
//아래 속성들이 1 이상일 때 표시
//예) 공격(+5)
}
}
BaseSkill이라는 클래스를 상속받았는데
using UnityEngine;
public interface ISkill
{
public void UseParticle();
public void UseTrigger();
public void ShowSkillInfo();
}
public class BaseSkill : MonoBehaviour, ISkill
{
public float CoolTime = 1f; //쿨타임
public float CurrentCoolTime = 0f;
public string Tag { get; set; } //플레이어나 적이 사용할 때
[SerializeField] protected ParticleSystem particle;
[SerializeField] protected BoxCollider2D trigger;
[SerializeField] protected Rigidbody2D rgdby;
[SerializeField] protected SpriteRenderer sprite;
public virtual void UseParticle() { }
public virtual void UseTrigger() { }
public virtual void ShowSkillInfo() { }
}
ISkill이라는 인터페이스로 필요한 트리거, 파티클, 스킬 정보를 포함하고 BaseSkill의 필드로는 파티클, 콜라이더, 리지드바디, 스프라이트 렌더러를 protected로 하위 클래스에게 사용하게 했고(각 스킬 클래스에서 하면 수정하기 복잡할수도 있으니까) 쿨타임 설정으로 사용할수 있는지를 구현하였다. 그리고 Tag는 "Player"와 "Enemy"로 구분할 것인데(바뀔수 있음) 스킬의 Tag가 Player라면 적에게 대미지를 입히고 Enemy면 플레이어에게 대미지를 입히는 식으로 구분자로 설정하였다.
다른 스킬도 구현했는데 거의 BaseSkill에 상속받았다.
다른 스킬도 구현했는데 BaseSkill로 받아서 설정하였다. 패시브 스킬의 경우에는 Trigger와 Rgdby, Sprite가 없어서 비워놨고 스크립트 안에서는 이들을 사용하지 않았다.
추가로 SkillData가 개별 클래스 안에 있는데 SO파일을 불러와서 설정했다. 참고로 SO는 공격, 대미지, 속도 등의 수치값을 관리하였다.
by 스파르타 코딩클럽
'개발 TIL' 카테고리의 다른 글
7/17 부트캠프 개발 TIL (적 인터랙션 버그) (0) | 2024.08.01 |
---|---|
7/16 부트캠프 개발 TIL (맵 전환하기) (0) | 2024.08.01 |
7/12 부트캠프 개발 TIL (게임에서 필요한 요소) (0) | 2024.07.19 |
7/11 부트캠프 개발 TIL (적 구현하기 3) (1) | 2024.07.18 |
7/10 부트캠프 개발 TIL (적 구현하기 2) (0) | 2024.07.18 |