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
'게임개발 > 언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 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 |