본문 바로가기
유니티 게임 개발

[유니티 강좌] 2D RPG 게임 만들기 - 12 / 아이템

by 호일이 2021. 3. 24.

파란색 잼 - 이동속도 증가

초록색 잼 - 공격속도 증가

빨간색 잼 - 체력회복

 

스크립트 폴더 안에 items 폴더를 만들고, 아이템마다 스크립트를 만듭니다.

 

GemBlue.cs

public class GemBlue : MonoBehaviour
{
    // 10초간 이동속도 100% 증가 
    private void OnTriggerEnter2D(Collider2D col)
    {
        if(col.CompareTag("Player"))
        {
            Sword_Man swordMan = col.GetComponent<Sword_Man>();
            StartCoroutine(IncreaseMoveSpeed(swordMan));
            
            GetComponent<SpriteRenderer>().enabled = false;  // Destroy를 하면 코루틴이 정지되므로, 임시로 그림만 없앴음.
            GetComponent<Collider2D>().enabled = false;      // 충돌체 제거
        }
    }

    IEnumerator IncreaseMoveSpeed(Sword_Man swordMan)
    {
        float moveSpeed = swordMan.getMoveSpeed();
        swordMan.SetMoveSpeed(moveSpeed * 2f);

        yield return new WaitForSeconds(10);

        swordMan.SetMoveSpeed(moveSpeed);
        Destroy(gameObject);
    }
}

GemGreen.cs

public class GemGreen : MonoBehaviour
{
    // 10초간 공속 50% 증가
    private void OnTriggerEnter2D(Collider2D col)
    {
        if(col.CompareTag("Player"))
        {
            Sword_Man swordMan = col.GetComponent<Sword_Man>();
            StartCoroutine(IncreaseAttackSpeed(swordMan));

            GetComponent<SpriteRenderer>().enabled = false;
            GetComponent<Collider2D>().enabled = false;
        }
    }

    IEnumerator IncreaseAttackSpeed(Sword_Man swordMan)
    {
        float attackSpeed = swordMan.GetAttackSpeed();
        swordMan.SetAttackSpeed(attackSpeed * 1.5f);

        yield return new WaitForSeconds(10);

        swordMan.SetAttackSpeed(attackSpeed);
        Destroy(gameObject);
    }
}

GemRed.cs

public class GemRed : MonoBehaviour
{
    // 체력 50 회복
    private void OnTriggerEnter2D(Collider2D col)
    {
        if (col.CompareTag("Player"))
        {
            Sword_Man swordMan = col.GetComponent<Sword_Man>();
            swordMan.nowHp += 50;
            if (swordMan.nowHp > swordMan.maxHp) 
                swordMan.nowHp = swordMan.maxHp;
            Destroy(gameObject);
        }
    }
}

 

 

 IEnumerator로 함수를 만들어서 코루틴을 실행하면 함수가 병렬로 실행이 됩니다. 간단하게 실행분기를 나눌 수 있고, 언제든지 실행을 멈추고 일정 시간 후에 실행되게 할 수 있어서 자주 사용하는 기능입니다. 위 코드에서는 코루틴을 실행분기를 나누는 것에 사용하지는 않았고, 10초 후에 코드가 자동 실행되게 하는 것에 사용했습니다.

 

코루틴 사용 예제

StartCoroutine(test()); // 코루틴 시작

 

IEnumerator test() {   // 함수 정의

    A  // A 실행

    yield return new WaitForSeconds(5); // 5초 일시정지

    B  // 5초 후 B 실행

}

 

 만약 코루틴 실행 중에 스크립트가 추가된 오브젝트가 없어진다면 코루틴은 멈추게 됩니다. 따라서 위에 코드에서 아이템을 먹을 때 임시로 그림과 충돌체만 없애고, 코루틴이 끝날 때 오브젝트를 없앴습니다.

 

 

만든 스크립트를 아이템에 각각 붙이고, Collider 2D Trigger를 추가합니다.

Hierarchy창에서 만든 아이템 오브젝트를 Project창으로 드래그 앤 드롭하면 Prefab이 생기는데요.

Prefab은 가공된 오브젝트를 쉽게 꺼내 쓸 수 있도록 저장하는 시스템입니다.

 

Prefabs 폴더를 만들고 저장해두겠습니다.

 

아이템에 닿은 오브젝트를 Tag로 판단하므로, 소드맨에 Player 태그를 달아줍니다.

 

Tag : Player -> Weapon

기존 무기 Tag가 Player였는데 겹치면 안 되니 Weapon으로 바꿔주겠습니다.

CompareTag : Player -> Weapon

Enemy.cs의 OnTriggerEnder2D의 CompareTag도 Player에서 Weapon으로 바꿔줬습니다.

 

 

Sword_Man.cs에서 Get, Set 메소드를 만들어 공속, 이속을 가져오고, 설정하는데 사용했습니다.

체력회복도 캡슐화하는게 좋지만 이번엔 변수로 했습니다.

 

GemBlue

이속 증가

 

GemGreen

공속 증가

 

GemRed

체력 회복

반응형

댓글