반응형
위키북스 출판사 이재현 저자님의 '절대강좌! 유니티' 책을 참고하여 필기한 내용입니다.
스코어 UI 구현
하이러키 뷰의 Panel - Hpbar 를 복사하고 하위 Image를 지운다음 Text의 내용을 다음과 같이 변경한다
<color=#00ff00>SCORE : </color><color=#ff0000>00000</color>
GameManager 스크립트를 아래와 같이 수정한다.
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
public class GameManager : MonoBehaviour
{
...생략
// 싱글턴 인스턴스 선언
public static GameManager instance = null;
// 스코어 텍스트를 연결할 변수
public TMP_Text scoreText;
// 누적 점수를 기록하기 위한 변수
private int totScore = 0;
// 스크립트가 실행되면 가장 먼저 호출되는 유니티 이벤트 함수
private void Awake()
{
...생략
}
private void Start()
{
// 몬스터 오브젝트 풀 생성
CreateMonsterPool();
// SpawnPointGroup 게임오브젝트의 Transform 컴포넌트 추출
Transform spawnPointGroup = GameObject.Find("SpawnPointGroup")?.transform;
// SpawnPointGroup 하위에 있는 모든 차일드 게임오브젝트의 Transform 컴포넌트 추출
//spawnPointGroup?.GetComponentsInChildren<Transform>(points);
// SpawnPointGroup 하위에 있는 모든 차일드 게임오브젝트의 Tranasform 컴포넌트 추출
foreach (Transform point in spawnPointGroup)
{
points.Add(point);
}
// 일정한 시간 간격으로 함수를 호출
InvokeRepeating("CreateMonster", 2.0f, createTime);
DisplayScore(0);
}
void CreateMonster()
{
...생략
}
// 오브젝트 풀에 몬스터 생성
void CreateMonsterPool()
{
...생략
}
// 오브젝트 풀에서 사용 가능한 몬스터를 추출해 반환하는 함수
public GameObject GetMonsterInPool()
{
...생략
}
// 점수를 누적하고 출력하는 함수
public void DisplayScore(int score)
{
totScore += score;
scoreText.text = $"<color=#00ff00>SCORE : </color> <color=#ff0000>{totScore:#,##0}</color>";
}
}
TMP 관련 컴포넌트를 사용하기 위해선 아래의 네임스페이스를 작성해야된다
using TMPro;
스코어 점수를 표시하는 로직 DisplayScore()함수에서 처리
인자로 받은 totScore 변수에 누적하고 문자열 포맷에 맞게 값을 출력
#은 해당 자릿수에 미달하면 숫자를 표시하지 않음
{12345:#,##0} -> 12,345
{123:#,##0} -> 123
{123:0,000} -> 0,123
{123:0000} -> 0124
ScoreText를 연결하기
MonsterCtrl 스크립트를 아래와 같이 수정한다.
몬스터가 사망했을 때 게임매니저의 DisplayScore() 함수에 점수를 추가시킨다.
private void OnCollisionEnter(Collision coll)
{
if(coll.collider.CompareTag("BULLET"))
{
// 충돌한 총알을 삭제
Destroy(coll.gameObject);
// 피격 애니메이션 실행
anim.SetTrigger(hashHit);
//총알의 충돌 지점
Vector3 pos = coll.GetContact(0).point;
// 총알의 충돌 지점의 법선 벡터
Quaternion rot = Quaternion.LookRotation(-coll.GetContact(0).normal);
// 혈흔 효과를 생성하는 함수 호출
ShowBloodEffect(pos, rot);
// 몬스터의 hp 차감
hp -= 25;
// Debug.Log(gameObject.name + " : " + hp);
if(hp <= 0)
{
state = State.DIE;
// 몬스터가 사망했을 때 50점을 추가
GameManager.instance.DisplayScore(50);
}
}
}
몬스터를 죽이면 점수가 올라가는 모습을 확인할 수 있다.
PlayerPrefs를 활용한 스코어 저장
몬스터의 수만큼 누적된 스코어는 다시 게임을 플레이하면 0으로 초기화 된다
유니티에서 제공되는 기본 저장 기능인 PlayerPrefs를 사용하여 누적된 점수를 저장해보기
PlayerPrefs 클래스는 int, float, string, bool 타입의 변수를 저장하고 로드하는 기능을 제공함
메서드 | 기능 |
DeleteAll | 모든 키값을 삭제 |
DeleteKey | 특정 키값을 삭제 |
GetFloat GetInt GetString |
지정한 Float / Int / String 타입의 키값을 로드 |
HashKey | 해당 키가 존재하는지 반환 |
Save | 변경된 모든 키값을 물리적인 저장 공간에 저장 |
SetFloat SetInt SetString |
지정한 키로 float / int / string 타입의 값을 저장 |
데이터를 저장할 때는 키 이름과 저장 데이터를 인자로 전달
PlayerPrefs.SetInt("키이름",데이터);
저장된 데이터를 불러올 경우 데이터 타입에 맞는 메서드 사용
키가 없다면 기본값을 지정할 수 있음
float damage = PlayerPrefs.GetFloat("DAMAGE");
// 생성되지 않은 키값을 지정
int playerLevel = PlayerPrefs.GetInt("PLAYER_LV",1);
GameManager.cs를 다음과 같이 변경
private void Start()
{
// 몬스터 오브젝트 풀 생성
CreateMonsterPool();
// SpawnPointGroup 게임오브젝트의 Transform 컴포넌트 추출
Transform spawnPointGroup = GameObject.Find("SpawnPointGroup")?.transform;
// SpawnPointGroup 하위에 있는 모든 차일드 게임오브젝트의 Transform 컴포넌트 추출
//spawnPointGroup?.GetComponentsInChildren<Transform>(points);
// SpawnPointGroup 하위에 있는 모든 차일드 게임오브젝트의 Tranasform 컴포넌트 추출
foreach (Transform point in spawnPointGroup)
{
points.Add(point);
}
// 일정한 시간 간격으로 함수를 호출
InvokeRepeating("CreateMonster", 2.0f, createTime);
// 스코어 점수 출력
totScore = PlayerPrefs.GetInt("TOT_SCORE", 0);
DisplayScore(0);
}
... 생략
public void DisplayScore(int score)
{
totScore += score;
scoreText.text = $"<color=#00ff00>SCORE : </color> <color=#ff0000>{totScore:#,##0}</color>";
// 스코어 저장
PlayerPrefs.SetInt("TOT_SCORE", totScore);
}
★ PlayerPrefs의 보안성 Zero
저장 경로가 plist, xml 파일만 열면 바로 조회 및 수정이 가능하여 중요한 게임 데이터는 절대로 PlayerPrefs로 관리하면 안된다.
Unity - Scripting API: PlayerPrefs (unity3d.com) 저장경로
반응형
'Unity 강의 > Unity Course(2) - 절대강좌! 유니티' 카테고리의 다른 글
[Unity Course 2] 10. 내비게이션 고급 기법 (0) | 2024.06.26 |
---|---|
[Unity Course 2] 09. 레이캐스트 활용 (0) | 2024.06.26 |
[Unity Course 2] 08. 게임 매니저 2 (0) | 2024.06.24 |
[Unity Course 2] 08. 게임 매니저 1 (0) | 2024.06.24 |
[Unity Course 2] 07. 유니티 UI 시스템 6 (0) | 2024.06.24 |