낑깡의 게임 프로그래밍 도전기

Unity C# : Json Save기능 구현하기 (외부에서 불러들인 Fbx 모델링 저장) 본문

카테고리 없음

Unity C# : Json Save기능 구현하기 (외부에서 불러들인 Fbx 모델링 저장)

낑깡겜플밍 2024. 6. 11. 10:42
반응형
SMALL

외부에 있는 FBX 파일을 불러와서 유니티에서 사용하고, 그 상태를 저장한 후 다시 로드하는 기능을 구현

 - 파일 시스템을 통해 모델 경로와 관련 정보를 저장하고, 다시 켰을 때 해당 경로로부터 모델을 불러오는 로직 작성

   (만약 외부 모델이 삭제되었을 경우, 이를 감지하고 적절한 오류 처리)

 

 

오늘 사용해 볼 방식

예제 코드

모델 관리 스크립트

using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class ModelManager : MonoBehaviour
{
    [System.Serializable]
    public class ModelData
    {
        public string modelPath;
        public Vector3 position;
        public Quaternion rotation;
    }

    [System.Serializable]
    public class SaveData
    {
        public List<ModelData> models = new List<ModelData>();
    }

    private string saveFilePath;

    void Start()
    {
        saveFilePath = Path.Combine(Application.persistentDataPath, "saveData.json");
        LoadModels();
    }

    public void SaveModels(List<ModelData> modelDataList)
    {
        SaveData data = new SaveData { models = modelDataList };
        string json = JsonUtility.ToJson(data);
        File.WriteAllText(saveFilePath, json);
    }

    public void LoadModels()
    {
        if (File.Exists(saveFilePath))
        {
            string json = File.ReadAllText(saveFilePath);
            SaveData data = JsonUtility.FromJson<SaveData>(json);
            foreach (ModelData modelData in data.models)
            {
                LoadModel(modelData);
            }
        }
    }

    private void LoadModel(ModelData modelData)
    {
        if (File.Exists(modelData.modelPath))
        {
            // FBX 모델을 불러오는 로직 (아래는 예시)
            GameObject model = ImportFBX(modelData.modelPath);
            model.transform.position = modelData.position;
            model.transform.rotation = modelData.rotation;
        }
        else
        {
            Debug.LogError($"Model file not found: {modelData.modelPath}");
        }
    }

    private GameObject ImportFBX(string filePath)
    {
        // FBX 모델을 로드하는 로직을 구현 (예: FBXImporter 사용)
        // 여기서는 단순히 placeholder로 반환
        // 실제로는 FBXImporter 또는 유사한 플러그인을 사용하여 모델을 로드해야 함
        GameObject model = new GameObject(Path.GetFileNameWithoutExtension(filePath));
        return model;
    }
}

예제 사용법

  1. 모델 저장:
    • 외부에서 불러온 모델들의 경로, 위치, 회전 정보를 ModelData 리스트에 저장
    • SaveModels 메소드를 호출하여 데이터를 JSON 파일에 저장
  2. 모델 로드:
    • 유니티를 다시 켰을 때 LoadModels 메소드가 호출되어 저장된 경로에서 모델을 다시 로드
    • 모델이 존재하지 않을 경우 에러 메시지를 출력

모델 저장 예시

void ExampleUsage()
{
    List<ModelManager.ModelData> modelDataList = new List<ModelManager.ModelData>();

    // 예시 모델 데이터 추가
    ModelManager.ModelData modelData = new ModelManager.ModelData
    {
        modelPath = "C:/Models/myModel.fbx",
        position = new Vector3(0, 0, 0),
        rotation = Quaternion.identity
    };
    modelDataList.Add(modelData);

    // 모델 저장
    ModelManager modelManager = FindObjectOfType<ModelManager>();
    modelManager.SaveModels(modelDataList);
}

모델 로드 예시

void Start()
{
    ModelManager modelManager = FindObjectOfType<ModelManager>();
    modelManager.LoadModels();
}

외부의 FBX 모델 파일 경로와 위치 정보를 저장하고 다시 로드하는 과정(모델을 로드할 때 해당 경로에 파일이 존재하지 않으면 에러 출력)

 

 

실제로 FBX 모델을 로드하는 로직은 ImportFBX 메소드에 구현해야 한다.(FBXImporter, TriLibCore와 같은 플러그인을 사용)

반응형
LIST