C#_ Unity Game programming 15

Unity - 참조 문제와 데이터 관리 해결하기

Unity에서 복잡한 데이터 구조를 효율적으로 관리하는 것은 게임 개발에서 중요한 요소입니다. 특히 게임을 재시작할 때 데이터의 일관성을 유지하고 참조 문제를 해결하는 것은 게임의 안정성과 사용자 경험을 직접적으로 영향을 미치는 중요한 과제입니다. 이 글에서는 Unity의 참조 관리 문제에 대해 자세히 설명하고 구체적인 해결 방법을 제시하겠습니다.참조 문제의 발생 원인Unity에서 객체 간의 참조는 게임이 실행되는 동안 유지되지만, 게임을 종료하고 다시 시작할 때 이러한 참조가 끊어지기 쉽습니다. 특히 JSON과 같은 직렬화 도구를 사용하여 데이터를 저장하고 로드할 때, 로드된 객체들은 종종 원래의 참조 관계를 잃어버리게 됩니다.코드 예시 - 데이터 구조//캐릭터 클래스 정의[System.Serializ..

C# - DB관리를 위한 LINQ

LINQ(Language Integrated Query)는 C# 프로그래밍 언어에서 데이터 컬렉션을 쉽게 쿼리하고 변환할 수 있는 강력한 도구입니다. LINQ를 사용하여 배열이나 리스트 같은 컬렉션에서 데이터를 선택, 필터링, 정렬할 수 있습니다. 일반적으로 DB를 배울 때 MySql을 배우는데 Sql언어와 매우 유사합니다. 1. Select: Select를 사용하면 컬렉션의 각 요소를 변형할 수 있습니다.var numbers = new[] { 1, 2, 3, 4, 5 };var squares = numbers.Select(x => x * x); // 각 숫자의 제곱 2. Where: Where를 사용하면 조건에 맞는 요소만 필터링할 수 있습니다.var evens = numbers.Where(x => x..

C# - 반복문에서 람다식 사용할 때 주의할 점

