코딩의 신 23

김동관·2025년 10월 31일

오늘 한일

<기능 추가>
1. 타이머 기능 추가 ( 랭크로 세분화 하고, 시간에 따라 S, A, B로 나눔)
2.게임 클리어 기능 ( player 2개가 동시에 문에 닿았을 경우 클리어 판정 $$ 시간내에 통과)
3. 게임 오버 기능 추가 (시간안에 통과하지 못하거나, 장애물에 닿았을 경우)

어떤식으로 기능을 추가 했는지 말해드리겠습니다.

<<게임 클리어>>
Door에 Box Collider를 추가해 충돌 판정을 해줍니다.
Player에도 Collider가 있는지 확인해주고 이제 코드를 짜줍시다.
코드입니다.
  public void ShowClearPanel()
    {
        clearPanel.SetActive(true);
        GameManager.Instance.OnGameClear();
        Time.timeScale = 0f;

        // 남은 시간으로 랭크 계산
        float timeTaken = GameManager.Instance.levelTimeLimit - GameManager.Instance.CurrentTime;

        string rank;
        if (timeTaken <= 20f)
            rank = "S";
        else if (timeTaken <= 40f)
            rank = "A";
        else // 40~59초
            rank = "B";

        if (rankText != null)
            rankText.text = $"Rank: {rank}";
    }
  클리어 패널입니다.
  남은 시간으로 랭크를 계싼해주며 다른 씬에도 타이머가 작동을 하게 되며, 당연히
  타이머가 초기화가 되어야 하는걸 인지해 줍시다.
  
  <게임 오버>
  
    public void ShowGameOver()
    {
        if (gameOverPanel != null)
            gameOverPanel.SetActive(true);

        // GameManager 상태를 GameOver로 변경 알려주고 시간은 0으로 
        GameManager.Instance.OnGameOver();
        Time.timeScale = 0f;
    }
 게임 오버 패널입니다.
 위랑 같은 느낌입니다. 대신 게임오버는 다른 장애물 스크립트에 연동이 되어야 하기에 죽었을때 판정에 showGameOVer() 보이게 해줍시다.
 
 <타이머 UI>
 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Core;
using Utils;
using TMPro;

public class TimerUI : MonoBehaviour
{
    //inspect에서 연결 가능하게
    [SerializeField] private TMP_Text timerText;


    private void Update()
    {
        if (GameManager.Instance != null && GameManager.Instance.CurrentState == GameState.Playing)//게임 상태가 Playing일 때만 타이머를 갱신.
        {
            timerText.text = GameManager.Instance.CurrentTime.ToString("F2"); //CurrentTime을 불러와 UI에 표시. "F2": 소수점 2자리까지 표시 
        }
    }
}
게임 타이머 패널 입니다. F2를 해서 소수점 2자리까지 나오게 해주며 기능을 추가해줍니다.

이 부분들은 거의 UI쪽 관련이기 때문에 사실상 꾸미는 작업을 했다고 보면 됩니다.
웹에서 찾아보면 쓸 수 있는 무료 에셋들이 많기에 찾아보면서 써주시면 됩니다.

<트러블 슈팅>

<문제발생>
WaterPlayer가 Hole에 빠지면 아무것도 작동이 안 하는 현상이 발생했습니다.

<문제해결>
플레이어의 태그문제인지 Transform이 추락해서 카메라가 거기까지 내려가면서 발생하는 문제인지 파악을 했습니다.

<결과>

    void Update()
    {
        if (targetNum1 == null || targetNum2 == null)
            return;

        // targetNum이 초기 위치로부터 얼마나 이동했는지 계산
        float travelX1 = targetNum1.position.x - targetStartPosX;
        float travelX2 = targetNum2.position.x - targetStartPosX;

        // 평균 이동 거리에 1/5 (0.2) 패럴랙스 계수를 적용
        float distance = ((travelX1 + travelX2) / 2) * ParallaxFactor;

        // 배경의 새로운 x 위치 = 배경의 초기 위치 + (축소된 이동 거리)
        float newPosX = startPosX + distance;

        transform.position = new Vector3(
            newPosX,
            transform.position.y, // y와 z 위치는 유지
            transform.position.z 
이쪽에서 targetNum 2== null을 지정해주지 하지 null이 떴습니다.
수정을 하니 바로 해결이 되었습니다.
profile
아이디어 뱅크

0개의 댓글