본문 바로가기
2D 콘텐츠 제작/[언데드 서바이벌] 제작 일지

[언데드 서바이벌 06] 레벨업 시스템 구현 & 오류 수정

by 잰쟁 2023. 9. 19.
728x90

 

 

1. 레벨업 시스템 구현

 

레벨업을 했을때 랜덤으로 item창 나오게 하기

 

 

- itemGroup을 관리하는 'LevelUp' 오브젝트 만들어주고 자식에 아래와 같이 넣어주기

 

 

- LevelUp 스크립트 새로 생성하여 아래와 같이 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LevelUp : MonoBehaviour
{
    private RectTransform rect;
    private Item[] items;

    void Awake()
    {
        this.rect = this.GetComponent<RectTransform>();
        //...(true) => 활성,비활성 모두 찾음
        this.items = this.GetComponentsInChildren<Item>(true);
    }

    //레벨업창 보이기
    public void Show()
    {
        this.rect.localScale = Vector3.one;
    }

    //레벨업창 숨기기
    public void Hide()
    {
        this.rect.localScale = Vector3.zero;
    }

    //기본지급 무기 선택
    public void Select(int i)
    {
        this.items[i].OnClick();
    }
}

 

 

Item 스크립트에서 아래와 같이 변수 추가 및 수정

 

- Desc가 2줄 일수도 있어서 창을 더 늘려주기

 

ItemData 스크립트에서 창의 크기를 늘려줄 itemDesc 위에 [TextArea] 추가하기!

 

넓어진 Desc 창

 

각각의 ItemData의  Item Desc  창에 내용 입력해주기

 

 


 

레벨업창 보이고 숨기기

 

- level up을 하면 레벨업 창이 보임

(localScale = Vector3(1,1,1))

- 원하는 스킬을 클릭하면 레벨업 창이 숨겨짐

(localScale = Vector3(0,0,0))

 

 

LevelUp 스크립트에 아래와 같이 작성

 

레벨업 할 때 Show()가 실행되도록 

GameManager 스크립트 - GetExp() 메서드에 아래와 같이 추가

 

itemData를 클릭하면 Hide() 실행되도록

itemData- Button - On Click() 창에 아래와 같이 추가!

 

 

level up을 하면 레벨업창이 보이게끔 설정했는데

기본 무기 없음..!

 

 

- 게임 실행시 기본무기를 지급해주자

 

LevelUp 스크립트에 Select() 메서드 추가

 

 

GameManager 스크립트 - Start() 안에 Select() 메서드 넣어주기

 

 

실행 후 

level 0 -> 1 되면 레벨업창 팝업, 클릭하면 다시 사라짐

 

 

! 문제 발견 !

레벨업 창이 생성될 때 게임시간이 그대로 흘러감!!

레벨업 창이 생기고 사라질 때 게임시간을 컨트롤해주자.

 

 

GameManager 스크립트에 public bool isLive;(시간 정지 여부 변수) 변수 추가해주고 아래와 같이 메서드 추가

 

LevelUp 스크립트의 레벨업창 컨트롤 메서드 들에 아래와 같이 추가해주기

 

 

스크립트 수정 후 실행 결과

레벨업 창이 팝업되면 시간이 멈추고 사라지면 다시 흘러간다

 


 

 

++)보완

 

 

 

1) 게임 시간 컨트롤

 

단순히 위와 같이 작성하여도 게임시간 컨트롤이 가능하지만, 이왕 isLive 변수를 생성하였으니

Update() 안에 아래와 같이 작성하여 플레이 중에만 로직이 호출되도록 하자.

다른 스크립트의 Update()에서도 똑같이 추가 작성!! (HUD 스크립트 제외)

=> 절묘하게 실행되는 예외도 고려하기 위함

 

 

 

GameManager에  isLive 체크 해제되어 있으므로 체크 꼭 해주기!

 


 

02. Exp 조절

: 레벨이 10이 넘어가도 오류가 나지 않게 조정

: 레벨 10이상이어도  NextExp배열 중 최고경험치(600) 그대로 사용하도록 변경

경험치 배열 길이 10

 

 

- Mathf.Min 함수 사용

(둘 중에 더 작은 값을 반환)

 

- GameManager - GetExp() 메서드의 조건을 아래와 같이 변경

 

 

 

- HUD 스크립트 - Update() - maxHp 값도 변경해주자

 

 


 

03. 레벨업 창의 아이템 랜덤 생성

 

[랜덤 생성 과정]

1. 모든 아이템 비활성화

2. 그 중에서 랜덤으로 3개의 아이템 활성화

(3개의 아이템 중복 X)

3. 만렙 아이템의 경우 소비아이템(음료수)으로 대체

 

 

- LevelUp 스크립트에 Next() 메서드 추가하고 아래와 같이 입력

//아이템 랜덤 생성
    void Next()
    {
        //...1. 모든 아이템 비활성화
        foreach(Item item in this.items)
        {
            item.gameObject.SetActive(false);
        }

        //...2. 그 중에서 랜덤으로 3개의 아이템 활성화
        //길이가 3인 배열 선언
        int[] ran = new int[3];
        while (true)
        {
            ran[0] = Random.Range(0, items.Length);
            ran[1] = Random.Range(0, items.Length);
            ran[2] = Random.Range(0, items.Length);

            //각 배열의 요소 값이 겹치지 않게 조건 부여
            if (ran[0] != ran[1] && ran[1] != ran[2] && ran[0] != ran[2])
            {
                break;
            }
        }
        
        //for문 돌며 해당 아이템 활성화 시켜주기
        for(int i = 0; i<ran.Length; i++) 
        {
            Item ranItem = items[ran[i]];
            //...3. 만렙 아이템의 경우 소비 아이템으로 대체
            if(ranItem.level == ranItem.data.damages.Length)
            {
                //소비아이템 활성화
                items[4].gameObject.SetActive(true);
            }
            else
            {
                //선택된 아이템 활성화
                ranItem.gameObject.SetActive(true);
            }
        }
    }

 

 

실행 결과

레벨 마다 레벨업 창의 아이템이 랜덤으로 활성화된다