Unity 2D 스킬 구현

2025. 7. 19. 02:36·유니티 개발/사이드 뷰 게임

이번 글에서는 스킬을 어떻게 구현 한 것을 정리 하였습니다.

 

일단 전글에서 스킬 UI를 구현 하였습니다. 이번 글은 그 UI를 클릭 하였을 때 스킬이 등록 되는 것 부터

스킬 사용까지 구현을 한 것을 정리 해보겠습니다.

 

먼저 전 글에서 생성했던 스킬 선택 UI에서 버튼을 추가합니다.

버튼을 추가한후 클릭을 했을때 이벤트와 애니메이션을 추가 하였습니다.

    void clickEvent()
    {
        //여기에 넣을꺼나 전달할거 추가
        RectTransform rect;
        rect = GetComponent<RectTransform>();
        evnetMoveObj.GetComponent<SCUClickEventObj>().startMove(rect.anchoredPosition);
        GameManager.Instance.SetPlayerSkill(skillCard);

        //닫기
        GameObject ui;
        ui = GameObject.Find("UI_Canvas");
        ui.GetComponent<UIManager>().closeStateCard();
        gameObject.SetActive(false);

    }

 

클릭을하면 클릭 안된 UI는 밑으로 내려가고 클릭이 된 UI는 오브젝트 생성 후 오른쪽 끝으로 이동후 사라지도록 만들었습니다.

그리고 왼쪽 아래에 클릭한 스킬이 나오도록 만들었습니다. 왼쪽 아래의 이미지는 UI쪽에 

    public void SetSkillImg(Sprite Img)
    {
        SkillImg.sprite = Img;
    }

간단하게 구현 해보았습니다

이제 스킬을 구현한것을 설명해보겠습니다.

먼저 스킬 3개를 구현을 하였습니다

첫번째는 검에서 불 이팩트가 나오는 스킬 입니다

이 스킬 같은 경우에는 기본 공격 + 이펙트를 추가한 스킬 입니다

//업데이트
if(Input.GetKeyDown(KeyCode.Q) && !attacking &&
     playerState != PlayerState.jump && !jumping && !rolling)
     {
         if(skill.PlayerSkill == PlayerSkill.Cuting)
          {
             playerState = PlayerState.skill;
          }
      }
      
   //--   
    private void SkillAttack()
    {
        if (delayStart || skillOn)
            return;
            
        if (skill.PlayerSkill == PlayerSkill.Cuting && !skillOn)
        {
            animator.SetTrigger("Skill");
            animator.speed = 0.65f;
            skillOn = true;
        }
    }

여기에서 animator.speed 는 애니메이션 속도를 말하며 1이 정상 속도 입니다.

이렇게 구현을 하였습니다 

두번째 스킬은 십자가가 나와 플레이어를 회복 시켜주는 스킬입니다

 

    private void spawnSkill()
    {
        if (skill.PlayerSkill == PlayerSkill.HolyCross)
        {

            Vector2 playerPos = transform.position;
            playerPos.y += 1.93f;

            GameObject clone = Instantiate(TestSkill, playerPos, transform.rotation);
            SpawnSkill spawn = clone.GetComponent<SpawnSkill>();
            if (spawn != null)
            {
                spawn.StartSkill(skill);
            }
            ui.GetComponent<UIManager>().CallDonwSkill(4.0f);
            playerState = PlayerState.idle;
            animator.SetBool("Move", false);
        }
    }

스폰 스킬이기 때문에 스폰용 오브젝트를 따로 만들었습니다.

 

public void StartSkill(PlayerSkillData setData)
{
    if (animator == null)
        animator = GetComponent<Animator>();
    skillData = setData;

    switch(skillData.PlayerSkill)
    {
    case PlayerSkill.HolyCross:
        animator.SetTrigger("HolyStart");
        StartCoroutine(SkillContinuing());
        break;
    }      
}

private void OnTriggerStay2D(Collider2D other)
{

    if (skillData.PlayerSkill == PlayerSkill.HolyCross)
    {
        if (other.CompareTag("Player"))
        {
            other.GetComponent<PlayerMove>().Healing(0.5f);
        }
    }
}

