목록Unity(유니티)/유니티 공부 (72)
Deff_Dev
어드레서블에서 로드한 Texture2D를 Sprite로 변경해야하는 경우가 생겼다. Texture에서 Sprite로 변경할 때는 Sprite.Create 함수를 사용한다. 코드// 어드레서블 로드Texture2D loadThumbnail = await AddressableManager.Instance.LoadAsset(EAddressableType.Thumbnail, idx++);// 텍스처의 전체 영역 설정Rect rect = new Rect(0, 0, loadThumbnail.width, loadThumbnail.height);// Sprite 생성 (텍스쳐, 영역, 피봇, PixelPerUnit = 100)Sprite sprite = Sprite.Create(loadThumbnail, rect, ..
📌 문제 상황 프로젝트에 맵을 적용시켰더니 Batch가 기본 1000이 넘었고 가장 높은 맵은 1900까지 나왔다. 인스펙터 창에서 Static 배칭을 적용하려 했지만, 런타임에 어드레서블을 사용해 맵을 로드하는 과정에서 Static 배칭이 적용되지 않는 문제가 발생했다 Static 배칭이란 ?정적인 오브젝트 중에 같은 Material을 가진 오브젝트를 미리 배칭하여 드로우 콜을 줄이는 최적화 기법 배칭 과정에서 모든 정적인 오브젝트를 하나로 묶게 되므로, 메모리 사용량이 증가할 수 있습니다. 모든 최적화 방법이 그렇듯 Static 배칭 역시 적절한 상황에서만 사용해야 한다.🔑 CombineMeshes를 이용한 Static Batching 런타임 중 Static 배칭이 자동으로 적용되지 않자,..
sharedMaterial은 실제로 인스펙터에 저장된 원본 Material을 말하고 모든 오브젝트가 동일한 Material을 사용할 때 사용된다 Material을 공유하기 때문에 Batching 가능하지만 Material 값을 변경하면 해당 Material을 사용하는 모든 오브젝트에 반영된다. material은 sharedMaterial의 사본을 만들어 사용하는 인스턴스로 다른 값을 가져야할 때 사용한다. 고유한 Material 인스턴스가 생성되므로 Batching 불가능하지만 material 값을 수정해도 해당 오브젝트만 수정된다. 그렇기 때문에 각각 다른 값을 부여해야하는 경우에는 material에 접근해야되고 같은 값을 가질 때는 sharedMaterial로 접근하면된다.
Predicate반환 값이 반드시 Bool이고 입력 파라미터가 1개인 Delegate이다.반환 타입을 정해야줘야 하는 Func와 달리 Bool 타입으로 고정이기 때문에 사용 목적을 명확하게 전달할 수 있다.List numbers = new List { -1, 5, 0, -3, 10 };// Predicate 정의Predicate isPositive = delegate (int x){ return x > 0;};// 리스트에서 조건을 만족하는 요소 찾기int firstPositive = numbers.Find(isPositive);Console.WriteLine("첫 번째 양수: " + firstPositive);중복 제거한 랜덤 요소 반환 프레임 워크HashSet을 이용한 중복제거 코드를 모든 타입..
어드레서블에 저장된 리소스를 Load 할 때, 필요할 때마다 Load 할 것인지, 미리 모든 데이터를 Load 해서 저장해놓을 것인지에 대해 내가 구현한 방법을 설명하겠다. 일단 리소스의 용도를 먼저 생각해서, 게임에서 계속 사용해야되는 리소스는 게임이 시작될 때, 전부 불러와서 메모리에 저장해두고 사용하는 방식으로 구현했다.잠깐만 사용하는 리소스는 리소스의 사용이 끝나면, 언로드하는 방식으로 구현했다.구현using System;using System.Collections.Generic;using System.Threading.Tasks;using UnityEngine;public class ResourceManager : Singleton{ [field: SerializeField] public ..
어드레서블 그룹 설정을 할 때, 리소스 순서가 내 마음대로 설정되지 않는 이슈가 있었다. [Unity/C#] 어드레서블 (Addressable) 사용어드레서블에 대해 공부를 하고 현재 진행 중인 프로젝트에 적용시켰다.구현 unit 리소스들은 게임 시작시 데이터를 받아오고, ui들은 필요할 때마다 어드레서블에서 해당 리소스를 동적 생성하deff-dev.tistory.com해결 리소스의 이름과 Enum 요소의 이름을 똑같이 설정하고 경로를 저장하는 IResourceLocation 리스트를 Enum이름에 맞게 순서를 정렬을 해주는 방식으로 위 문제를 해결했다. IResourceLocation 정렬 Enum 형태를 T로 받고 해당 Enum 요소 값을 탐색하면서 리소스 이름과 Enum 요소 값이 같다면 IRes..
어드레서블에 대해 공부를 하고 현재 진행 중인 프로젝트에 적용시켰다.구현 unit 리소스들은 게임 시작시 데이터를 받아오고, ui들은 필요할 때마다 어드레서블에서 해당 리소스를 동적 생성하는 것을 구현했다. 어드레서블에 대해 이해가 잘 되지않는다면 아래의 글을 참고하길 바란다. [Unity/C#] 어드레서블 (Addressable)모바일 게임을 빌드할 때, 게임에 들어가는 모든 리소스를 빌드 파일에 포함시킨다면 어떤 일이 벌어질까? 물론 2D 게임의 경우 리소스 용량이 크지 않아 큰 문제가 되지 않을 수 있다. 하지만 3Ddeff-dev.tistory.com 어드레서블과 비동기 처리에 대해 완벽하게 이해를 하고 코드를 작성한 것이 아니고 공부 목적으로 여러 방법 찾아가면서 구현한 내용이니 비 효율적인 부..
모바일 게임을 빌드할 때, 게임에 들어가는 모든 리소스를 빌드 파일에 포함시킨다면 어떤 일이 벌어질까? 물론 2D 게임의 경우 리소스 용량이 크지 않아 큰 문제가 되지 않을 수 있다. 하지만 3D 게임에서는 이야기가 달라진다. 기본적으로 3D 모델은 용량이 크고 무겁기 때문에, 게임에 필요한 모든 리소스를 빌드 파일에 포함시키면, 빌드 파일의 용량은 급격히 커질 것이다. 예전에는 구글 플레이스토어의 업로드 용량 제한이 200MB였지만, 지금은 2GB로 늘어나 조금은 여유가 생겼다. 하지만 여전히 볼륨이 있는 게임을 업로드하기에는 부담스러운 용량 제한이다. 이 때문에 많은 게임 개발자들은 게임에 들어가는 리소스를 빌드 파일에 포함시키지 않는 방법을 선택하고 있다. 모바일 게임을 설치하고 처음 실행할 때 추..