유니티/플랫포머 기초

[Unity] 플랫포머 기초 - 7. 스코어

이름?없음 2024. 11. 28. 12:55
반응형

 

반응형

2024.11.28 - [유니티/플랫포머 기초] - [Unity] 플랫포머 기초 - 6. 카메라 이동

 

[Unity] 플랫포머 기초 - 6. 카메라 이동

2024.11.28 - [유니티/플랫포머 기초] - [Unity] 플랫포머 기초 - 5. 타일맵 [Unity] 플랫포머 기초 - 5. 타일맵2024.11.28 - [유니티/플랫포머 기초] - [Unity] 플랫포머 기초 - 4. 플레이어 방향 전환 [Unity] 플랫

no-name-stroy.tistory.com

 

저번 글에서는 카메라 이동을 만들어 보았습니다

이번 글에서는 스코어 시스템을 만들어 보도록 하겠습니다

 

우선 점수를 관리할 매니저부터 작성하도록 하겠습니다

ScoreManager라는 스크립트를 하나 만들어주세요

using UnityEngine;

/// <summary>
/// 점수를 관리하는 매니저
/// </summary>
public class ScoreManager : MonoBehaviour
{

    /// <summary>
    /// 싱글톤 패턴 사용
    /// </summary>
    public static ScoreManager Instance { get; private set; }

    /// <summary>
    /// 점수
    /// </summary>
    public int Score { get; private set; }

    private void Awake()
    {
        //자신을 싱글톤으로 등록
        Instance = this;
    }

    /// <summary>
    /// 점수를 추가하는 함수
    /// </summary>
    /// <param name="score"></param>
    public void AddScore(int score)
    {
        //점수에 더해주기
        Score += score;
        
        //디버깅
        Debug.Log($"점수 : {score}");
    }

}

ScoreManager의 경우 싱글톤 패턴으로 작성하였고 점수 관리기능을 구현해 놓았습니다

 

그다음으로는 코인을 만들어보겠습니다

우선 스크립트 먼저 작성을 하겠습니다

Sencer스크립트를 다음과 같이 수정해 주세요

using System;
using UnityEngine;

/// <summary>
/// 감지 이벤트 구별을 위한 Enum
/// </summary>
public enum TriggerType
{
    Enter,
    Stay,
    Exit
}

/// <summary>
/// 콜라이더 감지를 담당하는 클래스
/// </summary>
public class Sencer : MonoBehaviour
{

    /// <summary>
    /// 대상으로 할 테그
    /// </summary>
    [SerializeField] private string _targetTag;

    /// <summary>
    /// 샌서의 감지 여부
    /// </summary>
    public bool Sensed { get; private set; }

    /// <summary>
    /// 감지 이벤트  
    /// </summary>
    public event Action<TriggerType> SencerEvent;

    /// <summary>
    /// 트리거 접촉이 일어났을 때 실행되는 함수
    /// </summary>
    /// <param name="collision">대상 오브젝트의 콜라이더</param>
    private void OnTriggerEnter2D(Collider2D collision)
    {
        //만약 오브젝트가 해당 테그라면?
        if (collision.CompareTag(_targetTag))
        {
            //감지 여부를 true로 바꾸어주기
            Sensed = true;
            
            //이벤트 발행
            SencerEvent?.Invoke(TriggerType.Enter);
        }
    }

    /// <summary>
    /// 트리거와 접촉중일 때 실행되는 함수
    /// </summary>
    /// <param name="collision">대상 오브젝트의 콜라이더</param>
    private void OnTriggerStay2D(Collider2D collision)
    {
        //만약 오브젝트가 해당 테그라면?
        if (collision.CompareTag(_targetTag))
        {
            //감지 여부를 true로 바꾸어주기
            Sensed = true;

            //이벤트 발행
            SencerEvent?.Invoke(TriggerType.Stay);
        }
    }

    /// <summary>
    /// 트리거와 접촉이 끝났을 때 실행되는 함수
    /// </summary>
    /// <param name="collision">대상 오브젝트의 콜라이더</param>
    private void OnTriggerExit2D(Collider2D collision)
    {
        //만약 오브젝트가 해당 테그라면?
        if (collision.CompareTag(_targetTag))
        {
            //감지 여부를 false로 바꾸어주기
            Sensed = false;

            //이벤트 발행
            SencerEvent?.Invoke(TriggerType.Exit);
        }
    }

}

 

수정이 완료되었다면 Coin이라는 이름의 새로운 스크립트를 작성해 주세요

using UnityEngine;

/// <summary>
/// 코인
/// </summary>
public class Coin : MonoBehaviour
{

    /// <summary>
    /// 먹었을 때 점수를 얼마나 추가할지
    /// </summary>
    [SerializeField] private int _addScore;

    /// <summary>
    /// 콜라이더 이벤트 감지를 위한 센서
    /// </summary>
    private Sencer _sencer;

    private void Awake()
    {
        //찾아오기
        _sencer = GetComponent<Sencer>();

        //이벤트 구독
        _sencer.SencerEvent += HandleSencer;
    }

    /// <summary>
    /// 콜라이더 이벤트 처리를 위한 함수
    /// </summary>
    /// <param name="type">이벤트 타입</param>
    private void HandleSencer(TriggerType type)
    {
        //Enter이벤트가 발행되었다면?
        if (type == TriggerType.Enter)
        {
            //점수를 추가하고
            ScoreManager.Instance.AddScore(_addScore);

            //자기 자신 지우기
            Destroy(gameObject);
        }
    }
}

 

Coin의 경우 센서로 이벤트를 받아 ScoreManager에 점수를 추가시켜 주는 기능을 하는 중입니다

 

이제 오브젝트를 만들어 보겠습니다

우선 씬에 Manager라는 오브젝트를 추가하고 ScoreManager컴포넌트를 추가해 주세요

 

그다음 Coin이라는 오브젝트를 추가한 후 애니메이션을 설정해 주세요(리소스는 맵 파일에 있습니다)

 

그다음 코인에 BoxCollider2D와 Sencer, Coin 스크립트를 추가하고 다음과 같이 설정해 주세요

 

그다음 플레이어 오브젝트의 Tag를 Player로 설정해 주세요

 

끝났습니다 이제 실행시켜 본다면 점수로그가 찍히는 것을 확인할 수 있습니다

 

하지만 게임에서 점수가 추가되었는지 알 수 있는 방법이 없다는 문제가 있는데요

다음 글에서는 점수를 표시해 주는 UI를 만들어 보도록 하겠습니다

반응형