유니티 개발을 진행할 때, 3D 오브젝트의 머티리얼을 런타임 중에 변경해야하는 상황이 생긴다.
작은 조각들로 이루어진 오브젝트들을 자주 바꿔주거나 교체해야할일이 생긴다.
어드레서블 시스템을 활용하여 런타임중에 머티리얼을 변경하는 코드를 작성해 보았다.
Window → Package Manager → Packages:Unity Registry → Addressbles 를 찾아 설치한다.
https://docs.unity3d.com/Packages/com.unity.addressables@1.19/manual/index.html
어드레서블 시스템은 기존의 유니티 에셋번들 시스템을 업그레이드 시킨 것으로 애플리케이션의 콘텐츠를 구성하고 패키징하기 위한 도구와 스크립트와 런타임에 자산을 로드 및 릴리스하는 API를 제공합니다.
자산을 "주소 지정 가능"으로 만들면 해당 자산의 주소를 사용하여 어디에서나 로드할 수 있습니다.
해당 자산이 로컬 애플리케이션에 있든 콘텐츠 전송 네트워크에 있든 상관없이 주소 지정 가능 시스템은 자산을 찾아 반환합니다.
설치 후 Window → Asset Management → Addressables → Groups
Group에서는 자산 목록을 빌드할 수 있으며, 자산의 Key값, Label 등 유니크한 참조 값을 가지고 있습니다.
어드레서블 그룹은 자산 목록과 빌드를 하기 위한 창이다.
자산그룹에 추가하려면 인스펙터 창 상단에 Addressable 을 체크하면 자산 목록에 추가된다.
AddressablePractice.cs 파일을 생성한다.
using UnityEngine.AddressableAssets;
public class AddressablePractice : Monobehaviour
{
public class AssetReferenceMaterial : AssetReferenceT<Material>
{
public AssetReferenceMaterial(string guid) : base(guid) { }
}
public AssetReferenceMaterial[] _addressableMaterials; //어드레서블 머티리얼 배열 선언
private void Start()
{
for (int i = 0; i < _addressableMaterials.Length; i++)
{
_addressableMaterials[i].LoadAssetAsync(); //어드레서블 머티리얼 배열 로드
}
}
private void Update()
{
if(Input.GetKey(KeyCode.A)) //A Key를 누르면 특정 인덱스의 머티리얼로 변경
{
OnChangedMatMethod(gameobj, status);
// 머티리얼 변경 함수 호출
}
}
public void OnChangedMatMethod(GameObject gameobj, int status)
{
for (int i = 0; i < _addressableMaterials.Length; i++)
{
gameobj.GetComponent<MeshRenderer>().material = _addressableMaterials[index].Asset as Material;
/// 오브젝트의 메시렌더러 컴포넌트의 메테리얼 속성을 변경
}
}
private void OnDisable()
{
for (int i = 0; i < _addressableMaterials.Length; i++)
{
_addressableMaterials[i].ReleaseAsset(); //어드레서블 머티리얼 배열 릴리즈
}
}
}
해당 화면처럼 변경할 머티리얼을 넣어준다.
머티리얼이 변경된 사진은 보안상 못보여준다.. 다시 업데이트 하겠습니다.
해당내용은 유니티 Gitbub 내용을 참고하여 작성하였습니다.
'Unity' 카테고리의 다른 글
[Unity] CountDown(카운트다운) 타이머를 만들어보자. (0) | 2023.03.03 |
---|---|
[Unity] NavigationSystem #1 - 캐릭터의 목적지 이동 (0) | 2022.10.13 |
[Unity] 싱글톤 클래스 (0) | 2022.06.28 |
[Unity] 다국어 지원 (0) | 2022.06.23 |
[Unity] 오브젝트 Drag & Drop (0) | 2022.06.02 |