아카이브
[SaveAndLoad] 데이터 연동 본문
캐릭터 썸네일 에셋 준비
테이블 생성하고 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 |