Short Cake
8PM - Animal Crossing Wild World

사생활 보호 설정

https://gamjia.tistory.com

Mini Rooms

  • 내 미니룸
  • 미니미설정
  • 미니룸설정
  • 답글수 [0]

What Friends Say

한마디로 표현해봐~

1촌평 관리

[Day 10] Save The Dog Tutorial 4

GamJia 2024. 11. 16. 14:54

오블완 챌린지 10일차


며칠 전에 알리에서 산 고양이 방석

위에 앉아 기분 좋게 글을

쓰고 있는 GamJia 입니다

 

어제 강의에 이어서
Save The Dog을 만들어 보겠습니다

 


 

오늘은 강아지랑 벌 코드를

작성하려고 했는데 Oh No

Flappy Bird의 흔적이 남아있습니다

 

만약에 프로젝트로 각각 분리했다면

상관 없겠지만 저는 Scene으로만 분리해서..

Script들을 분리하는 작업

우선 해주도록 하겠습니다

 


 

일단 Scripts 폴더에 현재 프로젝트

이름의 폴더를 생성해서

Script들을 1차 분리 하겠습니다

 

사실 이름을 다른걸 써도 되지만

저는 NameSpace로 분리해주겠습니다

 

https://docs.unity3d.com/kr/2022.3/Manual/Namespaces.html

 

네임스페이스 - Unity 매뉴얼

대형 프로젝트로 더 많은 스크립트를 사용할수록 스크립트 클래스 이름이 서로 충돌할 가능성도 커집니다. 여러 프로그래머가 게임의 서로 다른 파트를 따로 작업하고 나중에 하나의 프로젝트

docs.unity3d.com

 

 


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SaveTheDog;	// 추가

namespace SaveTheDog	// 추가
{
    public class Player : MonoBehaviour
    {

    }
}

 

적용 방법은 간단합니다

 

using + NameSpace 이름

class 밖에 NameSpace 선언

이렇게 해주면 끝입니다

 


 

근데 class 이름이 동일해서

Add Component 할 때 헷갈리는

경우가 있습니다

 

그럴 때는

AddComponentMenu / 상위 폴더 + 원하는 이름

을 입력하면 됩니다

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;   
using UnityEngine.SceneManagement; 
using SaveTheDog;

namespace SaveTheDog
{
    [AddComponentMenu("Save The Dog/Save The Dog UI Manager")]
    public class UIManager : MonoBehaviour
    {
        
    }

}

 


 

그리고 게임의 핵심 기능 중

하나인 타이머 표시를 위해

Text Mesh Pro를 하나 만들어주겠습니다

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;   
using UnityEngine.SceneManagement; 
using SaveTheDog;

namespace SaveTheDog
{
    [AddComponentMenu("Save The Dog/Save The Dog UI Manager")]
    public class UIManager : MonoBehaviour
    {
        [SerializeField] private TextMeshProUGUI timerText;

        public static UIManager Instance => instance;
        private static UIManager instance;

        private void Awake()
        {
            if (instance == null)
            {
                instance = this;
                DontDestroyOnLoad(gameObject); 
            }
            else
            {
                Destroy(gameObject); 
            }
        }

        public void UpdateTimerText(int time)
        {
            if (timerText != null)
            {
                if(time>0)
                {
                    timerText.text = time.ToString();
                }

                else
                {
                    timerText.text="Game Clear!!";
                }
                
            }
        }
    }

}

 


using UnityEngine;
using SaveTheDog;
using System.Collections;

namespace SaveTheDog
{
    public class LineManager : MonoBehaviour
    {
        [SerializeField] GameObject line; 
        [SerializeField] Animator animator;
        private Coroutine timerCoroutine; // 타이머 코루틴 변수

        public static LineManager Instance => instance;
        private static LineManager instance;

        private void Awake()
        {
            if (instance == null)
            {
                instance = this;
                DontDestroyOnLoad(gameObject); 
            }
            else
            {
                Destroy(gameObject); 
            }
        }

        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                Instantiate(line, Vector3.zero, Quaternion.identity, this.transform);
            }

            if(Input.GetMouseButtonUp(0))
            {
                if (timerCoroutine==null)
                {
                    timerCoroutine = StartCoroutine(StartTimer());
                }
            }
        }

        private IEnumerator StartTimer()
        {
            float timerDuration = 10f;
            float timeRemaining = timerDuration;

            while (timeRemaining > 0f)
            {
                timeRemaining -= 1f;
                UIManager.Instance.UpdateTimerText(Mathf.FloorToInt(timeRemaining)); // UI 업데이트
                yield return new WaitForSeconds(1f); // 1초 기다리기
            }

            animator.SetBool("isClear", true); 
            timerCoroutine = null;
        }

        public void StopTimer()
        {
            if(timerCoroutine!=null)
            {
                StopCoroutine(timerCoroutine); // 타이머 멈추기
                timerCoroutine = null; // 타이머 코루틴을 null로 설정하여 재시작 가능하게 만듬
            }
        }


    }

}

 

그리고 저번의 Line Manager를 수정해서

10초 countDown을 진행 시키고 끝나면

멍멍이가 행복해하는 표정을 짓게

SetBool을 isClear true로 설정하겠습니다

 

밑에는 StopTimer가 있는데

이거는 나중에 벌에 쏘일 경우

진행중인 Timer를 멈추기 위해 넣었습니다

 


 

제가 영상을 조금 빨리 설정했더니

멍멍이가 행복해하는 모습이

잘 안보이지만.. 암튼 잘 돌아갑니다ㅎㅎ

 


 

오늘은 여기까지 하고

GitHub에 Commit하는걸로

마무리 하겠습니다!

이번 게임도 그렇고..

다음 게임도 처음 만들어보는데

잘 강의를 마칠 수 있을지.....

열심히 해보겠습니다...

 

 

감사합니다!!
 


 

'Challenge' 카테고리의 다른 글

[Day 12] Color Fill Tutorial 1  (0) 2024.11.18
[Day 11] Save The Dog Tutorial 5  (0) 2024.11.17
[Day 9] Save The Dog Tutorial 3  (6) 2024.11.15
[Day 8] Save The Dog Tutorial 2  (4) 2024.11.14
[Day 7] Save The Dog Tutorial 1  (8) 2024.11.13