unity 유니티 공부

유니티 공부 .. ui 로직 ( 게임 매니저 )

이름이 익명 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 이렇게 말임

 

 

 

 

 

반응형