반응형
반응형
2024.11.28 - [유니티/플랫포머 기초] - [Unity] 플랫포머 기초 - 6. 카메라 이동
저번 글에서는 카메라 이동을 만들어 보았습니다
이번 글에서는 스코어 시스템을 만들어 보도록 하겠습니다
우선 점수를 관리할 매니저부터 작성하도록 하겠습니다
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를 만들어 보도록 하겠습니다
반응형
'유니티 > 플랫포머 기초' 카테고리의 다른 글
[Unity] 플랫포머 기초 - 6. 카메라 이동 (0) | 2024.11.28 |
---|---|
[Unity] 플랫포머 기초 - 5. 타일맵 (0) | 2024.11.28 |
[Unity] 플랫포머 기초 - 4. 플레이어 방향 전환 (0) | 2024.11.28 |
[Unity] 플랫포머 기초 - 3. 플레이어 애니메이션 (1) | 2024.11.26 |
[Unity] 플랫포머 기초 - 2. 지면 감지 (0) | 2024.11.26 |