[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 12 (레벨업🥳시스템)

2023. 5. 10. 16:52·게임개발/언데드서바이벌_골드메탈_클론코딩

https://www.youtube.com/watch?v=eo8bLO7kHVo&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=16 


1. UI 완성하기

Canvas > 우클릭 > UI > Image 생성

- 바탕 이미지 오브젝트 추가 및 색상 변경

- 앵커 Shift + Alt 가장 꽉찬 크기 설정 (색 Black, Alpha 150, 이름 : LevelUp (기존 LevelUP ->ItemGroup)

 

LevelUp > 우클릭 > UI > Image 생성(Panel)

- 자식 오브젝트로 창이 될 이미지 오브젝트 추가

- Source Image에 Panel 설정

- Width : 100 , Height : 130 , Color : 40,145,112

 

Panel > 우클릭 > UI > Legacy > Text 생성(Text Title)

- 창의 제목이 될 텍스트 추가

- 앵커:상단중앙 꽉차제, 폰트변경, 폰트크기10, 색상 White 

- 강조하기 위해 Shadow 컴포넌트 추가

-- 0.5로 바꾸면 그림자가 텍스트에 달라붙어 예쁘게 나온다.

 

기존의 능력 업그레이드를 창 오브젝트 자식으로 넣기

- Shift+Alt 꽉찬 크기로 (우하단)

- Control Child Size : 자식 오브젝트를 자신의 크기에 맞게 자동 변경 (Vertical Layout Group)

- Spacing : 각자 여백

- 여백 설정(생략)

- Item 3,4 Enable(비활성화)

 

아이템 버튼의 이미지와 텍스트는 왼쪽 기준으로 변경 및 위치 조정

- Item 0 > Icon,Text Level 앵커 왼쪽 중앙 설정 및 Pos Y 변경

 

텍스트를 복사하여 아이템 이름 배치(Item Name)

- 폰트 사이즈 크게 (7)

- Aligment 왼쪽으로

- Pos (27,6) 변경

 

텍스트를 복사하여 아이템 설명 배치(Item Desc)

- 폰트 사이즈 복구 (5)

- Pos (27,-7) 변경

 

텍스트의 색상을 조금씩 바꾸어 구분하기

작업하지 않은 버튼은 지우고 새롭게 복사

새롭게 복사한 아이템 버튼의 스크립트블 오브젝트 변수 초기화

Item 3,4 비활성화


2. 아이템 텍스트

ItemData.cs에서 인스펙터에 텍스트를 여러 줄 넣을 수 있게 TextArea 속성 부여

    [TextArea]
    public string itemDesc;

 

설명에 데이터가 들어가는 자리는 {index} 형태로 작성

 

초기화는 Item.cs가 담당한다.

아이템 스프립트에 이름과 설명 텍스트 변수 추가 및 초기화

public class Item : MonoBehaviour
{
    //...

    Image icon;
    Text textLevel;
    Text textName;
    Text textDesc;

    private void Awake()
    {
        icon = GetComponentsInChildren<Image>()[1];
        icon.sprite = data.itemIcon;

        Text[] texts= GetComponentsInChildren<Text>();
        textLevel = texts[0];
        textName = texts[1];
        textDesc = texts[2];
        textName.text = data.itemName;

    }

- GetComponents의 순서는 계층구조의 순서를 따라가요

- textName은 수정이 필요 없으니 같이 초기화

 

레벨 텍스트 로직은 OnEnable로 이동

private void OnEnable()
    {
        textLevel.text = "Lv." + (level + 1);
        switch (data.itemType)
        {
            case ItemData.ItemType.Melee:
            case ItemData.ItemType.Range:
                textDesc.text = string.Format(data.itemDesc, data.damages[level]*100, data.counts[level]);
                break;
            case ItemData.ItemType.Glove:
            case ItemData.ItemType.Shoe:
                textDesc.text = string.Format(data.itemDesc, data.damages[level]*100);
                break;
            case ItemData.ItemType.Heal:
                textDesc.text = string.Format(data.itemDesc);
                break;
        }
        
    }

- 인자 값 개수가 다르기 때문에, 아이템 타입에 따라 switch case문으로 로직 분리

- 데미지 % 상승을 보여줄 땐 100 곱하기


3. 창 컨트롤

Scale을 조절하는것으로 끄고 키기를 구현

LevleUP.cs 생성

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

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

    void Awake()
    {
        rect = GetComponent<RectTransform>();
        items = GetComponentsInChildren<Item>(true);
    }

}

-UI이기 때문에 RectTransform 변수 선언 및 초기화

 

보이고 숨기는 함수 작성

    public void show()
    {
        rect.localScale = Vector3.one;
    }

    public void hide()
    {
        rect.localScale = Vector3.zero;
    }

- 이것을 GameManager가 호출한다.

 

GameManager 에 레벨업 변수 선언 및 초기화

public class GameManager : MonoBehaviour
{
	//...
    [Header("# Game Object")]
    public Player player;
    public PoolManager pool;
    public LevelUp uiLevelUp;

 

- 잊지 말고 초기화 LevelUp코드 하이어라이키에서 LevelUp ui에 컴포넌트 추가하고 끌어서 GameManager에 할당

 

게임매니저의 레벨 업 로직에 창을 보여주는 함수(show) 호출

    public void GetExp()
    {
        exp++;
        if (exp == nextExp[Mathf.Min(level,nextExp.Length-1)])
        {
            level++;
            exp = 0;
            uiLevelUp.show();	//***
        }
    }

 

모든 아이템(Item 0~4) 버튼 컴포넌트의 OnClick에 창을 숨기는 함수(Hide) 연결

레벨업 오브젝트의 크기를 미리 0으로 설정

- 기본 무기가 없는 문제점 발생


4. 기본무기 지급

레벨업 스크립트에서 아이템 배열 변수 선언 및 초기화

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


    // Start is called before the first frame update
    void Awake()
    {
        rect = GetComponent<RectTransform>();
        items = GetComponentsInChildren<Item>(true);
    }

 

버튼을 대신 눌러주는 함수 작성

public void Select(int index)
    {
        items[index].OnClick();
    }

 

GameManager.cs 의 Start에서 item.Select실행

    void Start()
    {
        maxHealth = 100;
        health = maxHealth;

        //임시 스크립트 (첫번째 캐릭터 선택)
        uiLevelUp.Select(0);
    }

 

-실행시 게임이 멈추지 않는 문제점 발생


5. 시간 컨트롤

GameManager.cs에 시간 정지 여부를 알려주는 bool 변수 선언

public class GameManager : MonoBehaviour
{

    public static GameManager instance;
    [Header("# Game Control")]
    public bool isLive;

 

 시간 정지, 작동하는 함수 두 개 작성

    public void Stop()
    {
        isLive = false;
        Time.timeScale = 0;
    }
    public void Resume()
    {
        isLive = true;
        Time.timeScale = 1;
    }

- Time.timeScale : 유니티의 시간 속도 (배율)

 

레벨 업 창이 나타나거나 사라지는 타이밍에 시간 제어

    public void show()
    {
        rect.localScale = Vector3.one;
        GameManager.instance.Stop();
    }

    public void hide()
    {
        rect.localScale = Vector3.zero;
        GameManager.instance.Resume();
    }

 

GameManager의 변수 isLive를 활용해 모든 움직이는 개체를 멈춘다.

 

각 스크립트의 Update 계열 로직에 조건 추가하기(몬스터, 스포너, 플레이어, 웨폰, 게임매니저)

if(!GameManager.instance.isLive)
	return;

 

실행시 isLive가 초기화되지 않았기 때문에 inspecter창에서 체크해준다.

 

- 문제 발생, 삽 레벨은 1이지만 적용이 되지 않았다.


6. 랜덤 아이템

LevelUp.cs 아이템 스크립트에 랜덤 활성화 함수 작성

    void Next()
    {
        // 1. 모든 아이템 비활성화

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

            // 3. 만렙 아이템의 경우는 소비 아이템으로 대체 
    }

1. 모든 아이템 비활성화

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

- foreach를 활용하여 모든 아이템 오브젝트 비활성화

 

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

        // 2. 그 중에서 랜덤 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;
        }

- 랜덤으로 활성화 할 아이템의 인덱스 3개를 담을 배열 선언

- 3개 데이터 모두 Random.Range 함수로 임의의 수 생성

- 서로 비교하여 모두 같디 않으면 반복문을 빠져나가도록 작성

 

2 +

3. 만랩 아이템의 경우는 소비아이템으로 대체

        for (int index = 0; index < ran.Length; index++)
        {
            Item ranItem = items[ran[index]];

            // 3. 만렙 아이템의 경우는 소비 아이템으로 대체
            if (ranItem.level == ranItem.data.damages.Length)
            {
                items[Random.Range(4,5)].gameObject.SetActive(true);
            }
            else
            {
                ranItem.gameObject.SetActive(true);
            }

            
        }

-  for 문을 통해 3개의 아이템 버튼 활성화

- 아이템이 최대 레벨이면 소비 아이템이 대신 활성화 되도록 작성

 

창을보여주는 Show에서 Next 실행

    public void show()
    {
        Next();
        rect.localScale = Vector3.one;
        GameManager.instance.Stop();
    }

 

GameManager.cs에서 GetExp에서 Min 함수를 사용하여 최고 경험치를 그대로 사용하도록 변경(무한 레벨업)

    public void GetExp()
    {
        exp++;
        if (exp == nextExp[Mathf.Min(level,nextExp.Length-1)])
        {
            level++;
            exp = 0;
            uiLevelUp.show();
        }
    }

 

 

HUD쪽의 maxExp또한 수정

float maxExp = GameManager.instance.nextExp[Mathf.Min(GameManager.instance.level, GameManager.instance.nextExp.Length - 1)];

 

원할한 테스트를 위해 필요 경험치를 낮추기 (1,2,3,4,5,6,7,8,9,10)


깃허브 올리기

Commit : ver 1.12
Description : Level Up System

 

https://github.com/mekain80/CloneCode_Undead_Survivor

 

GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x

https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=1 - GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&li...

github.com

 

'게임개발 > 언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글

[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 14 (플레이 캐릭터🧑‍🤝‍🧑선택 )  (0) 2023.05.11
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 13 (게임 시작과 종료)  (0) 2023.05.11
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11+ (플레이어 무기 장착 표현하기)  (0) 2023.05.10
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11 (능력 업그레이드💪구현)  (0) 2023.05.10
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 10 (HUD📐제작하기)  (0) 2023.05.06
'게임개발/언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 14 (플레이 캐릭터🧑‍🤝‍🧑선택 )
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 13 (게임 시작과 종료)
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11+ (플레이어 무기 장착 표현하기)
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11 (능력 업그레이드💪구현)
메카인
메카인
  • 메카인
    메카인의 지식창고
    메카인
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩 공부
        • TIL(Today I Learn)
        • TIL
        • 백준(C++)
        • Python
        • 알고리즘
        • 프로젝트 회고
      • C++
        • C++
        • C++ STL
        • C,C++ mCoding yotube
      • 게임개발
        • 언데드서바이벌_골드메탈_클론코딩
        • 3D_골드메탈_클론코딩
        • 유니티_문제해결
        • 게임 수학
      • Unreal 공부
        • UE5 GameDev
        • Unreal Engine 4 C++ The Ult..
      • 교재 문제 풀이
        • 운영체제
      • 정보처리기사
        • 정처기 요약
        • 정처기 오답노트
      • 학교수업
        • 데이터베이스
        • 프로그래밍 언어론
        • 리눅스 시스템
        • 네트워크
      • 일상
        • 주식
        • 독서
      • (비공개 전용)
        • memory
        • Build
        • OOP
        • Smart Pointer
        • lamda
        • 게임 수학
        • 모던 C++
        • 모던 C++ STL
        • 모던 C++ Concurrency, Paralle..
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 블로그 관리
  • 링크

  • 공지사항

    • 공지사항 - 인생과 블로그의 목표
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
메카인
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 12 (레벨업🥳시스템)
상단으로

티스토리툴바