일단 시작하는 IT개발 블로그
  • Section 01. 유니티 기초
    2024년 02월 28일 15시 08분 13초에 업로드 된 글입니다.
    작성자: sooooong_minseok

    Section 01-01. 유니티 기초

    01. 화면구성

    주요 화면

    1. Scene : 편집이 이루어지는 곳
    2. Game : 실제 게임 실행화면
    3. Hierarchy : 화면 상에 실제하는 오브젝트, 계층 구조로 되어 있음
    4. Project : 프로젝트에 사용되는 여러 리소스, 스크립트
    5. Inspector : 오브젝트 안에 Component구조
    6. Console : 게임 실행 시 나오는 각종 로그

    02. 유니티 단축키 정리

    Scene 화면 이동
    마우스 휠 : 확대/축소
    alt(opt) + 마우스 우클릭 : 확대/축소

    마우스 우클릭 : 나의 위치는 고정된 상태에서 카메라 시선만 이동
    alt(opt) + 마우스 좌클릭 : 고정된 오브젝트를 기준으로 카메라 시선 이동

    W, A, S, D + 마우스 우클릭 : 카메라 시선에 따라 이동 + shift(속도 증가)
    Q, E + 마우스 우클릭 : 카메라 상하 이동 + shift(속도 증가)
    마우스 휠 + 우클릭 : 0.01x~2.00x : 카메라 이동 속도 조절

    오브젝트
    Q : View Tool
    W : Move Tool
    E : Rotate Tool
    R : Scale Tool
    T : Rect Tool
    Y : Transform Tool
    F : 선택된 오브젝트 위치로 이동
    Z : Pivot <-> Center
    X : Local <-> Global
    V + 오브젝트 드래그 : 다른 오브젝트와 맞닿는 위치
    Shift + Alt + A : 선택된 오브젝트 활성화/비활성화

    카메라 위치 설정
    main camera 클릭 - ctrl(command) + shift + f : scene에서 바라보고 있는 화면과 실제 게임 상의 화면이 동일하도록 카메라 위치 이동

    실행/일시정지
    Ctrl + P : 게임 실행
    Ctrl + Shift + P : 게임 일시 정지
    Ctrl + Alt + P : 1프레임씩 게임 실행


    Section 01-02. Singleton 패턴

    01. 매니저

    매니저의 필요성
    게임 안에 player뿐만 아니라 애니메이션, 오디어 등등 다양한 요소들이 존재한다. 이런 모든 요소들을 관리할 수 있는 매니저가 필요하다.

    상속관계
    MonoBehaviour > Behaviour > Component > Object
    MonoBehaviour가 있어야 오브젝트의 컴포넌트로 추가할 수 있다.

    매니저 사용
    매니저 스크립트를 붙일 용도의 빈 오브젝트를 만들자.

    @Manager 빈 오브젝트 생성 후 스크립트를 오브젝트의 AddComponent함.


    02. 싱글톤 패턴

    참고 링크 : 디자인 패턴 - 싱글톤 패턴

    클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근(액세스) 지점을 제공하는 생성 디자인 패턴입니다.
    전역적으로 사용되는 객체(Object)를 매번 new 연산자로 새로운 객체를 생성하면 일관성이 깨지게 된다.
    이런 객체를 전역적(static)으로 선언해주고 객체가 없을 경우 하나의 객체를 생성하고,
    이미 생성된 하나의 객체만을 사용하는 패턴이다.


    02-01. 싱글톤 패턴 설계 - 찾기

    📜 Managers.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Managers : MonoBehaviour
    {
        void Start()
        {
            GameObject go = GameObject.Find("@Manager"); // 하이라키 상의 @Managers오브젝트 찾기
            Managers mg = go.GetComponent<Managers>(); // 해당 오브젝트의 Managers 스크립트 찾기
        }
    }

    🟠 문제점!!
    만약 @Mangers 오브젝트가 여러 개라면,
    하나만 존재하면 됨 <-> Managers가 여러 개 존재. 모순된 상황이 발생!!!
    즉 유일성을 보장할 수 있는 static을 활용할 필요성이 있다.

    🟢 해결책!!
    1. 매니저는 하나만 존재하도록 한다.
    2. static으로 유일성을 보장하고 여러 곳에서 동일한 인스턴스를 참조하도록 만들자!
    3. 매니저 컴포넌트를 리턴받을 수 있는 static 함수를 만들고 public으로 다른 곳에서 사용할 수 있도록 한다.


    0**2-02. 싱글톤 패턴 설계 - 유일성 보장.**

    📜 Managers.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Managers : MonoBehaviour
    {
        static Managers Instance; // 유일성을 보장한다. (static으로 선언함으로써 그 특성상)
        public static Managers GetInstance() { return Instance; } }// 유일한 매니저를 갖고 온다.
    
        void start(){
            //초기화
            // 1. 하이라키 내에 유일성을 확보하자!
            // Instance = this; // 하이라키 내에 여러 개의 Managers 컴포넌트가 존재할 경우, 가장 마지막에 생성된 Managers 컴포넌트까지 계속 덮어쓴다.
    
            // GameObject go = GameObject.Find("@Managers"); // 유일성을 확보하기 위해 특정 오브젝트(@Managers) 안에 Managers를 instance로 만든다.
            // Instance = go.GetComponent<Managers>(); // static으로 선언된 변수임으로 유일성을 갖게 됨.
        }
    }

    📜 Player.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Player : MonoBehaviour
    {
        void Start()
        {
            Managers managers = Managers.GetInstance();
        }
    }

    🟠 문제점!!
    만약 하이라키 내에 Managers가 존재하지 않는다면??
    Managers를 찾을 수 없다면 다른 스크립트에서 GetInstance()를 호출할 때, NullReferenceException이 발생한다.

    🟢 해결책!
    1. 해당 오브젝트를 직접 생성하고 찾도록 만든다. (썩 좋은 방식은 아니다.)
    2. 해당 오브젝트를 스크립트 상에서 생성하고 직접 변수 할당하자!


    02-03. 싱글톤 패턴 설계 - 오브젝트 null 체크.

    📜 Managers.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Managers : MonoBehaviour
    {
        static Managers Instance; // 유일성을 보장한다. (static으로 선언함으로써 그 특성상)
        public static Managers GetInstance() { init(); return Instance; } }// 유일한 매니저를 갖고 온다.
    
        void start(){
            init()
        }
        static void init()
        {
            if(Instance = null) 
            {
                Gameobject go = GameObject.Find("@Managers"); // 기존 내용과 마찬가지로 일단 찾아보자!.
                if(go == null) // 하지만 만약 없다면?
                {
                    go = new GameObject {name = "@Managers"}; 
                    go.AddComponent<Managers>();
                    // 새로운 게임오브젝트를 생성하고 Managers 스크립트를 추가해준다.
                }
            }
            DontDestoryOnLoad(go); // 씬이동 시, 해당 스크립트의 연속성을 보장.
            Instance = go.GetCompoent<Managers>(); // 기존 내용과 마찬가지로 스크립트 찾아서 할당!.
        }
    }

    02-04. 싱글톤 패턴 설계 - 기타 리팩토링.

    GetInstance() -> Instance
    함수 -> 프로터티

    📜 Managers.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Managers : MonoBehaviour
    {
        static Managers s_instance; // 유일성을 보장한다. (static으로 선언함으로써 그 특성상)
        public static Managers Instance { get { init(); return s_instance; } }// 유일한 매니저를 갖고 온다.
    
        void start(){
            init()
        }
        static void init()
        {
            if(Instance = null) 
            {
                Gameobject go = GameObject.Find("@Managers"); // 기존 내용과 마찬가지로 일단 찾아보자!.
                if(go == null) // 하지만 만약 없다면?
                {
                    go = new GameObject {name = "@Managers"}; 
                    go.AddComponent<Managers>();
                    // 새로운 게임오브젝트를 생성하고 Managers 스크립트를 추가해준다.
                }
            }
            DontDestoryOnLoad(go); // 씬이동 시, 해당 스크립트의 연속성을 보장.
            Instance = go.GetCompoent<Managers>(); // 기존 내용과 마찬가지로 스크립트 찾아서 할당!.
        }
    }

    📜 Player.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Player : MonoBehaviour
    {
        void Start()
        {
            Managers managers = Managers.Instance;
        }
    }

    02-05. 싱글톤 패턴 설계 정리

    오브젝트 찾기 - 유일성 보장 유무, 찾기 유무 관건!
    static - 유일성
    null 체크 - 오브젝트 생성
    DontDestoryOnLoad - 연속성 보장

    댓글