-
안녕하세요.
오늘은 Player의 스킬 중에서 CoolTime을 먼저 보겠습니다.
공격 스킬 구성은 총 4가지가 존재하며
1. 파이어볼
가장 기본 스킬로 불이 나가며 공격을 합니다.
2. 애로우 샷
기를 모아 화살이 나가며 관통이 됩니다.
3. 블랙홀
적 들을 기절 시킵니다.
4. 힐
에너지를 채워 줍니다
기본 공격 / 슬라이딩
두 가지가 존재합니다.
각 이미지는 두 개를 겹쳐 놓은 뒤
앞에 있는 Image의 Type을 Fillde의 radial 360으로 주어 쿨타임이 시각화를 더 해 주었습니다.
이렇게 만들어 준 이유는 바로 쿨타임을 적용하기 위해서 입니다.
이 이미지가 Fill Amount를 이용해 쿨타임이 적용된 것처럼 시각적인 효과를 보이는 코드를 보겠습니다.
스킬의 기본 정보를 새로운 스크립트 SkillBtn을 생성하여 담아주었습니다.
변수 선언 부분부터 보겠습니다.
SkillName : 스킬의 이름입니다.
coolDown : 쿨 다운입니다?
쿨 타임의 시간을 맞추기 위해 지정된 시간을 빼줄 변수입니다.
coolTime : 쿨 타임입니다.
스킬의 지정된 시간입니다. 게임 상에서는 이 시간이 초과되어야 스킬을 재 사용할 수 있습니다.
cdImg : 지정된 이미지의 Fill Amount를 사용할 것입니다.
cool : 쿨타임 중인지 체크할 불 변수입니다.
coolTime_Text : 쿨타임의 시간을 시각적으로 나타내 주기 위한 Text입니다.
TextMeshProUGUI를 사용하였으며 using TMPro 네임 스페이스를 선언해 주었습니다.
castingTime : 캐스팅 타임입니다.
각 스킬 중에는 캐스팅 타임을 거쳐야 스킬이 발동되게 구현하였습니다.
skillObj : 사용될 스킬 오브젝트입니다.
미리 생성해 두었던 오브젝트를 SetActive(true) 활성화를 해주어
새로 생성된 것처럼 구현 동작을 하기 위함입니다.
//
반대로 스킬이 적에게 맞거나 일정 시간이 지나면 SetActive(false)로 비활성화가 되며
스킬 중 이동하는 스킬이 있다면 원래 위치로 돌아가게 됩니다.
public으로 선언하여 인스펙터 창에서 조절을 가능하게 해 주었고
시간 계산 부분에 있어서 테스트를 쉽게 할 수 있게 하였습니다.
이 스크립트는 Skill을 만들었던 UI 항목에 붙어줄 것이기에
OnBttonColick 이벤트를 활용할 함수를 만들어 주었습니다.
4개의 공격 스킬 / 슬라이드 / 기본 공격
으로 총 6개의 함수가 구현이 되어 있습니다.
0번 공격 스킬 0번 스킬 UI 버튼을 클릭하면 발생할 OnClickBtn 함수입니다.
if(cool == false &&! Manager.instance.playerController.onCasting) 조건문을 걸어주어
cool == false : 쿨타임 중이 아닐 시 체크할 불 변수
&& 그리고
onCasting 캐스팅 중인지 확인할 불 변수
즉 쿨타임과 캐스팅 중이 아닐 시의 조건을 걸어
스킬을 사용 후 쿨타임 대기 중이라면 스킬을 재 사용 못하게 했습니다.
cool = true : 스킬을 사용했으니 바로 true로 바꿔주었습니다.
(중복 방지를 하기 위함입니다.)
이후 StartCoroutined으로 코 루틴 함수 ("CoolDown")를 실행해 주며
playerController에 있는 Casting(castingTime, skillObj) 함수를 실행합니다.
playerController의 Casting 함수는 인자로 (시간과 오브젝트)를 받습니다.
이에 캐스팅 시간과 사용할 스킬 오브젝트를 넣어주었습니다.
스킬 사용을 UI항목인 버튼에서 시각적으로 보기 위한 CoolDown 코 루틴 함수를 보겠습니다.
코루틴 함수 CoolDown은 간단합니다.
실행이 되면 cooldown을 0으로 초기화를 해주며
Time.deltaTime은 += 연산자로 1초씩 누적시켜줍니다.
여기서 *1을 한 이유는, 아직 원인은 찾지 못했지만 아래 보시면
if(cooldown >= coolTime)의 조건문이 있습니다.
이 조건문에 성립을 하는데도 cooldown이 if문에 들어오지 못하고
값이 계속 오르는 증상이 있었습니다. (잘 될 땐 잘 되고..)
자체적인 오류인지 무언갈 빠트리고 있는 건지는 아직 파악이 안 됐습니다...
찾게 되면 바로 수정을 올리겠습니다. (기필코 찾겠습니다)
이후 받아온 cdImg의 fillAmount를 이용해 cooldown / coolTime으로
0.0f ~ 1.0f까지의 값을 받아 적용해 주었습니다.
(fillAmount의 값은 0부터 최대 1 값입니다)
쿨타임의 현재 시간을 알려줄 Text는 SetActive(true)로 활성화를 해 주었고
이 Text의 text는 coolTime - cooldown의 :0을 해주어 자릿수를 한자리로 지정해 주었습니다.
쿨 다운이 계속 누적이 된다면 fillAmount의 최댓값인 1이 넘어 서기에
//
if(cooldown >= coolTime) : cooldown이 coolTime 이상이라면
쿨타임의 현재 시간을 알려줄 Text는 SetActive(false)로 비 활성화를 해 주고
cool = false로 현재 쿨타임 중이 아니라고 지정해 주었습니다.
마지막으로 스킬을 사용 후 / 쿨타임이 다 될 때까지 기다렸으니 StopCoroutine을 이용해
"CoolDown" 코 루틴 함수를 중지시켜 주었습니다.
//
나머지 각 스킬들의 OnClick Event 함수들입니다.
현재 기능은 같기에 따로 설명은 안 드렸지만
각 개별적인 스킬이니 혹시 모를 추가 작업이나 수정에 대비해
나누어 놓았습니다.
//
-- 추가적으로 궁금해 하시는 분이 계셔서 --
스킬 버튼에 SkillBtn을 입힌 인스펙터 창 모습입니다.
//
00 : 29초 다음 글에선 이어서 casting 이 적용되는 모습과 Skill을 사용하는 코드를 보겠습니다!!
요즘 이래 저래 정신이 너무 없어서.. 블로그 작업이 무뎌지는 것 같습니다.
자소서에.. 프로젝트들에.. 공부에.. 재미도 있지만 그와 별개로 체력이 조금씩 떨어지는 걸 느끼고 있습니다.
다들 소소하게 스트레칭이라도 꾸준히 해주시면 좋을 것 같습니다.
뭐든 체력이 뒷받침이 안되면 말짱 꽝인 것 같습니다.. (R.E.A.L)
'유니티 프로젝트 > RPG 듀토리얼' 카테고리의 다른 글
RPG 듀토리얼 11. Player Skill (Skill 00 & Calulate) (0) 2022.04.22 RPG 듀토리얼 10. Player Skill (Casting) (0) 2022.04.22 RPG 듀토리얼 08. Monster(Enemy) AI & Attack (0) 2022.04.21 RPG 듀토리얼 07. Monster(Enemy) Target_Box (0) 2022.04.20 RPG 듀토리얼 06. Item equip (0) 2022.04.20