using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AppMain : MonoBehaviour
{
void Start()
{
TextAsset asset = Resources.Load<TextAsset>("Data/hero_data");
Debug.Log(asset.text);
}
}
13. 스크립트(AppMain)에 json파일의 경로(path)연결 후 Debug로 로그 확인 해보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json; //네임 스페이스 추가
public class AppMain : MonoBehaviour
{
void Start()
{
TextAsset asset = Resources.Load<TextAsset>("Data/hero_data");//Unity의 Resources 폴더에서 파일을 로드
Debug.Log(asset.text); //json 문자열
//역직렬화
HeroData[] heroDatas= JsonConvert.DeserializeObject<HeroData[]>(asset.text); //Json 문자열을 HeroData[] 타입으로 역직렬화
foreach (HeroData data in heroDatas) { //역직렬화 된 HeroData 객체들의 정보를 순회하며 출력
Debug.LogFormat("{0} {1} {2} {3} {4} {5}", data.id, data.name, data.max_hp, data.damage, data.prefab_name, data.sprite_name);
}
}
}
18. AppMain 스크립트에서 데이터 역직렬화를 위한 코드 추가
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json; //네임 스페이스 추가
using UnityEngine.UI;
using System;
public class AppMain : MonoBehaviour
{
//프리팹이 저장될 변수
private List<GameObject> prefabs = new List<GameObject>();
[SerializeField]
private Button[] btns; //버튼 배열 인스턴스 선언
void Start()
{
DataManager.instance.LoadHeroData();
//프리팹 리소스 로드
this.LoadPrefabs();
//버튼 이벤트 붙이기
foreach (Button btn in this.btns)
{
btn.onClick.AddListener(() => {
var text = btn.gameObject.GetComponentInChildren<Text>(); //버튼의 텍스트(id)를 받아옴
Debug.Log(text.text);
int id = Convert.ToInt32(text.text);
this.CreateHero(id); //id를 통해 Hero프리팹 인스턴스 생성
});
}
}
private void CreateHero(int id)
{
int index = id - 100;
Debug.LogFormat("index: {0}", index);
GameObject prefab = this.prefabs[index];
Debug.Log(prefab);
GameObject heroGo = new GameObject();
heroGo.name = "Hero";
Instantiate<GameObject>(prefab, heroGo.transform);
}
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);
}
}
35. 버튼 배열 선언과 버튼 이벤트 넣기(Hero 생성)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Hero : MonoBehaviour
{
private HeroInfo info; //hero의 가변적 데이터
private GameObject model; // hero의 프리팹
public void Init(HeroInfo info, GameObject model)
{
this.info = info;
this.model = model;
Debug.LogFormat("Init: {0}, {1}", this.info, this.model);
}
}
39. HeroInfo와 프리팹을 담는 Hero 스크립트 작성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json; //네임 스페이스 추가
using UnityEngine.UI;
using System;
using System.IO;
public class AppMain : MonoBehaviour
{
//프리팹이 저장될 변수
private List<GameObject> prefabs = new List<GameObject>();
[SerializeField]
private Button[] btns; //버튼 배열 인스턴스 선언
void Start()
{
DataManager.instance.LoadHeroData();
//프리팹 리소스 로드
this.LoadPrefabs();
//버튼 이벤트 붙이기
foreach (Button btn in this.btns)
{
btn.onClick.AddListener(() => {
var text = btn.gameObject.GetComponentInChildren<Text>(); //버튼의 텍스트(id)를 받아옴
Debug.Log(text.text);
int id = Convert.ToInt32(text.text);
this.CreateHero(id); //id를 통해 Hero프리팹 인스턴스 생성
});
}
}
private void CreateHero(int id)
{
string filePath = string.Format("{0}/hero_info.json", Application.persistentDataPath);
Debug.Log(filePath);
HeroInfo heroInfo = null; //변수 정의
if (File.Exists(filePath)) //있다 (기존유저)
{
Debug.Log("<color=red>기존유저</color>");
// 파일 로드 후 역직렬화, HeroInfo 객체 생성
string jsonData = File.ReadAllText(filePath);
heroInfo = JsonConvert.DeserializeObject<HeroInfo>(jsonData);
}
else //없다 (신규유저)
{
Debug.Log("<color=green>신규유저</color>");
HeroData heroData = DataManager.instance.GetHeroData(id);
heroInfo = new HeroInfo(heroData.id, heroData.max_hp, heroData.damage);
// 생성된 HeroInfo 객체를 직렬화하여 JSON 파일로 저장
string jsonData = JsonConvert.SerializeObject(heroInfo);
File.WriteAllText(filePath, jsonData);
}
int index = id - 100;
Debug.LogFormat("index: {0}", index);
GameObject prefab = this.prefabs[index];
Debug.Log(prefab);
GameObject heroGo = new GameObject();
heroGo.name = "Hero";
GameObject model = Instantiate<GameObject>(prefab, heroGo.transform); // model은 heroGo의 자식객체로 인스턴스화
Hero hero = heroGo.AddComponent<Hero>();
hero.Init(heroInfo, model); //Hero 컴포넌트에 model과 info를 넘김
}
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);
}
}
40. hero_info.json 파일을 로드 또는 생성하기 위해 AppMain 수정
'KDT > 유니티 심화' 카테고리의 다른 글
LearnUGUI 연습 (1. 프로젝트 세팅하기) (0) | 2023.09.04 |
---|---|
유니티 데이터 연동 연습 (UISlot만들기) (0) | 2023.09.02 |
[SpaceShooter] 라이트 프로브 연습 (0) | 2023.08.31 |
[SpaceShooter] 라이트 매핑 연습 (0) | 2023.08.31 |
[SpaceShooter] 오브젝트 풀링 연습 (0) | 2023.08.28 |