목록Unity (22)
개발블로그
💪 게임에서 최종 보스를 물리칠 때 슬로우 모션으로 보여지는 효과를 많이 보았다. 혹은 왼쪽 하단에 게임의 진행 속도를 조절할 수 있는 배속 버튼도 많이 사용한다. 유니티에서 시간을 빠르게, 혹은 느리게 움직이는 방법을 알아보고, TimeScale에 의존 적인 unscaledTime 도 알아보도록 하자. 🔶 Time.timeScale 시간이 경과하는 크기를 나타낸다. timeScale이 1.0인 경우에 실제 시간과 같은 속도로 경과한다. timeScale이 만약 0.5라면 실제 시간과 비교해서 2배 느리게 경과한다. timeScale이 0으로 설정되는 경우에는 일반적으로 프레임 비율(framerate)과 독립적으로, 모든 기능을 일시 정지한다. 예를 들어 타이머가 가고있는 인게임에서 일시 정지 버튼을 누..
💪 GOAL 유니티 프로젝트로 작업할 때 생성되는 .meta 파일에 대해서 이해한다. 유니티의 내부처리(Behind the Scenes) 에 대해서 이해한다. 프로젝트에서 사용할 CountSlot이라는 프리팹을 생성 후 인스펙터에서 사용할 목적에 맞게 Deactive 오브젝트는 Image 컴포넌트에 Source Image와 Color 값을 변경해주었다. 그림 1 프리팹이 위치한 익스플로러 창을 띄워보았다. 그림 2 폴더를 확인해보면 PREFAB 파일과 META 파일이 같이 생성된 것을 확인할 수 있다. 여기서 이 META 파일은 무엇일까? 🔶 유니티의 메타(meta) 파일 Asset을 식별할 수 있게 하는 값과 그 Asset에 대한 설정 값 등을 저장하는 파일. 그림 1을 예로 들면 Deactive 오브..
💪GOAL 1) Time.deltaTime의 정의와 응용 예제 2) Application.targetFrameRate을 통한 프레임 제어 Time 클래스는 유니티로 부터 시간 정보를 받을 때 사용하는 인터페이스를 나타낸다. 프로젝트에서 시간 관련 값으로 작업할 수 있는 중요한 기본 속성을 제공한다. Time 클래스에서 가장 일반적으로 많이 사용하는 프로퍼티 중 Time.deltaTime 이 있다. 🔶Time.deltaTime 마지막 프레임이 완료된 후 경과된 시간을 반환한다. 게임 내에서 방향키를 눌러서 캐릭터를 이동해야 하는 경우가 있다. 예제 코드를 보자. using UnityEngine; public class StudyTime : MonoBehaviour { [SerializeField] floa..
💪 GOAL 객체지향 프로그래밍을 공부하다 보면 자주 마주치는 용어들이 있다. 변수, 메소드, 클래스, 인스턴스, 객체 ... 등 용어들의 뜻과 객체지향 프로그래밍에서의 클래스 개요를 이해하고 변수와 프로퍼티의 차이점까지 짚어보도록 한다. 객체 지향 프로그래밍(Oriented Object Programming-OOP)은 객체(Object)를 사용해서 프로그램을 처리한다. 문제를 여러 개의 객체로 나누어 독립적인 객체 단위로 분리해서 작업할 수 있기 때문에 여러 개발자가 협업해서 규모가 큰 프로젝트를 진행하기 용이하고, 유지보수 측면도 뛰어나다는 장점이 있다. 객체는 상태(State)와 행동(Behavior)을 가지는 것을 말한다. 즉, 현재 상태와 행동을 각각의 변수와 메소드로 나타낼 수 있어야 하는 것..
💪 GOAL 함수 대리자 델리게이트(delegate)를 응용 예제를 만들고 이해 한다. 🔶 델리게이트(대리자, Delegate) - 델리게이트(Delegate)는 어떤 기능을 추가해줬을 때, 델리게이트가 그 목록을 대신 실행시켜주는 대리자이다. 함수에 대한 참조라고도 한다. 하나의 델리게이트로 여러 함수들에 접근해 실행할 수 있으며, 델리게이트를 이용해 함수를 매개변수로 전달 할 수 있고, 여러 함수를 한꺼번에 실행하는 체인 기능이 있다. 그리고 어떠한 상황에 도달 했을 때 이벤트를 발생 시키는 델리게이트 이벤트도 제공 된다. 함수의 포인터처럼 사용할 수 있는 기능으로, 함수 타입의 참조형 변수를 통해 전달 받은 객체 내/외부의 함수를 실행할 수 있으며 이를 통해 디커플링/일반화를 달성할 수 있다. 델리..
Destroy 와 DestroyImmediate 는 모두 객체를 제거하는 메소드이다. 모두 객체를 제거하는 메소드임에는 다름이 없지만 상황에 따라서 다르게 사용해야 할 때가 있다. (유니티에서는 DestroyImmediate 보단 Destroy 사용을 권장한다.) 예제코드를 보자. public class GameManager : MonoBehaviour { public static GameManager Instance { get; private set; } void Awake() { if (Instance == null) { Instance = this; } else { DestroyImmediate(Instance.gameObject); Instance = this; } } } 게임의 전반적인 시스템 ..
유니티는 사용자가 따로 호출하지 않아도 실행되는 함수들이 있는데, 그 함수들의 호출 주기를 유니티 생명주기라고 한다. 이 함수들의 호출 주기는 사용자가 수정할 수 없기 때문에 함수의 흐름을 잘 이해하고 있는게 중요하다. ✔ 대표적으로 많이 사용하는 이벤트 함수의 순서도 Awake Start 함수 전에 호출되며 프리팹이 인스턴스화 된 직후에 호출된다. 게임 오브젝트가 시작하는 동안 비활성 상태인 경우엔 Awake 함수는 활성화 될 때까지 호출되지 않는다. OnEnable (오브젝트가 활성화 된 경우에만) 오브젝트 활성화 직후 이 함수를 호출한다. 활성화 할 때마다 호출된다. Start 스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출된다. FixedUpdate 물리 엔진을 사용하는 ..
🤷♀️ Sprite는 2D고 Image는 UI? ... Panel은 또 뭐지? UI를 세세하게 뜯어보면서 내가 그냥 당연하게 사용했던 것들이 헷갈리기 시작했다. 그 중에서도 Sprite와 Image. 그리고 Panel도. 평소에 프로젝트를 만들 때, Image는 게임의 UI를 담당하는 부분에 많이 사용했었고 Sprite는 게임의 2D요소. 즉, 블럭이나 단순한 게임 캐릭터 등을 배치해야할 때 사용했었다. 둘의 차이점과 왜 다르게 사용해야 하는지 명확히 모르지만 늘 당연하게 그렇게 사용 해왔는데, 확실히 알고 사용하는 것과 모르고 사용하는 것은 천지차이니.. 이번 기회에 정리를 해둬야겠다. 작성기준 버전 :: 2020.3.14f1 🔶 Image (UI) 사용자에게 상호작용하지 않는 이미지를 표시한다. *..
🤷♀️ 스크롤 뷰의 컨텐츠 밖으로 이미지가 안보이는데 어떻게 UI를 배치하지? 퍼즐 게임에서 많이 찾아볼 수 있는 스테이지 구조인데, 스테이지가 스크롤 형식으로 길을 따라 나열되어있고 플레이어가 스크롤 해서 스테이지 정보들을 확인할 수 있는 UI 구조를 많이 본 적이 있다. 이전에 퍼즐 게임 모작을 만들 때 그런 형식의 스테이지 맵을 따라 만들어보려고 했었는데, 스크롤 뷰 > 컨텐츠 에 배치한 이미지(배경)의 사이즈가 크면 밖으로 튀어 나간 부분의 이미지가 어떻게 되어있는지 알 수가 없으니 스테이지 버튼들을 배치하는데 어려움이 있었다. 예를 들면 이런 구조다. 그림 1 길을 따라가며 스테이지가 배치되어 있고, 스크롤 하면 길을 따라서 스테이지들을 보여주는 구조다. ✔ 구조를 베껴 UI를 만들어보자 작성..
🤷♀️ 게임을 개발할 때 UI는 거의 필수적인 요소로 들어가게 된다. 유니티에서 UI를 배치할 때 모든 UI 요소는 Canvas 안에 위치해야 하므로 모든 UI의 부모인 Canvas를 뜯어보고, Canvas를 여러 개로 분할하여 사용하며 UI의 depth 관리를 용이하게 하는 방법과 불필요한 낭비를 줄이는 최적화 방법 또한 정리를 해 보려고 한다. 🔶 Canvas 캔버스는 Canvas 컴포넌트가 있는 UI의 기본 컴포넌트이며, 모든 UI 요소는 캔버스 안에 위치해야 한다. 하이어라키 뷰에서 UI 요소를 생성할 때, 캔버스가 없는 경우에는 Create > UI > Image로 이미지를 생성하면 자동으로 캔버스를 생성하며 Image는 캔버스의 자식으로 생성된다. 캔버스가 없는 상태에서 Image 컴포넌트를..