ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RPG 듀토리얼 09. Player Skill (CoolTime )
    유니티 프로젝트/RPG 듀토리얼

    안녕하세요.

    오늘은 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)

     

    댓글

김효겸 / Tel. 010-7735-0580 / E-mail. dollzzang2@hanmail.net