IEnumerator SkillContinuing()
{
    yield return new WaitForSeconds(15.0f);
    animator.GetComponent<Animator>().SetTrigger("HolyEnd");
    SkillEnd();
}

이제 이것을 모두다 오브젝트 생성 및 넣으면 두번째 스킬이 작동이 됩니다

 

3번재 스킬은 적에게(양쪽에 1개씩 총 2개) 번개를 소환하는 스킬입니다

이 스킬은 주변에 적이 있는지 확인을 해야 하기때문에 레이케스트를 이용하였습니다.

//Player 
if (skill.PlayerSkill == PlayerSkill.Thunder)
{
    TRay();
    for (int i = 0 ; i < ThinderHitList.Count; i++)
    {
        Vector2 spawnPoint = ThinderHitList[i].transform.position;
        spawnPoint.y += 0.67f;
        GameObject clone = Instantiate(TestSkill, spawnPoint, transform.rotation);
        SpawnSkill spawn = clone.GetComponent<SpawnSkill>();
        if (spawn != null)
        {
            spawn.StartSkill(skill);
        }
    }
    ThinderHitList.Clear();
    playerState = PlayerState.idle;
    animator.SetBool("Move", false);
}

private void TRay()
{

    int monsterLayer = LayerMask.GetMask("Monster");

    RaycastHit2D hit1 = Physics2D.Raycast(transform.position, Vector2.left, 4f, monsterLayer);
    RaycastHit2D hit2 = Physics2D.Raycast(transform.position, Vector2.right, 4f, monsterLayer);

    Debug.DrawRay(transform.position, Vector2.left * 4f, Color.red);
    Debug.DrawRay(transform.position, Vector2.right * 4f, Color.red);

    if (hit1.collider != null && hit1.collider.CompareTag("Monster"))
        ThinderHitList.Add(hit1.collider.gameObject);

    if (hit2.collider != null && hit2.collider.CompareTag("Monster"))
        ThinderHitList.Add(hit2.collider.gameObject);
}

//스킬 쪽 StartSkill 스위치 문에 추가
case PlayerSkill.Thunder:
    animator.SetTrigger("ThunderStart");
    gameObject.transform.localScale = new Vector3(2.0f, 2.0f, 2.0f);
    gameObject.GetComponent<BoxCollider2D>().size = new Vector2(1.5f , 1.5f);
    gameObject.GetComponent<BoxCollider2D>().enabled = false;
    break;

이렇게 추가 하면 레이케스트에 몬스터라는 타입의 오브젝트가 충돌했을때 번개가 떨어지는 스킬이 나갑니다.

'유니티 개발 > 사이드 뷰 게임' 카테고리의 다른 글

Unity 2D 보스 - 기본 움직임 , 기본 공격  (0) 2025.07.19
Unity 2D 스킬 쿨 타임  (0) 2025.07.19
Unity 2D 플레이어 스킬 UI 구현  (0) 2025.07.18
Unity 2D 게임 UI- 아이템 설명 구현 및 상태 창 구현  (0) 2025.07.18
Unity 2D 게임 아이템 구현  (0) 2025.07.18
'유니티 개발/사이드 뷰 게임' 카테고리의 다른 글
  • Unity 2D 보스 - 기본 움직임 , 기본 공격
  • Unity 2D 스킬 쿨 타임
  • Unity 2D 플레이어 스킬 UI 구현
  • Unity 2D 게임 UI- 아이템 설명 구현 및 상태 창 구현
dove-dove
dove-dove
dove-dove 님의 블로그 입니다.
  • dove-dove
    dove-dove 님의 블로그
    dove-dove
  • 전체
    오늘
    어제
    • 분류 전체보기 (38)
      • 유니티 개발 (38)
        • 팀 포트폴리오 - 슈퍼 마리오 (7)
        • 사이드 뷰 게임 (22)
        • 계륵 (8)
        • 깃 주소 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
dove-dove
Unity 2D 스킬 구현
상단으로

티스토리툴바