디자인 패턴을 무턱대고 사용하지 맙시다! 본인이 사용하고 있는 코드(디자인) 패턴이 무엇인지는 제대로 알고 사용하고, 디자인 패턴의 본연의 의미를 잃어버리지 맙시다!State Pattern이란? State Pattern은 객체의 상태를 캡슐화하여 해당 상태에 따라 객체의 행동을 내부에서 자동으로 변경하는 디자인 패턴입니다. 유니티 설치과정을 예시로 말해보겠습니다. 우리가 유니티를 설치할 때 내부에서 어떻게 설치되는지 알아야 하는 이유가 있을까요? 저희는 그저 Next 버튼을 클릭하기만 하면 됩니다. Next 버튼을 누르면 내부에서 알아서 설치가 되고, 설치가 마무리되면 프로그램은 저희에게 또다시 Next 버튼을 누르라고 합니다. 그 과정이 끝나면 프로그램은 Finish 버튼을 누르라고 저희에게 알립..
[System.Serializable]이란?C#의 속성(attribute)으로, 클래스, 구조체 또는 필드에 적용할 수 있습니다. System.Serializable 속성을 사용하면 직렬화 시스템에 의해 데이터가 직렬화될 수 있음을 나타냅니다. 직렬화는 데이터 구조나 객체 상태가 에디터에 저장되고 나중에 재구성할 수 있는 포맷으로 자동으로 변환하는 프로세스를 뜻합니다. 직렬화?🔽더보기직렬화는 데이터를 저장하거나 전송하기 위해 일련의 연속적인 바이트로 변환하는 과정을 말합니다. 연속적인 바이트로 변환시키면 복잡한 데이터 구조를 쉽게 저장하고 전송할 수 있습니다. 직렬화된 데이터는 나중에 역직렬화를 통해 원래의 형태로 복원할 수 있습니다.예를 들어, 우리가 게임을 만들고 있고 플레이어의 정보, 아이템, ..
위와 같이 여러개의 Image를 사용하는 캔버스가 있다고 가정하겠습니다.이런 경우, 우측 사진처럼 각 이미지마다 Draw Call을 발생하게 됩니다. 하나의 Image를 여러개의 이미지처럼 사용하는 Altas기법을 사용해서 최적화를 해보겠습니다.Sprite Altas 사용하기 Sprite Altas를 사용하기 위해서는 사전 세팅이 필요합니다.프로젝트 세팅에 가서 에디터 탭, Sprite Altas 모드를 Sprite Altas V1 - Always Enabled로 설정해줍니다. 만약 보이지 않는다면 2D Sprite 패지키를 다운받아줍니다. 그 후, Sprite Atlas를 생성해줍니다. 생성해준 다음 사용할 Sprite들을 집어넣어줍니다.Preview를 하면 아틀라스가 생성된 것을 확인할 수 있습니다..
해당 글은 아래 유니티 블로그에 나온 글을 정리한 것입니다. Optimize your mobile game performance: Get expert tips on physics, UI, and audio settings | Unity BlogYou might have UI elements that only appear sporadically in the game (e.g., a health bar that appears when a character takes damage). If your invisible UI element is active, it might still be using draw calls. Explicitly disable any invisible UI componentsblog.u..
using UnityEngine;using UnityEngine.SceneManagement;namespace testnamespace{ public class SceneLoader : MonoBehaviour { public Scene scene; }} 인스펙터에 Scene을 할당하기 위해 public으로 Scene을 선언해도 인스펙터에는 보이지 않습니다. 인스펙터에 Scene 할당하는 방법기본적인 방식으로는 인스펙터에 Scene을 할당할 수 없습니다. 따라서 에셋을 사용하거나 그 외 본인이 직접 커스터마이징을 해주어야 합니다. 저는 제가 좋아하는 유튜버인 NK Studio님의 작업물을 가져와서 소개해드리고자 합니다. 일단 아래 NK Studio님의 Repo에 가셔서 다운..
씬이 로드됨을 알아야 할 때가 종종 있습니다. 예를 들어, 멀티플레이어 게임이라든지, 로딩화면에서 대기하고 있으며 로딩이 다 된 경우에 클릭하면 넘어갈 수 있는 상황 등에 사용할 수 있습니다. 유니티에서는 씬(Scene)이 로드될 때 호출되는 콜백 함수는 SceneManager<span style="background-color: #ffffff; color: #111111; text-align: start;"..
Day Night System 시간을 세팅하자 아침을 몇시로 세팅 할 지, 저녁은 몇 시로 할 것인지, 흐르는 시간의 배율 등을 세팅할 수 있게 도와주는 SO를 만들어보겠습니다. using UnityEngine; [CreateAssetMenu(fileName = "TimeSettings", menuName = "TimeSettings")] public class TimeSettings : ScriptableObject { public float timeMultiplier = 2000; public float startHour = 12; public float sunriseHour = 6; public float sunsetHour = 18; } 시간의 흐름과 낮/밤의 변화를 관리하자 using Syste..
Heatmap Color Mode란? Unity 6(2023.3.0a10) 이상에서 도입된 Heatmap Color Mode는 Shader Graph의 노드들의 GPU 비용을 시각적으로 색을 통해 나타내는 기능입니다. Heatmap Color Mode는 각 노드의 색상이 해당 노드의 '상대적인 성능 비용'을 나타냅니다. 어두운 색상의 노드는 쉐이더의 전체 GPU 성능 비용이 적게 드는 것을 뜻하며, 밝은 색상의 노드는 GPU 계산을 더 많이 하는 것을 뜻합니. Heatmap Color Mode를 사용하면, 각 노드의 GPU 사이클 수를 측정하여 카테고리(위 사진 Name참고)를 할당하고, 이를 기반으로 그래디언트를 사용하여 노드의 색상을 표시합니다. Heatmap Color Mode를 사용하기 위해서는 ..
Instancing이란? Instancing은 주로 '복제' 또는 '반복 생성'의 개념을 뜻합니다. 특정 객체, 데이터, 또는 구조의 여러 인스턴스를 생성하고 관리하는 과정을 포함됩니다. 유니티에서 Instancing이라는 개념은 GPU Instancing과 Instantiate라는 2가지 의미로 사용되곤 합니다. 이 포스팅에서는 GPU Instancing에 대해서만 말해보고자 합니다. GPU Instancing이란? GPU Instancing은 그래픽 처리 단계에서 사용되는 "최적화 기법"입니다. GPU Instancing을 사용하면 '동일한 메시'의 여러 복제본을 한 번에 그리거나 렌더링할 수 있습니다. 좀비 게임을 예로 들어보겠습니다. 좀비 게임을 할 때 좀비가 한 두마리만 생성되는 경우가 있을까요..
작성된 글은 아래 내용을 정리한 내용입니다. Naming and Code Style Tips for C# Scripting in Unity Pick up best practices for styling your C# code in Unity. These tips can help you and your team create a cleaner, more readable and scalable codebase. unity.com Casing terminology Case Type Description Example Pascal Case 첫 글자와 각 단어의 첫 글자를 대문자로 표기합니다. MyExampleText Camel Case 첫 단어의 첫 글자는 소문자로, 그 이후의 단어의 첫 글자는 대문자로 표기합니..
코드 using UnityEngine; using UnityEngine.UI; public class ResolutionManager : MonoBehaviour { public TMP_Dropdown resolutionDropdown; private Resolution[] resolutions; private void Start() { resolutions = Screen.resolutions; resolutionDropdown.ClearOptions(); HashSet options = new HashSet(); int currentResolutionIndex = 0; for (int i = 0; i < resolutions.Length; i++) { string option = resolutions..
프로젝트 그래픽 퀄리티 옵션 설정 기능 만드는 방법 중 드롭다운(UI)를 이용한 방식에 대해 설명해보겠습니다. 드롭다운 UI를 생성해주고 Option에 High, Middle, Low를 적어줍니다. Option에 적은 순서대로 드롭다운 박스에 나타납니다. 스크립트 작성 public class GameManager : MonoBehaviour { [SerializeField] private List RenderPipelineAssets; [SerializeField] private TMP_Dropdown Dropdown; public void SetPipeline(int value) { if (value = RenderPipelineAssets.Count) { Debug.LogEr..
중요 클래스 - Time - Unity 매뉴얼 Unity의 Time 클래스가 제공하는 중요한 기본 프로퍼티를 사용하여 프로젝트에서 시간과 관련된 값으로 작업할 수 있습니다. docs.unity3d.com 좋은 컴퓨터는 1초에 2프레임 진행된다고 가정해보겠습니다. 플레이어의 속도가 1m라고 가정했을 때 1초에 2프레임이 진행되는 컴퓨터에의 플레이어는 2m를 가게됩니다. 나쁜 컴퓨터는 1초에 1프레임 진행된다고 가정해보겠습니다. 플레이어의 속도가 1m라고 가정했을 때 1초에 1프레임이 진행되는 컴퓨터에의 플레이어는 1m를 가게됩니다. 나쁜 컴퓨터는 억울하겠죠...? 게임이 공평해야지! 컴퓨터가 좋다고 1m더 멀리 가다니.. 그럴 순 없습니다. 이럴 때 사용하는 것이 Time.deltaTime입니다. Time..
이전 글에서 이어지는 내용이므로 이전 글을 보고 와주세요. 2024.03.26 - [Unity/Study] - 유니티 Audio Spectrum에서 얻은 데이터들을 대역 별로 나누기 #기초 Buffer를 사용하면 위 파란색 큐브처럼 값이 급격하게 변화하는 것을 막을 수 있습니다. 값이 갑자기 튀는 현상을 '약간 해결'해줄 수 있다고 생각하시면 됩니다. Buffer란? 'Buffer’는 일반적으로 데이터를 일시적으로 저장하는 임시 저장소를 의미합니다. 데이터를 처리하는 두 개의 프로세스 사이에서 임시 데이터로 사용된다고 생각하시면 됩니다. 아래 코드에서 사용되는 'Buffer’는 FrequencyBands[i]의 값들을 일시적으로 저장하고, 이전의 값들을 기반으로 새로운 값을 계산하는 데 사용됩니다. 버퍼..
유니티에는 씬을 불러오는 두 가지 방법이 있습니다. 동기 방식 - LoadScene LoadScene (동기 방식): LoadScene은 동기 방식으로, 씬을 불러오는 동안 다른 작업을 수행하지 못합니다. 즉, 씬의 모든 데이터를 메모리로 가져오기 전까지 다른 작업이 중지됩니다. 불러오려는 씬의 규모가 크다면, 게임이 멈춰있는 상황이 더 지속될 수 있습니다. 씬의 크기가 작은 경우 LoadScene 방식을 사용하면 됩니다. using UnityEngine; using UnityEngine.SceneManagement; public class Example : MonoBehaviour { public void LoadSceneExample() { SceneManager.LoadScene("SceneName..