• Home
  • About
    • KKsDev photo

      KKsDev

      게임 프로그래머를 목표로 Unity, C#을 공부하고 있습니다.

    • Learn More
    • Email
    • Github
    • Steam
  • Posts
    • All Posts
    • All Tags
  • Projects

내일배움캠프 3일차 TIL

19 Jul 2023

Reading time ~2 minutes

오늘 공부한 내용

  1. 유니티 1주차 강의 수강
    • 충돌 처리
    • 오브젝트의 색상 변경
    • 리소스 로드
    • 싱글톤
    • 시간 처리
    • InvokeRepeating()
    • 게임 초기화 및 다시시작

nbcbanner

충돌 처리

각각의 오브젝트 마다 tag를 설정해줄수 있다.

tag는 오브젝트의 그룹을 구분할때 사용한다.

using UnityEngine;
void OnCollisionEnter2D(Collision2D coll){
    if (coll.gameObject.tag == "ground") Destroy(gameObject);
}

OnCollisionEnter2D는 유니티의 내장함수로 오브젝트 간의 충돌이 발생할떄 실행된다.

우리는 이 함수를 오버라이딩 해서 충돌시 우리가 원하는 동작이 발생하게할 수 있다.

Collision2D coll 현재 오브젝트와 충돌한 다른 오브젝트의 Collision2D 컴포넌트를 매개변수로 받는다.

coll.gameObject 는 컴포넌트.gameObject의 형태로 해당 컴포넌트와 연결된 gameObject에 접근할 수 있다.

그냥 gameObject는 현재 오브젝트를 의미한다.

gameObject.tag를 통해 해당 오브젝트의 태그 속성에 접근할 수 있다.

색상 변경

using UnityEngine;
GetComponent<SpriteRenderer>().color  = new Color(100/ 255f, 100/ 255f, 255/255f, 255/255f);

현재 오브젝트의 SpriteRenderer 컴포넌트를 가오고 color 속성을 변경해주는 코드이다.

rgb코드를 지정할떄는 255f로 나누어주어야한다. 왜?

Color 클래스의 생성자를 사용해서 RGB값과 알파(투명도)를 설정할 때는 0~1사이의 값을 지정해야 한다. 

그런데 RGB값은 0~255범위의 값을 갖기 때문에 원하는 RGB색상의 값을 255f로 나누어주어 0~1사이의 값으로 변환해 주어야 된다.

Prefab 로드

강의에서는 Prefab을 변수를 생성해서 드래그 앤 드롭 방식으로 로드 하는 방법을 알려주었는데

전에 다른 강의를 봤을떄 Resources.Load 함수를 사용했던 것이 기억이 나서 둘의 장단점이 뭔지 알고 싶어서 추가로 찾아보았다

그리고 Addressable Asset System 이라는 새로운 방법도 알게되어서 Addressable Asset System이 뭔지에 대해서도 정리했는데

다음에 추가로 Addressable Asset System를 어떤식으로 사용하는지 까지 공부해 볼 생각이다.

정리 : (Unity Prefab, 리소스 로드 방법)

싱글톤

게임의 전반적인 정보를 gameManager로 관리한다면 게임의 시작부터 끝까지 gameManager 오브젝트는 하나만 존재해야한다.

싱글톤은 소프트웨어 디자인 패턴중 하나로 클래스 내부에 해당 클래스의 인스턴스를 전역으로 생성해

해당 클래스의 인스턴스가 하나만 존재할 수 있도록 만드는 방법이다.

제공된 코드는 싱글톤의 개념을 정말 간단하게 소개한거 같아서 추가로 자료를 찾아 보완했다.

using UnityEngine;
static GameManager instance;

    public static GameManager Instance 
    // GamaManager의 인스턴스는 GamaManager.Instance를 통해서 접근할 수 있다.
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType<GameManager>(); ;
                // 아직 instance가 null이라면 씬에서 GameManager 오브젝트를 찾아서 할당
            }
            return instance;
        }
    }
    void Awake()
    {
        if (instance != null && instance != this)
        // 이미 인스턴스가 존재하는데 그게 현재 오브젝트가 아니라면
        { 
            Destroy(gameObject); 
            // 현재 오브젝트를 삭제한다.
            return;
        }
        instance = this;
        //DontDestroyOnLoad(gameObject); 
        // DontDestroyOnLoad가 있을경우 씬을 다시 로드해서 게임을 다시 시작할 떄 오류가 발생
    }

이미 인스턴스가 있는지 확인하고 혹시 인스턴스가 2개가 생성되면 삭제하는 코드들을 추가해 싱글톤 패턴으로 구현했다.

시간 처리

 limit -= Time.deltaTime;

        if (limit < 0)
        {
            Time.timeScale = 0.0f;
            limit = 0.0f;
        }

        timeText.text = limit.ToString("N2"); // N2는 소숫점 둘째자리 까지만 변환하겠다는 뜻

Time.deltaTime 프레임간의 시간 간격을 나타내는 변수

게임의 fps(프레임 레이트)에 따라 달라진다.

오브젝트의 동작 속도에 Time.deltaTime을 곱해주는 것으로 fps가 변해도 일정하게 움직이도록 할 수 있다.

Time.timeScale 게임 시간의 스케일을 조정하는 변수로 모든 시간 관련 값에 영향을 끼친다.

기본값은 1.0이고 값을 조정하여 슬로우 모션 빠른 모션등의 연출을 할 수 있다.

0이 라면 게임이 멈추게 된다 !

InvokeRepeating()

using UnityEngine;
InvokeRepeating("makeRain", 0, 0.5f);

일정 시간마다 함수를 실행시킨다.

  • 첫 번째 매개변수 : 실행할 함수
  • 두 번째 매개변수 : 처음 호출까지의 대기시간
  • 세 번째 매개변수 : 반복주기

다시 시작

게임을 다시 처음부터 시작하려면 해당 씬을 다시 불러오면된다.

using UnityEngine.SceneManagement;

public void retry(){
    SceneManager.LoadScene("MainScene");
}

nbcthumbnail



TIL내일배움캠프스파르타 Share Tweet +1