나 개발자 진짜 되냐?

[ 12月 13日 ] 오늘 내가 배운 것 _ 64日次 _ JSON을 SO로 바꾸기 본문

오늘 공부를 정리해봐요!

[ 12月 13日 ] 오늘 내가 배운 것 _ 64日次 _ JSON을 SO로 바꾸기

Snow Rabbit 2024. 12. 13. 22:04

 

오늘은

SO딸깍을 성공했다.

 

제대로 이해하는것이 제일 중요하긴 한데..

완성한 것에 뿌듯해서

히죽히죽하는 중이다.

 

살짝 정리하는 시간을 가져볼까 한다.

앞으로도 내가 잘 쓸 수 있었으면 좋겠다.

 


 

먼저!

 

 

EditorWindow를 상속받아서

몬스터데이터를 바꿔주는 클래스를 만들어주었다.

 

메뉴를 만들어준다.

 

이렇게 해주면

도구에 야무지게 하나 생긴다.

 

 

일단 리소시스 파일에서 몬스터 친구를 데려온다.

 

 

 

맞춰준 값을 FormJson 해서 json을 불러와준다.

 

 

다음에 경로를 지정해준다.

 

if문 안에 있는 건

유니티에서 지원해 주는 친구로

 

파일이 없다면!

자동으로 만들어준다.

 

 

이다음에 리스트 돌면서

SO에 넣어주면 된다.

 

 

AssetPath로 경로 지정후

AssetDatabase에서 CreateAsset를 해준다.

 

AssetDatabase는 유니티에서 지원해 주는 것으로 

꼭!!!!!

필요하다.

 

이 친구가 없으면

SO로 평생 못 바꾼다!

꼭 알아두자!

 

 

 

이렇게 해주면!

 

가져와서 갱신해서

똵! 생긴다

 

후후후후후후후훟!!

 

드디어

나도 에디터를 만들어보았다.


짧지만 굵었던 친구..

오래오래 기억하고 싶다 ㅎㅅㅎ

 

using UnityEngine;
using UnityEditor;
using System.IO;

public class MonsterDataConverter : EditorWindow
{
    // Utility 메뉴에 항목 추가
    [MenuItem("Utility/Json To SO")] //JSON to SO
    public static void ConvertJsonToSO()
    {
        // JSON 데이터 경로 설정 + 파일로드

        TextAsset MonsterJsonData = ResourceManager.Instance.LoadAsset<TextAsset>("MonsterData", eAssetType.JsonData);
        if (MonsterJsonData == null)
        {
            Debug.LogError($"JSON 파일 없다");
            return;
        }

        // JSON 데이터 파싱
        MonsterDataList monsterDataList = JsonUtility.FromJson<MonsterDataList>(MonsterJsonData.text);
        if (monsterDataList == null || monsterDataList.MonsterData == null)
        {
            Debug.LogError("JSON 데이터를 MonsterDataList로 파싱하는 데 실패");
            return;
        }

        // 각 MonsterData를 ScriptableObject로 저장
        string outputFolder = "Assets/SO/MonsterDataSO";
        if (!Directory.Exists(outputFolder))
        {
            Directory.CreateDirectory(outputFolder);
        }

        foreach (var monsterData in monsterDataList.MonsterData)
        {
            // ScriptableObject 생성
            MonsterDataSO monsterSO = ScriptableObject.CreateInstance<MonsterDataSO>();
            monsterSO.id = monsterData.Id;
            monsterSO.name = monsterData.Name;
            monsterSO.attackRange = monsterData.AttackRange;
            monsterSO.skillRange = monsterData.SkillRange;
            monsterSO.forceTransitionTime = monsterData.ForceTransitionTime;
            monsterSO.force = monsterData.Force;
            monsterSO.skillTransitionTime = monsterData.SkillTransitionTIme;
            monsterSO.dealingStartTransitionTime = monsterData.DealingStartTransitionTime;
            monsterSO.dealingEndTransitionTime = monsterData.DealingEndTransitionTime;
            monsterSO.baseSpeed = monsterData.BaseSpeed;
            monsterSO.baseRotationDamping = monsterData.BaseRotationDamping;
            monsterSO.walkSpeedModifier = monsterData.WalkSpeedModifier;
            monsterSO.chaseSpeedModifier = monsterData.ChaseSpeedModifier;
            monsterSO.playerChasingRange = monsterData.PlayerChasingRange;
            monsterSO.hp = monsterData.Hp;
            monsterSO.attackPower = monsterData.AttackPower;

            // ScriptableObject를 프로젝트에 저장
            string assetPath = $"{outputFolder}/{monsterData.Name}.asset";
            AssetDatabase.CreateAsset(monsterSO, assetPath);
        }

        // 에셋 저장 및 갱신
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();

        Debug.Log("ScriptableObject 변환 및 저장 완료.");
    }
}

 

 

 

아 몰라 나 이제 쉴 거야!