unity (17) 썸네일형 리스트형 Dictionary 이번에는 Dictionary에 대해 List와 비교하면서 공부를 해보겠다. 리스트는 크기가 동적으로 변경되고 원소의 삽입, 삭제가 용이하다. 동적인 배열이다. 따라서 데이터가 연속적으로 저장된다. c++의 vector와 유사하다. 딕셔너리는 key와 value가 존재하여 이를 이용하여 key를 이용해 value를 찾을 수 있다. 중복된 key값을 허용하지 않는다.내부적으로는 해시 테이블을 사용한다. 해시 테이블은 각 키의 해시 코드를 계산하여 해당 코드에 해당하는 인덱스에 데이터를 저장한다. 검색은 키의 해시 코드를 계산하고 해당 코드에 대응하는 인덱스로 이동하여 값을 찾는다.리스트와 달리 데이터가 연속적이지 않고 유니티의 인스펙터 창과 호환이 안된다. ContainsKey()로 중복키값을 검색할 수 있.. 디자인 패턴(싱글톤 패턴, 팩토리 패턴) 싱글턴 패턴(Singleton Pattern)특정 클래스의 인스턴스가 오직 하나임을 보장하고 이 인스턴스에 대한 전역 접근 방법을 제공 자주 호출되는 객체를 new로 매번 새로 만드는 것보다 싱글톤으로 만들어 전역 접근이 가능하게 해 접근하면 메모리를 절약할 수 있다. GameManager 같이 게임을 전체적으로 관리하는 스크립트를 싱글톤으로 만들면 편리하다. 하지만 단점도 존재하는데 클래스들 사이의 의존성이 높아져 싱글턴 인스턴스가 수정되면 참조하는 다른 클래스들도 수정해야 할 수도 있다. 때문에 유지보수가 힘들어 질수도 있다. 간단하게 싱글톤 패턴을 구현해봤다.이렇게 다른 클래스에서 참조할 수 있다. 팩토리 패턴(Factory Pattern)팩토리 패턴은 심플 팩토리 패턴, 팩토리 메소드 패턴, 추.. 코루틴(Coroutine) 유니티에서 코루틴을 사용하면 다수의 작업을 분산시킬 수 있다.https://docs.unity3d.com/kr/2022.3/Manual/Coroutines.html 코루틴 - Unity 매뉴얼코루틴을 사용하면 작업을 다수의 프레임에 분산할 수 있습니다. Unity에서 코루틴은 실행을 일시 정지하고 제어를 Unity에 반환하지만 중단한 부분에서 다음 프레임을 계속할 수 있는 메서드입니docs.unity3d.com코루틴을 사용하면 비동기 작업을 처리 할 수 있다. 때문에 함수를 멈췄다가 유니티에게 제어권을 반환하지만 다음 프레임이나 특정 프레임에 함수를 다시 실행시킬 수 있다. 코루틴을 사용해 딜레이를 구현할 수 있다.※비동기 - 코드가 끝날때 까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행하는 것 .. Object Pooling 전에 학교에서 최적화 방법으로 총알 등을 구현할때 오브젝트 풀링 디자인패턴을 배워서 구현해서 사용해 본적이 있다. 하지만 후에 유니티에서 오브젝트 풀링을 제공한다는 것을 알고 그 방법으로 구현을 해볼려고 한다. 우선 풀매니저를 만들고 오브젝트가 어떤 풀에 들어가는지 알고 있어야 한다.ObjectPool()에 들어가는것은 (생성함수, Get이 될때 실행함수, Release될때 실행함수, Destroy될때 실행함수, maxSize - 최종적으로 풀에 몇개를 저장할것인지)Get이 실행될때 element가 parameter가 되고 Release가 실행될때 element가 실행한다. 다음은 오브젝트를 만들고 화면에 나가면 Release되게 만든다. 오브젝트가 화면에 나가면 꺼지고 다시 생성시 켜지는 것을 볼 수 .. Garbage Collection, GC Garbage Callection이란 자동으로 메모리를 관리를 해준다.https://learn.microsoft.com/ko-kr/dotnet/standard/garbage-collection/fundamentals 가비지 컬렉션 기본 사항 - .NET가비지 수집기의 작동 원리와 최적 성능으로 구성하는 방법에 대해 알아봅니다.learn.microsoft.com그렇기 때문에 개발자가 수동으로 메모리를 관리해주지 않아도 된다. 유니티에서도 GC로 자동으로 메모리를 회수한다. 힙 영역에 메모리가 부족하면 유니티에서 GC를 실행시켜 사용하지 않는 오브젝트를 삭제해 메모리를 확보한다. https://docs.unity3d.com/kr/2021.3/Manual/performance-garbage-collector... Class 아이템들 사용에 필요한 변수들을 미리 Item클래스에 만들어 상속 받을 수 있게끔 구현했다. 아이템 사용 스크립트, 코루틴에 사용하는 WaitForSeconds를 매번 new로 힙에 할당하면 가비지가 생기므로 이 부분을 최소화 하기 위해서 아이템을 사용할때 딜레이를 주기 위해 사용될 WaitForSeconds를 미리 클래스에서 선언했다.이러면 한번만 선언해 사용하기 때문에 비교적 최적화에 도움이 될거 같다고 생각했다.각 아이템들 정보를 담는 스크립트, 공통으로 사용할 변수들을 클래스에 미리 선언해 상속받았다. Interface 인터페이스를 사용하여 아이템들의 공통된 기능을 구현하고 한꺼번에 관리를 해보려고 한다. 참고- 인터페이스 속성 - C# 프로그래밍 가이드 - C# | Microsoft Learn 인터페이스 속성 - C# 프로그래밍 가이드 - C# C#의 인터페이스에 속성을 선언할 수 있습니다. 이 예제에서는 인터페이스 속성 접근자를 선언합니다. learn.microsoft.com 인터페이스를 선언하여 아이템의 종류를 구분할 indexNum, value, 아이템 획득시 구현할 함수 GetItem, 아이템 획득시 아이템 갯수를 증가시킬 ItemCharge함수를 선언했다. IItem을 상속받은 Coin아이템 스크립트다. 안에서 다시 변수랑 함수를 선언하여 만들었다. Player.cs의 OnTriggerEnter함수다. 충돌된.. JSON으로 세이브/ 로드 구현(작성중) Json에 데이터를 저장해서 세이브/로드를 구현해 볼려고 한다. 먼저 DataManager.cs를 만들고 싱글톤을 사용했다. 저장할때 필요한 데이터를 저장시킬 SaveData클래스를 만들었다. Json을 사용하기 위해서 System.IO를 선언했다. SaveData 클래스를 Serializable로 데이터 직렬화를 시켰다. 공부를 하다보니 스크립트 직렬화의 필요성을 알게되었다. Unity Documentation 참고-스크립트 직렬화 - Unity 매뉴얼 (unity3d.com) 스크립트 직렬화 - Unity 매뉴얼 직렬화는 데이터 구조나 오브젝트 상태를 Unity 에디터가 저장하고 나중에 재구성할 수 있는 포맷으로 자동으로 변환하는 프로세스를 말합니다. Unity 에디터에서는 저장 및 로딩, 인스펙터 .. 이전 1 2 3 다음