오늘 한일
<기능 추가>
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이 떴습니다.
수정을 하니 바로 해결이 되었습니다.