아카이브

[SaveAndLoad] 데이터 연동 본문

유니티 심화

[SaveAndLoad] 데이터 연동

timbercat 2023. 9. 1. 18:20

캐릭터 썸네일 에셋 준비

테이블 생성하고 json파일로 변환 유니티에서  읽어오기

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

public class App : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        TextAsset aseet = Resources.Load<TextAsset>("Data/hero_data"); //json은 안 붙임
        Debug.Log(aseet);
    }

}

 

패키지 메니저에서 +누른 후 이름으로 추가하기로 com.unity.nuget.newtonsoft-json 인스톨

Json 파일 역직렬화

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

public class HeroData 
{
    public int id;
    public string name;
    public float max_hp;
    public float damage;
    public string prefab_name;
    public string sprite_name;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;  //네임 스페이스 추가 

public class App : MonoBehaviour
{
    void Start()
    {
        TextAsset asset = Resources.Load<TextAsset>("Data/hero_data");
        Debug.Log(asset.text);  //json 문자열 

        //역직렬화 
        HeroData[] heroDatas= JsonConvert.DeserializeObject<HeroData[]>(asset.text);
        foreach (HeroData data in heroDatas) {
            Debug.LogFormat("{0} {1} {2} {3} {4} {5}", data.id, data.name, data.max_hp, data.damage, data.prefab_name, data.sprite_name);
        }
    }
}

DataManager 만들기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;  //네임 스페이스 추가 

public class App : MonoBehaviour
{
    void Start()
    {
        DataManager.instance.LoadHeroData();
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HeroData 
{
    public int id;
    public string name;
    public float max_hp;
    public float damage;
    public string prefab_name;
    public string sprite_name;
}
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//싱글톤 
public class DataManager 
{
    public static readonly DataManager instance = new DataManager();

    private Dictionary<int, HeroData> dicHeroDatas = new Dictionary<int, HeroData>();
    //생성자 
    private DataManager()
    { 
    }

    public void LoadHeroData()
    {
        TextAsset asset = Resources.Load<TextAsset>("Data/hero_data");
        Debug.Log(asset.text);  //json 문자열 

        //역직렬화 
        HeroData[] heroDatas = JsonConvert.DeserializeObject<HeroData[]>(asset.text);
        foreach (HeroData data in heroDatas)
        {
            Debug.LogFormat("{0} {1} {2} {3} {4} {5}", data.id, data.name, data.max_hp, data.damage, data.prefab_name, data.sprite_name);
            this.dicHeroDatas.Add(data.id, data);   //사전에 추가 
        }

        Debug.LogFormat("HeroData 로드 완료 : {0}", this.dicHeroDatas.Count);
    }
}

변하는 데이터와 변하지 않는 데이터 객체 만들기

HeroInfo 스크립트 만들기

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

public class HeroInfo : MonoBehaviour
{
    public int id;
    public float hp;
    public float damage;

    public HeroInfo(int id, float hp, float damage)
    {
        this.id = id;
        this.hp = hp;
        this.damage = damage;
    }
}

케릭터들 프리팹으로 만들어줌

App

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;  //네임 스페이스 추가 

public class App : MonoBehaviour
{
    //프리팹이 저장될 변수 
    private List<GameObject> prefabs = new List<GameObject>();

    void Start()
    {
        //데이터 로드 
        DataManager.instance.LoadHeroData();

        //프리팹 리소스 로드 
        this.LoadPrefabs();
    }

    private void LoadPrefabs()
    {
        List<string> heroPrefabNames = DataManager.instance.GetHeroPrefabNames();

        foreach (string prefabName in heroPrefabNames)
        {
            string path = string.Format("Prefabs/{0}", prefabName);
            Debug.Log(path);
            GameObject prefab = Resources.Load<GameObject>(path);
            this.prefabs.Add(prefab);
        }
        Debug.LogFormat("프리팹들이 로드 되었습니다. count: {0}", this.prefabs.Count);
    }
}

DataManager

using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//싱글톤 
public class DataManager
{
    public static readonly DataManager instance = new DataManager();

    private Dictionary<int, HeroData> dicHeroDatas = new Dictionary<int, HeroData>();
    //생성자 
    private DataManager()
    {
    }

    public void LoadHeroData()
    {
        TextAsset asset = Resources.Load<TextAsset>("Data/hero_data");
        Debug.Log(asset.text);  //json 문자열 

        //역직렬화 
        HeroData[] heroDatas = JsonConvert.DeserializeObject<HeroData[]>(asset.text);
        foreach (HeroData data in heroDatas)
        {
            Debug.LogFormat("{0} {1} {2} {3} {4} {5}", data.id, data.name, data.max_hp, data.damage, data.prefab_name, data.sprite_name);
            this.dicHeroDatas.Add(data.id, data);   //사전에 추가 
        }

        Debug.LogFormat("HeroData 로드 완료 : {0}", this.dicHeroDatas.Count);
    }

    public List<string> GetHeroPrefabNames()
    {
        List<string> list = new List<string>();
        foreach (HeroData data in this.dicHeroDatas.Values)
        {
            list.Add(data.prefab_name);
        }
        return list;
    }
}

버튼 눌러서 프리팹 인스턴스화

버튼에 따라서 다른 종류의 히어로 캐릭터 생성

 

'유니티 심화' 카테고리의 다른 글

LearnUGUI  (0) 2023.09.04
[주말] Input System 연습  (0) 2023.09.04
HeroShooter 적이 플레이어 추적  (0) 2023.08.29
Hero Shooter 문열기, 애니메이션 적용  (0) 2023.08.24
Hero Shooter 조이스틱 이동, 포탈생성  (0) 2023.08.23