이번에는 게임에 필요한 아이템을 만들어보겠습니다.  맵에 아이템을 배치해 플레이어 캐릭터가 접촉하면 얻을 수 있도록 합니다. 보물 상자를 만들어 그 안에 아이템을 숨겨두는 장치도 만들겠습니다.  이번 예제에서 만들 아이템은 열쇠, 화살, 생명입니다. 멀티 스프라이트로 아이템의 이미지 에셋을 준비했습니다. Item이미지 에셋을 Item폴더에 옮기고Multiple Unit:32로 설정하고 [Sprite Editor]에서 32x32픽셀로 자릅니다.

 

아이템게임 오브젝트 만들기

Item을 Multi로 짤랐기 대문에 프로젝트뷰에서 items오른쪽▶를 누르면 아이템들이 보입니다.

Items_0~3을 끌어다 씬뷰에 놓고 Key, Arrow, Life로 이름을 바꿉니다.

각각의 아이템에 Rigidbody2D를 어태치하고 Gravity Scale:0, Circle Collider2D도 어태치하고 isTrigger 체크합니다. 충돌판정 범위는 오브젝트 크기보다 약간 크게 합니다. 나중에 보물에서 아이템이 나왔을때 플레이어에 충돌판정이 적용되도록 하기 위해서입니다. 

 

아이템 관리 스크립트 만들기

ItemData 스크립트를 만들어 Item폴더에 만들고 Item오브젝트에 어태치합니다. Item폴더로 끌어 프리팹으로 만듭니다. Item폴더에는 이미 프리팹이 만들어져 있었는데 Sprite에 이미지가 연결안되어 있어 연결해 주었습니다.

ItemData.cs
0.00MB

enum 열거형

//아이템 종류
public enum ItemType{
    arrow,      //화살
    key,        //열쇠
    life,	   //생명
}

변수

public ItemType type;           //아이템의 종류
public int count = 1;           //아이템 수
public int arrangeId = 0;       //식별을 위한 값

OnTriggerEnter2D()

 

private void OnTriggerEnter2D(Collider2D collision) {
    if (collision.gameObject.tag == "Player") {
        if (type == ItemType.key)  {
            //열쇠
            ItemKeeper.hasKeys += 1;
        }  else if (type == ItemType.arrow)  {
            //화살
            ArrowShoot shoot = collision.gameObject.GetComponent<ArrowShoot>();
            ItemKeeper.hasArrows += count;
        }  else if (type == ItemType.life) {
            //생명
            if (PlayerController.hp < 3) {
                //HP가 3이하면 추가
                PlayerController.hp++;
                //HP 갱신
                PlayerPrefs.SetInt("PlayerHP", PlayerController.hp);
            }
        }
        //++++ 아이템 획득 연출 ++++
        //충돌 판정 비활성
        gameObject.GetComponent<CircleCollider2D>().enabled = false;
        //아이템의 Rigidbody2D가져오기
        Rigidbody2D itemBody = GetComponent<Rigidbody2D>();
        //중력 젹용
        itemBody.gravityScale = 2.5f;
        //위로 튀어오르는 연출
        itemBody.AddForce(new Vector2(0, 6), ForceMode2D.Impulse);
        //0.5초 뒤에 제거
        Destroy(gameObject, 0.5f);
    }
}

보물 상자 만들기

아이템을 담아두는 상자를 만듭니다. 아이템 상자 이미지를 씬 뷰에 끌어다 게임 오브젝트를 만듭니다. 게임오브젝트 이름은 ItemBox로 변경하고 Itembox태그를 만들어 설정한후 Sprite Renderer의 Order in Layer는 2로 합니다.

플레이어가 움직일때 되도록 걸리지 않게 Circle Collide 2D로 설정합니다. 

 

보물상자 관리 스크립트 만들기

ItemBox 스크립트를 Item폴더에 만들고 ItemBox에 어태치합니다.

ItemBox 스크립트에  OpenImage를 연결해준다. ItemPrefab은 Key 프리팹을 연결한다.

다만들어진 ItemBox 오브젝트를 Item폴더로 끌어서 프리팹으로 만들어 줍니다. 교재에 Itembox 프리팹이 미리 만들어져어져 있어 SpriteRenderer의 Sprite에 item_3를 연결해주었습니다.

 

변수

public Sprite openImage;        //열린 이미지
public GameObject itemPrefab;   //담겨있는 아이템의 프리펩
public bool isClosed = true;    //true=닫혀있다 false=열려 있다.
public int arrangeId = 0;       //배치 식별에 사용

OnCollisionEnter2D()

플레이어와 접축하면 openImage로 스프라이트를 교체해줘 열린 효과를 줍니다. itemPrefab을 이용해서 게임오브젝트를 배치합니다.

//접촉 (물리)
private void OnCollisionEnter2D(Collision2D collision) {
    if (isClosed && collision.gameObject.tag == "Player"){
        //상자가 닫혀 있는 상태에서 플레이어와 접촛
        GetComponent<SpriteRenderer>().sprite = openImage;
        isClosed = false;   //열린 상태로 하기
        if (itemPrefab != null) {
            //프리펩으로 아이템 만들기
            Instantiate(itemPrefab, transform.position, Quaternion.identity);
        }
    }
}

게임 실행하기

플레이어가 보물상자를 접촉하면 보물상자가 열리고 아이템을 만들어줍니다. 아이템이 생기면 Player의 ItemData를 설정해주고 Y방향으로 0.5초 튀어오르다 중력으로 떨어집니다.

+ Recent posts