[25.03.24] TIL(강의)

설민우·2025년 3월 21일

< 고양이 밥주기 게임 >

기존에 작업에서 크게 바뀐것 없이 개발을 진행하는데 문제가 없었습니다. 특이할 사항이 있다면 언뜻 비슷하게 보이는 OnTrigger와 OnCollison에 대해서 입니다. 다른 프로젝트에서 개발을 진행할때에도 둘 중에 어떤 것을 써야하는지. RigidBody나 Collider를 어떤 형식으로 추가 해주어야 하는지에 대해서는 햇갈릴때가 많았습니다. 이를 정리해보면 아래와 같습니다.

🔹 정리: 언제 OnTrigger vs OnCollision?

OnTriggerOnCollision
물리적 충돌 반응❌ 없음 (통과 가능)✅ 있음 (반발력, 힘 적용)
isTrigger 설정truefalse
Rigidbody 필요 여부최소한 하나만 필요최소한 하나는 필요
사용 예시감지, 아이템 획득, 체크포인트벽 충돌, 플레이어 피격, 물리적 반응

쉽게 구분하는 법:

  • "충돌 후 반응이 필요하다면 OnCollision"
  • "그냥 감지만 하고 싶다면 OnTrigger"

< 카드 뒤집기 게임 >

해당 프로젝트에서 특기할만한 내용은 역시 리소스 폴더를 사용해서 sprite를 불러오는 부분이라고 생각합니다. 이는 앞으로도 자주 사용하게 될 문법이고, 확장 가능성도 높아서 추가적으로 공부를 진행했습니다.

🔹 주요 Resources 함수 요약
1️⃣ Resources.Load(string path)

특징: 지정된 경로의 리소스를 동기적으로 로드한다.
자주 사용되는 경우:
프리팹, 텍스처, 오디오 등 게임 오브젝트를 런타임에 로드할 때
UI 이미지, 아이콘 같은 리소스를 가져올 때

2️⃣ Resources.LoadAll(string path)

특징: 지정된 폴더 내의 모든 리소스를 배열로 로드한다.
자주 사용되는 경우:
특정 폴더 안의 모든 스프라이트, 프리팹 등을 한꺼번에 불러올 때

3️⃣ Resources.LoadAsync(string path)

특징: 비동기적으로 로드하여 프레임 저하를 방지할 수 있다.
자주 사용되는 경우:
씬 전환 중이나 로딩 화면에서 리소스를 미리 불러올 때
큰 용량의 리소스를 로드하면서 게임이 멈추는 걸 방지할 때

4️⃣ Resources.UnloadUnusedAssets()

특징: 사용되지 않는 리소스를 메모리에서 해제한다.
자주 사용되는 경우:
씬 전환 후, 불필요한 리소스를 정리할 때

🔹 Resources 사용 시 주의점

✅ 장점:
씬과 관계없이 언제든지 로드 가능
간단한 리소스 관리
⚠️ 주의할 점:
많이 사용하면 메모리 관리가 어려워짐 (모든 리소스가 메모리에 남아 있음)
애셋 번들(Addressables)이 권장됨 (Resources 폴더는 유니티에서 최적화되지 않은 방식)

추가적으로 조사한 에셋번들에 대한 내용은 아래와 같습니다.

Addressables란?

Addressables유니티의 리소스 관리 시스템으로, 게임의 메모리 사용을 최적화하고 리소스를 동적으로 로드할 수 있도록 도와준다. 기존 Resources.Load 방식보다 더 효율적이고 유연한 방법을 제공한다.


Resources.Load vs Addressables

Resources.LoadAddressables
로드 방식동기적(Load<T>())비동기적(LoadAsync<T>())
메모리 관리모든 로드된 리소스가 메모리에 유지됨필요할 때 로드하고 필요 없을 때 언로드 가능
외부 파일 지원빌드된 게임 내부에 포함됨원격 서버에서 다운로드 가능
로드 속도빠르지만 초기 로드 시 부담최적화 가능하지만 로드 시간이 필요
유지보수폴더 기반 관리Addressable Group 기반 관리
추천 사용처간단한 게임, 소규모 프로젝트대형 프로젝트, 최적화가 중요한 경우

Addressables의 주요 기능

1. 비동기 로드 (Addressables.LoadAssetAsync)

  • 게임이 멈추지 않고 백그라운드에서 로드 가능
  • LoadAssetAsync<T>()를 사용하면 로드 완료 후 자동으로 할당 가능
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class LoadExample : MonoBehaviour
{
    void Start()
    {
        Addressables.LoadAssetAsync<GameObject>("EnemyPrefab").Completed += OnLoadDone;
    }

    void OnLoadDone(AsyncOperationHandle<GameObject> obj)
    {
        if (obj.Status == AsyncOperationStatus.Succeeded)
        {
            Instantiate(obj.Result);
        }
    }
}

2. 리소스 해제 (Addressables.Release)

  • 필요 없는 리소스를 메모리에서 해제하여 최적화
Addressables.Release(obj);

3. 외부 서버에서 리소스 로드 가능

  • 원격에서 다운로드하여 APK/EXE 크기 절감 가능
  • 클라우드 기반 업데이트를 쉽게 적용 가능

언제 Addressables를 써야 할까?

대형 프로젝트 (메모리 최적화 필수)
DLC, 패치 시스템 (추가 리소스 다운로드 가능)
멀티플랫폼 지원 (기기별 다른 리소스 로드)
온라인 게임 (서버에서 리소스를 관리 가능)


결론

  • 게임이 크고, 메모리 최적화가 중요하다면 Addressables 추천
  • 간단한 게임이라면 그냥 Resources.Load 써도 무방
  • 런타임에 새로운 리소스를 추가하려면 Addressables 필수

< 유니티 주변기능 학습 >

매번 PC 클라이언트로 개발했기 떄문에 Unity를 통해서 광고를 붙여보는 것은 처음이었습니다. 추후 모바일 게임을 만들어 보게 된다면 수익화를 진행하는데 있어서 큰 도움이 될 수 있는 강의였습니다.

profile
클라이언트 개발자를 지망하고 있습니다.

0개의 댓글