람다식에서 변수를 캡처하는 것은 매우 유용하지만, 주의해서 사용해야 합니다. 특히 루프 내부에서 람다를 사용할 때는 각 이터레이션에 대한 독립적인 변수를 캡처해야 하며, 이를 위해 변수의 범위를 정확하게 설정해야 합니다. 그렇지 않으면 루프의 마지막 값만 캡처되는 문제가 발생할 수 있습니다. 다음은 이를 반영한 간단한 예제 코드입니다: List actions = new List(); for (int i = 0; i Console.WriteLine(i)); } foreach (var action in actions) { action(); // 같은 값을 출력합니다: 4 ,4 ,4 ,4, 4 } 이렇게 람다식에서 외부변수를 참조하게 되어, 루프문의 마지막..

C# - Linq의 FirstOrDefault 메서드

FirstOrDefault는 C# 프로그래밍 언어의 LINQ (Language Integrated Query) 라이브러리에서 사용되는 메서드 중 하나입니다. 이 함수는 시퀀스(예: 리스트, 배열 등)에서 조건을 만족하는 첫 번째 요소를 반환하거나, 조건을 만족하는 요소가 없을 경우 기본값을 반환합니다. - 사용 방법 FirstOrDefault 메서드는 기본적으로 두 가지 형태로 사용됩니다: 조건 없이 사용하기: 시퀀스의 첫 번째 요소를 반환하거나, 시퀀스가 비어 있으면 기본값을 반환합니다. 조건을 지정하여 사용하기: 주어진 조건을 만족하는 첫 번째 요소를 반환하거나, 해당 조건을 만족하는 요소가 없으면 기본값을 반환합니다. - 예제 코드 List numbers = new List { 1, 2, 3, 4,..

C# - 네임스페이스를 사용하는 이유

네임스페이스란?네임스페이스는 관련 있는 클래스, 인터페이스, 함수 및 기타 식별자를 그룹화하여 코드의 조직을 돕고, 이름 충돌을 방지하는 코드 구조화 도구입니다. 네임스페이스는 라이브러리나 애플리케이션의 독립된 모듈성을 제공하고, 유지 관리를 용이하게 합니다.네임스페이스의 필요성이름 충돌 방지: 서로 다른 라이브러리 또는 모듈에서 동일한 이름(예를들어 같은 이름의 클래스)을 사용할 수 있게 해줍니다. 이는 특히 대규모 프로젝트나 여러 외부 라이브러리를 사용할 때 유용합니다.코드 관리의 용이성: 네임스페이스를 사용하면 코드를 논리적인 단위로 구분하여 관리할 수 있습니다. 이는 프로젝트의 가독성과 유지보수성을 향상시킵니다.네임스페이스 사용 방법namespace MyProject{ class MyClas..

Unity-디자인 패턴(옵저버 패턴)

Unity 환경에서 옵저버 패턴을 활용해 게임 데이터 관리를 어떻게 더 효율적으로 할 수 있을까? Unity 개발 과정에서 데이터의 변화를 다양한 컴포넌트에 실시간으로 반영하기 위해서 사용되는 기법 중 하나가 바로 옵저버 패턴이다. 즉, 데이터를 변화시키면 그 데이터와 관련된 UI에 바로 데이터가 변경된 것을 알려주는 기법이다. 이 글을 통해 옵저버 패턴의 기본 원리부터 실제 구현 방법까지, 게임 데이터 관리를 위한 새로운 접근 방식을 탐색해보자.옵저버 패턴의 기본옵저버 패턴은 객체의 상태 변화를 관찰하는 여러 관찰자(Observer)에게 자동으로 변화를 알려주는 디자인 패턴이다. 즉, 한 객체의 상태가 변경되면, 그 객체에 의존하는 모든 객체들이 자동으로 알림을 받고 갱신되는 구조를 말한다.Unity에..

Unity - 빌드 사이즈와 메모리의 차이점 및 Addressable System의 활용

게임 개발 시, 빌드 사이즈와 메모리 사용량을 이해하는 것이 중요하다. 가령, A, B, C라는 리소스가 Resources 폴더 내에 위치하고 있다고 한다면, 씬 1에서는 A와 B가 필요하며, 씬 2에서는 C가 필요하다. 이 경우 빌드 사이즈에는 A, B, C 모든 리소스의 용량이 포함되지만, 메모리에는 필요한 씬에 따라 해당 리소스만 로드된다. 빌드 사이즈와 메모리 사용량의 차이 빌드 사이즈는 디스크나 저장 장치에 저장되는 게임 파일의 크기를 말한다. 즉, 게임이 설치될 때 필요한 공간이다. 반면, 메모리 사용량은 게임 실행 도중 실시간으로 RAM에서 사용되는 데이터의 양을 의미한다. 씬 1 실행 시 A와 B 리소스만 메모리에 로드되고, 씬 2가 실행될 때 C 리소스가 메모리에 로드된다. 메모리 최적화..

Unity - Resources.Load시 Null이 입력될 때

유니티에서 Resoucres.Load메서드 기능을 쓸 일이 많을 것이다. 하지만, 경로를 잘못 설정하면 Null값이 반환되는 일이 있다. 따라서 이 메서드를 사용할 때 다음과 같은 부분에 유의할 필요가 있다. Resources.Load(Application.dataPath + "/Resources/test")이런식으로 사용하면 안된다. 이미 내부에서 자동으로 Resources폴더에 접근하기 때문이다. 따라서 그냥, Resources.Load("test")이렇게 접근하면 된다. 하지만, Assets / Resources/test1 와 Assets / Guns / Resources/test2 이렇게 Resources를 중복으로 사용할 경우에는 어떻게 할까? 그냥 각각 Resources.Load("test1"..

Unity - 자주 사용되는 리소스 이용 할 때, static과 싱글톤 적용시 유의할 점

인벤토리 창이나 경매장 같은 UI를 만들 때는 같은 사진 리소스들이 사용 된다. 리소스들을 메모리에 올려놓고 필요할 때마다 참조해서 사용하는데 그 방법에는 static변수로 이미지 리소스들을 올려두는 방식이 있고, 싱글톤 형식으로 리소스들을 저장하는 방식이 있다. 씬 변환이 없는 작은 게임에서는 static변수를 사용해도 상관이 없겠지만, 게임 규모가 커지거나 리소스들이 많아진다면 싱글톤 형식으로 접근하는게 옳다. 필요하거나 반복적으로 사용되는 리소스들을 올려두고 사용할 수있고, 유지보수 협업 관점에서도 편리하기 때문이다. 요약해서서, static변수를 사용했을때 유의할 점은 다음과 같다. 1. 메모리 관리 : Stiatc변수에 할당된 데이터는 애프릴케이션이 실행되는 동안 메모리에 상주하게된다. 이는 사..

Unity - Json 직렬화 안되는 경우

|직렬화하기 위한 클래스 인스턴스 사용 유니티에서 아이템 정보들을 직렬화 해야할 때가 있다. [System.Serializable] //이게 잇어야 직렬화 돼서 GamaManager의 인스펙터에서 볼 수 있음 public class Item { public Item(string Type, string Name, string Explain, string Number, bool isUsing) { this.Type = Type; this.Name = Name; this.Explain = Explain; this.Number = Number; this.isUsing = isUsing; } public string Type, Name, Explain, Number; public bool isUsing; } pu..