내일배움캠프

내일배움캠프 Unity - 사전캠프 (빗물 받는 르탄이)

달시_Dalsi 2025. 1. 7. 23:16
728x90

 

 

남은 시간안에 위에서 떨어지는 오브젝트를 잘 받아내어 점수를 최대한 올리는게 목적인 간단한 게임이다.

캐릭터는 기본적으로 계속움직이며 만약 화면 끝에 닿거나 플레이어가 마우스 좌클릭을하게 되면 방향전환한다.

떨어지는 오브젝트는 땅이나 캐릭터에 닿으면 사라지며 만약 캐릭터에 닿을시 종류별로 상이하게 점수를 획득하거나 잃을 수 있다.

 

모든 시간이 소모되면 재시도 및 끝내는 UI팝업창이 띄워진다.

 

 

 

 

빗물 오브젝트 스크립트

using UnityEngine;

public class Rain : MonoBehaviour
{
    int score; // 빗방울 점수 값
    float size; // 빗방울 크기
    int type; // 빗방울 유형 (0: small, 1: middle, 2: big, 3: red)
    SpriteRenderer spriteRenderer; // SpriteRenderer 컴포넌트
    Vector2 randomPos; // 빗방울 생성 위치

    private void Start()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
        type = Random.Range(0, 4); // 빗방울 유형 랜덤 결정

        switch (type)
        {
            // small rain
            case 0:
                score = 1;
                size = .5f;
                spriteRenderer.color = new Color(100f / 255f, 100f / 255f, 1f, 1f);
                break;

            // middle rain
            case 1:
                score = 2;
                size = 1f;
                spriteRenderer.color = new Color(130f / 255f, 130f / 255f, 1f, 1f);
                break;

            // big rain
            case 2:
                score = 3;
                size = 1.5f;
                spriteRenderer.color = new Color(150f / 255f, 150f / 255f, 1f, 1f);
                break;

            // red rain
            case 3:
                score = -5;
                size = .8f;
                spriteRenderer.color = new Color(1f, 100f / 255f, 1f, 1f);
                break;
        }
        
        // 빗방울의 초기 위치와 크기 설정
        randomPos = new Vector2(Random.Range(-2.5f, 2.5f), Random.Range(4.5f, 2f));
        transform.position = randomPos;
        transform.localScale = new Vector2(size, size);
    }


    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Player")) // 플레이어와 충돌 시 점수 업데이트
        {
            GameManager.instance.getScore(score);
        }
        gameObject.SetActive(false); // 충돌 후 빗방울 비활성화
    }
}

 

 

게임 매니저 스크립트

using TMPro;
using UnityEngine;
using UnityEngine.SocialPlatforms.Impl;
using System.Collections;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    public static GameManager instance; // 싱글톤 인스턴스

    int totalScore = 0; // 총 점수
    float LeftTime = 30f; // 남은 시간
    [SerializeField] Transform tf_groupRain; // 빗방울을 생성할 부모 객체
    [SerializeField] GameObject g_retryPanel; // 재시작 패널
    [SerializeField] TextMeshProUGUI textMeshPro_Score; // 점수 UI 텍스트
    [SerializeField] TextMeshProUGUI textMeshPro_Time; // 남은 시간 UI 텍스트
    [SerializeField] GameObject Prefabs_Rain; // 빗방울 프리팹


    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
    }

    void Start()
    {
        Time.timeScale = 1f;
        StartCoroutine(spwanRain()); // 빗방울 생성 시작
    }

    private void Update()
    {
        LeftTime -= Time.deltaTime;
        textMeshPro_Time.text = LeftTime.ToString("F2");

        if(LeftTime <= 0)
        {
            LeftTime = 0;
            textMeshPro_Time.text = "0"; // UI 표시를 0으로 고정
            Time.timeScale = 0f; // 게임 일시정지
            g_retryPanel.SetActive(true); // 재시작 패널 활성화
        }
    }

    IEnumerator spwanRain()
    {
        while (true)
        {
            Instantiate(Prefabs_Rain, tf_groupRain);
            yield return new WaitForSeconds(1f);
        }
    }

    public void getScore(int value)
    {
        totalScore += value;
        textMeshPro_Score.text = totalScore.ToString();
    }

    public void Button_retry() // 재시작 버튼 눌렀을 때
    {
        SceneManager.LoadScene("RainRtan");
    }
    public void Button_end() // 종료 버튼 눌렀을 때
    {
        Application.Quit();
    }
}

 

 

캐릭터 움직임 스크립트

using UnityEngine;

public class Controller : MonoBehaviour
{
    SpriteRenderer myRenderer; // 캐릭터의 SpriteRenderer 컴포넌트를 저장할 변수
    float dir = 1f; // 오브젝트의 이동 방향을 나타내는 변수(1f: 오른쪽, -1f: 왼쪽)

    void Start()
    {
        myRenderer = GetComponent<SpriteRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            myRenderer.flipX = !myRenderer.flipX; // 오브젝트의 스프라이트를 좌우로 뒤집음
            dir *= -1f; // 이동 방향을 반대로 변경
        }

        // 벽에 닿을때
        if (transform.position.x > 2.6f)
        {
            myRenderer.flipX = true;
            dir = -1f; // 이동 방향을 왼쪽으로 변경
        }
        if (transform.position.x < -2.6f)
        {
            myRenderer.flipX = false;
            dir = 1f; // 이동 방향을 오른쪽으로 변경
        }

        // 오브젝트를 x축으로 이동 (이동 속도: 5f, 방향은 dir 값에 따라 결정)
        transform.position += Vector3.right * 5f * dir *Time.deltaTime;
    }
}

 

 


Unity Play에 업로드된 제 게임을 아래 링크에서 플레이할 수 있습니다.

 

https://play.unity.com/ko/games/7754e841-5649-4db0-95f5-ddbda255ee1d/camprtan

 

camp_Rtan on Unity Play

catch game

play.unity.com

 

728x90