본문 바로가기
게임 제작/뉴진스 파워퍼프걸 팬게임

뉴진스 파워퍼프걸 팬게임 제작 (11)_ Stage1_랜덤 박스 구현 (New jeans Powerpuff girls fangame)

by 나는반딧불 2023. 8. 26.
반응형

뉴진스 파워퍼프걸 팬게임 제작 (11)_ Stage1_랜덤 박스 구현

저번글과 저저번글에서 플레이어의 공격을 구현했었다.

 

뉴진스 파워퍼프걸 팬게임 제작 (9)_ Stage1_멤버 5명 개별 캐릭터 공격 구현 (New jeans Powerpuff girls fan

뉴진스 파워퍼프걸 팬게임 제작 (9)_ Stage1_멤버 5명 개별 캐릭터 공격 구현 그동안은 해린 캐릭터만 구현해서 대표로 테스트 해왔었다. 뉴진스 파워퍼프걸 팬게임 제작 (8)_ Stage1_적 캐릭터 구현 (N

culturelevel.tistory.com

 

 

뉴진스 파워퍼프걸 팬게임 제작 (10)_ Stage1_ 스킬 구현 (New jeans Powerpuff girls fangame)

뉴진스 파워퍼프걸 팬게임 제작 (10)_ Stage1_ 스킬 구현 저번글에서는 일반 공격을 구현했었다. 뉴진스 파워퍼프걸 팬게임 제작 (9)_ Stage1_멤버 5명 개별 캐릭터 공격 구현 (New jeans Powerpuff girls fan 뉴

culturelevel.tistory.com

이번에는 플레이어 공격에 맞으면 랜덤으로 아이템을 생성하는 랜덤 박스 오브젝트를 구현할 계획이다.

 

 

이번 글의 목표

랜덤 박스 구현

 

 

 

 

1. 랜덤박스 오브젝트 하위에 아이템 오브젝트들 배치하기

Scene에 배치되어 있는 랜덤 박스 오브젝트 하위에 빈 오브젝트를 생성하고 itemBundle이라고 이름을 바꿔준다.

그리고 itemBundle 하위에 토끼,쿠키,스케이트,조각상 아이템을 배치하고

local좌표는 모두 0으로 설정해준다.

 

 

2. 오브젝트 및 콜라이더 컴포넌트 비활성화 하기

랜덤박스에서 아이템이 생성되기전에는 모두 비활성화 상태여야 하기 때문에

각 아이템 오브젝트의 inspecotr창 최상단에 있는 체크박스를 눌러 비활성화 해준다.

그리고 하는김에 Box Collider 2D 컴포넌트도 비활성화 해준다.

컴포넌트를 비활성화 하는 이유에 대해서는 추후에 설명할 예정이다.

 

 

3. 랜덤 박스 코드 작성

 

3.1 선언

    public GameObject[] item = new GameObject[4]; //각 아이템을 넣을 변수

    private int item_num;  //아이템 번호

    bool onetime = true;  //두 번 생성 방지용 변수
    bool Upcheck = true;  //아이템 완전히 생성시 아이템 접근 방지용 변수

    public float upspeed=1f;//아이템 위로 올라가는 속도

    public float upPos_y; //아이템 이동 목표 지점

아이템을 넣을 변수들과 랜덤값을 부여받을 아이템 번호,

버그 방지용 변수들, 아이템 올라가는 속도 변수, 아이템 이동 목표 변수를 선언해주었다.

 

3.2. 충돌 처리 함수

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "BULLET"|| other.tag == "BULLET_R" )  //플레이어 공격에 맞으면
        {
            if (onetime)//맞은게 이번이 처음이라면
            {
                item_num = Random.Range(0, 4);  // 0과 3사이의 숫자를 랜덤으로 지정
                item[item_num].SetActive(true);   //현재 아이템 번호에 맞는 아이템 활성화
                onetime = false;   //한번만 아이템이 뜨게 만들기 위한 변수
            }
        } 
    }

플레이어의 일반공격이나 특수 공격 스킬과 충돌한다면

먼저 이번 충돌이 처음인지 체크를 하고

처음이라면 Random.Range를 사용해서 범위 사이에 값을 item_num에 대입해준다.

그리고 해당 item_num 배열번호를 가진 item을 활성화 한다.

마지막으로 onetime 변수를 false로 바꿔 더이상 아이템이 생성되지 않게 막는다.

 

 

 

3.3. 위로 이동 함수

public void  moveUp()
    {
       if(!onetime)
        {
            if (item[item_num].transform.localPosition.y < upPos_y)  //만약 아이템의 Y좌표가 목표 지점보다 낮다면
            {
                item[item_num].transform.Translate(Vector2.up * upspeed * Time.deltaTime); //위로 이동
            }
            else
            {
                item[item_num].GetComponent<BoxCollider2D>().enabled = true; //올라오는 도중에 아이템 획득 방지 용도 (다 올라왔을때 물리 충돌 컴포넌트를 활성화한다) 
                //올라오는 도중에 먹어버리면 오브젝트가 삭제되고 오브젝트 좌표에 계속 접근하는 중이라 오류가 발행한다.
                Upcheck = false;
            }
        }
    }

아이템이 생성되면 목표 지점까지 위로 이동하게 만든다.

여기서 주의할 점은 transform.position이 아니라 transform.localPosition이라는 점이다.

그냥 position은 글로벌 좌표, localPosition은 부모 오브젝트 기준 좌표이다.

아까 box collider 2D 컴포넌트를 비활성화했던 이유가 여기에 있다.

만약 아이템이 올라오는 도중에 아이템을 먹어서 파괴시켜버리면 

moveUp함수에서는 아이템의 y좌표값에 계속 접근하고 있기 때문에 오류가 나버린다.

그래서 아이템의 목표 지점까지 완전히 올라가기 전에는 충돌처리를 막아두었다가

목표 지점에 도착하면 box collider 2D 컴포넌트를 활성화해서 다시 충돌 처리를 계산하게 만든다.

 

3.4. Update 함수

void Update()
    {
        if (Upcheck)  //굳이 한번더 체크를 해주는 이유는 플레이어가 아이템을 먹으면 오브젝트 삭제되는데 그때 아이템의 높이 좌표를 접근하려고 하면 오류가 나기 때문이다.
        {
            moveUp();
        }
    }

아까 만든 moveUp함수를 Update함수 안에 넣어준다.

moveUp함수 끝에서 Upcheck 변수를 false로 바꿔줬고,

Update함수에서는 moveUp함수를 실행하기전에 Upcheck가 true인지 체크한다.

이렇게 작성한 이유는 오브젝트가 완전히 목표 지점에 도착하면 더이상 오브젝트의 위치값에

접근하지 않게 하기 위해서 이다.

만약 이처리를 하지 않는다면 아까 언급한 것처럼 캐릭터가 아이템을 획득하여 파괴되었을 때

같은 오류가 발생하게 된다.

 

 

 

4. 물리충돌 컴포넌트 추가 및 스크립트 적용

가장 상위 부모인 랜덤박스 오브젝트에 물리충돌 컴포넌트 2개를 추가하고

방금 작성한 랜덤 박스 스크립트도 추가한다.

태그는 OBJECT 태그를 새로 만들어서 설정해주었다.

그리고 빈칸에 각각 박스 오브젝트 하위에 있는 자식오브젝트(아이템)들을 집어 넣는다.

upspeed와 upPos_y도 알맞게 설정해준다.

마지막으로 랜덤 박스 레이어가 생성되는 아이템 레이어보다 앞에 와야 하기때문에 

Order in Layer를 2로 설정해준다.

 

 

 

5. 프리팹화 하기

다 되었으면 Hierarchy창에 있는 오브젝트를 Project창으로 옮겨 프리팹화 해준다.

 

 

6. Destroy_Bullet 스크립트 변경하기

 void OnTriggerEnter2D(Collider2D other)
    {
        if(other.tag=="ENEMY"|| other.tag == "OBJECT")
        {
            Debug.Log("총알이 뭐에 닿음");
            destroy_bullet();
        }
    }

}

총알이 OBJECT 태그를 가진 물체와 충돌하면 사라지도록 코드를 수정해주었다.

 

 

7. 결과물

랜덤박스

랜덤 박스를 공격하면 아이템이 랜덤으로 생성되고

이미 아이템을 생성한 랜덤박스는 다시 공격해도

아이템이 생성되지 않는 모습을 확인할 수 있다.

 

 

이제 진짜 Stage1의 대부분의 구성요소를 구현했다.

다음 글에서는 여태까지 만들었던 것들을 가지고 레벨디자인을 할 계획이다.

 

 

뉴진스 파워퍼프걸 팬게임 제작 (12)_ Stage1_레벨 디자인 (New jeans Powerpuff girls fangame)

뉴진스 파워퍼프걸 팬게임 제작 (12)_ Stage1_레벨 디자인 그동안 한 작업들이 기초공사였다면 이제 부턴 기초 공사 위로 쌓아 올리기만 하면 된다. 그동안 만든 프리팹들을 배치하여 스테이지를

culturelevel.tistory.com

 

반응형