본문 바로가기

유니티(Unity)

Unity glTF Importer

Unity 런타임 중, 3D모델을 임포트하기위해 진짜 고생많이 했었는데 OBJ파일을 업로드하는 것은 성공했으나, FBX파일은 도저히 할 수가 없었다. 그러다 최근에 GLTF 파일형식에 대해 알게 되었다.
 
glTF 란
위키백과:
"glTF(GL Transmission Format의 줄임말)는 3차원 장면과 모델을 표현하는 파일 포맷으로 JSON 표준에 기반하고 있다. 크로노스 그룹 (Khronos Group)의 3D Format 작업반에서 제정한 표준이며, HTML5DevConf 2016 행사에서 처음 발표되었다. 효율성과 상호 운용성을 강조한 파일 포맷으로서, 실행에 필요한 부하를 최소화 하도록 설계되었다."
를 말한다.
 
한마디로 말하자면 이 파일 형식은
"애니메이션"과 "모델링 데이터"가 담겨있는 "런타임 최적화된 파일 형식"(.gltf , .glb)이다.
 
다행히  glTF파일은  외부라이브러리를 이용하면, 쉽게 런타임 중 업로드가 가능하였다.
 
https://github.com/atteneder/glTFast/tree/main

GitHub - atteneder/glTFast: Efficient glTF 3D import / export package for Unity

Efficient glTF 3D import / export package for Unity - GitHub - atteneder/glTFast: Efficient glTF 3D import / export package for Unity

github.com

최근까지도 계속 업데이트를 하고 있어서, 최신 버전 unity에디터에서도 사용가능하다.
위 깃허브 주소에서 "readme"의 "Install"에서 unity package를 다운받아 에디터에 임포트 시켜주면 끝이다.
 
아래는 사용 예시이다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Debug = UnityEngine.Debug;

public class GLTF_Manager : MonoBehaviour
{
    
    private string filePath = "C:\\Users\\KIM\\Desktop\\testAnimation.glb";
    [SerializeField] private GameObject gltfPrefab;
    [SerializeField] private List<Shader> requiredShader = new List<Shader>();//빌드에 urp쉐이더를 포함시키기 위해 할당. 직접 사용은 x
    public void GLTF_LoadFile()
    {
        Debug.Log(filePath);
        GameObject gltf = Instantiate(gltfPrefab);
        gltf.GetComponent<GLTFast.GltfAsset>().Url = filePath;
    }
    public void TestObjectLoadFile()
    {
        GameObject gltf = Instantiate(gltfPrefab);
        gltf.GetComponent<GLTFast.GltfAsset>().Url = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF/Duck.gltf";
    }
}

여기서 주의 할 점이 있는데, 유니티는 빌드할 때 외부 shader를 빌드하지 않는다는 것이다. 설정에서 직접 셰이더를 빌드에 포함시키는 방법도 있고, 나의 경우에는 스크립트에 사용할 shader를 연결해주었다. 스크립트에 연결된 shader는 자동으로 빌드에 포함되게 된다.
 
Packages/gltfast/Runtime/Shader 에 위치한 3개의 shader와 Packages/gltfast/Runtime/Shader/URP 에 위치한 (나는 URP를 사용중이므로) shader 1개를 스크립트에 연결시켜주었다.(총 4개)
 
그리고 위의 스크립트에서 프리팹을 복제하는데, 그 프리팹에는 "Gltf Asset" 컴포넌트가 추가되어 있어야한다.
이 과정을 거치면 로컬과 웹 모두에서 gltf파일을 임포트 할 수 있다.
 
https://github.com/aqswdefr1234/GLTFImporter/tree/main