유니티 공부 .. ui 로직 ( 게임 매니저 )
unity 유니티 공부 2025. 1. 3. 16:57 |3D 쿼터뷰 액션게임 - UI 로직 연결하기 [유니티 기초 강좌 B53]
https://www.youtube.com/watch?v=7B9BsVnG8D8
+
참고로, 챗봇에게 스크립트 버그 물어볼 땐,
10,000자 글자제한 있으니 스크립트 전체 복붙안될거임
+
원래 쓰던 카메라는 인 게임 플레이 카메라로 쓸 거임
이름 : Game Camera
이번엔 타이틀 보기용 새로운 카메라를 만들어 볼거임
이름 : Menu Camera
Menu Camera 체크 온 활성화
Game Camera 체크 해제 비활성화
Player 체크 해제 비활성화
Canvas - Menu Panel 활성화
Canvas - Game Panel 비활성화
해둠
메뉴 카메라의 Y Z 위치를 조정해 멀리 보는 거처럼 연출
정적 카메라는 심심하니
좀 움직이는 연출도 넣겠다
어셋 창 - Animation 폴더에서 - Create - Animation 하나 추가함
유니티 6 버전에선 Animation Clip 임
이름은 Yoyo Rotation
메뉴 카메라 인스펙터 창에
Yoyo Rotation 를 드래그 해서 적용
애니메이션 클립을 생성했으니 따로 애니메이션 컨트롤러를 만들 필요는 없음
애니메이터 컨트롤러 더블 클릭해서 애니메이션 편집창 진입
저 주황색 Yoyo Rotation 클릭후
Speed 는 0.1 로 조정
우측 창 모션을 더블 클릭함
씬 창으로 돌아와 메뉴 카메라를 다시 눌러보면
버튼이 달라짐
add property - transform - rotation 에 플러스 버튼해 새 애니 생성
키프레임을 이용해 루프 연출 시킬 것임
y 로테이션을 -20 갔다가 20 갔다가 다시 -20 으로 왔다갔다하게 설정
지금 키프레임 재생보면 너무 빠른데,
이미 애니메이터 창에서 스피드를 0.1 로 느리게 낮췄기 때문에
적당한 속도로 나중에 연출 될거임
아래 어셋 창 - 아까만든 애니메이션 - 오른쪽 인스펙터창 옵션
Loop Time 에 체크 온 해서
애니메이션을 루프로 만들기
+
메인메뉴에 쓸 최고 점수 기록 손 보기
플레이어 스크립트 들어가서
최고 점수를 저장하는 기능을 넣을 것임
// 데이터 저장
PlayerPrefs.SetInt("Score", 100);
PlayerPrefs.SetFloat("Volume", 0.5f);
PlayerPrefs.SetString("PlayerName", "Player1");
// 데이터 불러오기
int score = PlayerPrefs.GetInt("Score");
float volume = PlayerPrefs.GetFloat("Volume");
string playerName = PlayerPrefs.GetString("PlayerName");
// 데이터 삭제
PlayerPrefs.DeleteKey("Score");
PlayerPrefs.DeleteAll();
PlayerPrefs는 유니티에서 데이터를 저장하고 불러오는 데 사용되는 클래스(명령어)입니다
이를 통해 게임 설정, 점수, 플레이어 진행 상황
등과 같은 데이터를 영구적으로 저장할 수 있습니다
챗봇에게 물어보니 PlayerPrefs 는 20개 내외로 쓴다고 함
다른 저장방식 Json, 데이터베이스, ScriptableObject 를 쓴다고 함
+
게임 매니저
게임 매니저 :
형태가 없는 엠티 오브젝트 이지만,
각종 변수를 담아낸 바구니 같은 것
다른 스크립트에서
야 게임매니저야. 너 RedCoinStart 시작해!
게임 매니저는
그 메시지를 받고
RedCoinStart 명령문 속에 속한 명령문들을 실행함
게임 매니저 스크립트 :
RPG 만들기의 '커먼 이벤트' 같은 것
+
변수 세팅, 게임 매니저 .
엠티 오브젝트 생성후
이름을 Game Manager 로 명명
맨 위 하이어라키 순서 맨 위로 드래그해서 놓기
GameManager 스크립트도 하나 생성
그리고 엠티 오브젝트 Game Manager 인스펙터 창에 드래그 해서 적용
![]() |
![]() |
화면에 보이는 ui 요소들을 다 GameManager 스크립트 안에
public 넣어서 변수 만들어주는 걸 함
다시 Game Manager 오브젝트 클릭후 인스펙터 창 보면
스크립트로 적었던 퍼블릭 변수들이 있을 거임
이거 하나씩 다 일일히 찾아서 설정해야함
public TextMeshProUGUI
참고로 유니티 최신버전에선
스크립트에서 Text 가 아니라 TextMeshProUGUI 를 써야함
Stage
Play Time
Is Battle
Enemy Cnt A
Enemy Cnt B
Enemy Cnt C
는 그대로 두기
나중에 때에 따라 알아서 변하기 때문에 일일히 지정하는 거 아님
보스 관련 ui 그룹은 통째로 숨겼다가 통째로 보여줬다가 할 거임
그래서 엠티오브젝트 그룹 자체를 변수로 설정함
void Awake()
{
maxScoreTxt.text = string.Format("{0:n0}",
PlayerPrefs.GetInt("MaxScore"));
}
이 스크립트 사용하면
저번에 저장했던 최대 점수, 112,500이 화면에 찍히게 해줌
MenuCam.SetActive (false);
GameCam.SetActive(true);
메뉴 카메라, 게임 카메라는 서로 동시 출력하지 않겠다
서로 공존하지 않겠다 라는 뜻
게임 버튼 오브젝트 - On click () 인스펙터 -
Game Manager 스크립트 적용
스크립트 상에서 만든 public void GameStart()를 적용
+
weapon1Img.color = new Color(1, 1 ,1, 0 )
컬러 RGB 에서 R G B 는 1이고 알파 투명도값은 0 이라는 뜻
weapon1Img.color = new Color(1, 1 ,1, player.hasWeapons[0] ? 1 : 0 )
여기선 플레이어의
인덱스 무기첫번째 (망치) 가 있다면 알파값 1 불투명하게 설정
없다면 0 투명하게 설정 하겠다는 뜻
weaponRImg.color = new Color
(1, 1, 1, player.hasGrenades > 0 ? 1 : 0);
여기선 플레이어의
수류탄 소지 개수가 1 이상이면 알파값 1 불투명하게 설정
없다면 0 투명하게 설정 하겠다는 뜻
playTime / 3600
라고 적으면 오류가 걸림
(int) (playTime / 3600);
이렇게 정수 변환해야 잘 먹힘
int hour = (int)(playTime / 3600);
int min = (int)((playTime % 3600) / 60);
int second = (int)(playTime % 60);
playTimeTxt.text =
string.Format("{0:00}", hour) +
":" +
string.Format("{0:00}", min) +
":" +
string.Format("{0:00}", second);
시간 분 초 개념은 이렇게 표현함
코드에서 사용된 % 연산자는 모듈로 연산자로, 나머지 연산자라고도 합니다.
두 수를 나누었을 때의 나머지를 반환(표출)합니다.
인게임 텍스트상의 1시간 6분 58초는
플레이 타임 4018.033 으로 표시됨
+
bossHealthBar.localScale
= new Vector3(boss.curHealth / boss.maxHealth, 1 , 1);
라고 강의에선 나왔지만 제대로 표현 안됨
bossHealthBar.localScale
= new Vector3
((float)boss.curHealth / boss.maxHealth, 1 , 1);
이처럼 플로트를 넣어줘야 제대로 적용됨
보스 체력바에 대한 스크립트.
가로 X 스케일이 보스현재체력과 보스의최대체력 비례한다는 뜻
Y 스케일과 Z 스케일은 변화를 안 주고 1로 두겠다는 뜻
+
내가 지은 변수 이름도 text
명령어 이름도 text 이러면
text.text 이렇게 보기 힘들어짐
그래서 구분 쉽게 하려고
내가 지은 변수 이름은 Txt 이렇게 임의로 다르게 이름지어주면 좋음
Txt.text 이렇게 말임