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

 

 

 

 

 

반응형
Posted by 이름이 익명
: