2024-12-11 TIL

John Jean·2024년 12월 11일

Lazy Sweeper

목록 보기
8/9

할일을 이곳에 추가...

  1. 게임매니저 제작 : o
  2. 쓰레기통에 골인했을 때 점수올라가기 기능 구현 : o
  3. 잘못된 쓰레기통에 골인시 사운드, 성공시 사운드 구현
  4. 전반적인 게임 UI구현
  5. 깃헙 리포 제작 : o
  6. (시간적 여유가 된다면) 쓰레기 프리팹이 날아갈 때 방향과 속도에 영향을 줄 바람기능 구현

게임매니저 제작

점수관리는 정글 동기가 알려준 PlayerPrefs를 사용해보자. 점수가 로컬에 저장되고 불러와서 사용할 수 있다고 함.

싱글톤패턴으로 구현할건데(사실 싱글톤 패턴으로밖에 할줄 모른다..;;ㅎㅎ), 싱글톤으로 구현했을 때의 장점은 다음과 같다.

  1. 어디서나 접근 가능.
    • 프로젝트 내의 모든 스크립트에서 접근이 가능하다.
  2. 중복 방지.
    • 씬 전환이나 객체 복제 시에도 하나의 인스턴스만 유지된다.
  3. 전역 데이터 관리.
    • 게임의 전역 상태 및 데이터를 관리하는 데 적합하다.
    • 예를들어 현재 점수, 최고 점수, 플레이어 상태, 레벨, 설정 데이터 등을 게임 매니저가 관리할 수 있다.(당연한거 아닌가? 싱글톤 패턴으로만 가능한거임?) -> 지피티한테 물어보니까 꼭 싱글톤일 필욘 없다고 하네.
// gameManager.cs
using UnityEngine;
using UnityEngine.SocialPlatforms.Impl;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    private int currentScore = 0;
    private int bestScore = 0;

    void Awake()
    {
        if (Instance == null) Instance = this;
        else Destroy(gameObject);

        // 저장된 BestScore가 있다면 로드
        bestScore = PlayerPrefs.GetInt("BestScore", 0);
    }

    public void AddScore(int amount)
    {
        currentScore += amount;
        if (currentScore > bestScore)
        {
            bestScore = currentScore;
            PlayerPrefs.SetInt("BestScore", bestScore);
        }

        // 점수 변경되었으니 UI 갱신
        ScoreUI.Instance.UpdateScoreUI(currentScore, bestScore);
    }

    public void ResetScore()
    {
        currentScore = 0;
        ScoreUI.Instance.UpdateScoreUI(currentScore, bestScore);
    }
}

쓰레기통 & 점수

쓰레기통 내부에 쓰레기가 잘 골인되었나 검사할 콜라이더를 추가했다. 쓰레기가 들어오면, 올바른 태그를 가진 쓰레기인지 검사하고 맞다면 점수를 증가시키고, 아니면 삐삐 효과음을 넣을거임.

들어온 쓰레기를 어떻게 검사할까 고민해봤는데, 각 쓰레기에는 종류에 해당하는 태그가 달려 있으므로, 쓰레기통 별로 받아들일 쓰레기를 인스펙터에서 입력하면 될듯?

// bin.cs
using UnityEngine;

public class Bin : MonoBehaviour
{
    // 이 쓰레기통이 받아들일 쓰레기 태그를 Inspector에서 지정할 수 있게 함.
    public string acceptableTag;

    void OnTriggerEnter(Collider other)
    {
        // 충돌한 객체의 태그를 확인
        if (other.CompareTag(acceptableTag))
        {
            // 태그가 맞으면 점수 증가
            GameManager.Instance.AddScore(1);
        }
        else
        {
            // 태그가 안 맞으면 삐삐 효과음을 넣으면 됨.
        }

        // 쓰레기 제거 -> 꽉 찰 수도 있으니.
        Destroy(other.gameObject);
    }
}

UI 만들기

일단은 간단하게 현재 점수, 최고 점수를 표시하는 UI를 구현해보자.

CurrentScore, BestScore TMP 생성후 위치를 조절해주기.

// ScoreUI.cs
using UnityEngine;
using TMPro;

public class ScoreUI : MonoBehaviour
{
    public static ScoreUI Instance;

    [SerializeField] private TextMeshProUGUI currentScoreText;
    [SerializeField] private TextMeshProUGUI bestScoreText;

    void Awake()
    {
        if (Instance == null) Instance = this;
        else Destroy(gameObject);
    }

    public void UpdateScoreUI(int currentScore, int bestScore)
    {
        currentScoreText.text = "Score: " + currentScore.ToString();
        bestScoreText.text = "Best: " + bestScore.ToString();
    }
}

SerializeField??

private로 설정된 변수를 Inspector 상에서만 접근 가능하게 해주는 문법이다.

즉 스크립트 외부에서는 private과 같은 역할을 하지만, Inspector 에서는 접근이 가능하다.

profile
크래프톤 6기 정글러

0개의 댓글