using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test06UIMain : MonoBehaviour
{
[SerializeField]
private UIMissionScrollView missionScrollView;
// Start is called before the first frame update
void Start()
{
DataManager.instance.LoadMissionData();
this.missionScrollView.Init();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIMissionCell : MonoBehaviour
{
[SerializeField]
protected string icon_name;
public string Icon_name
{
get
{
return this.icon_name;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIMissionScrollView : MonoBehaviour
{
[SerializeField]
private UIMissionCell[] cells;
// Start is called before the first frame update
void Start()
{
for (int i = 0; i < cells.Length; i++)
{
UIMissionCell cell = cells[i];
Debug.LogFormat("<color=yellow>data.icon_name:{0}</color>", cell.Icon_name);
}
}
public void Init()
{
List<MissionData> missionDatas = DataManager.instance.GetMissionDatas();
foreach(MissionData data in missionDatas)
{
Debug.LogFormat("<color=green>id:{0}, name:{1}</color>", data.id, data.name);
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MissionData
{
public int id;
public string name;
public string desc;
public int goal;
public string icon_name;
public int mission_icon_width;
public int mission_icon_height;
public int reward_amount;
public string reward_icon_name;
public int reward_icon_width;
public int reward_icon_height;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.Runtime.InteropServices.WindowsRuntime;
using Newtonsoft.Json.Bson;
using System.Linq;
public class DataManager :MonoBehaviour
{
public static readonly DataManager instance = new DataManager();
private Dictionary<int, ChestData> dicChestDatas = new Dictionary<int, ChestData>();
// Start is called before the first frame update
private DataManager()
{
}
public void LoadChestData()
{
TextAsset asset = Resources.Load<TextAsset>("chest_data");
Debug.Log(asset.text);
ChestData[] chestDatas = JsonConvert.DeserializeObject<ChestData[]>(asset.text);
foreach (ChestData data in chestDatas)
{
this.dicChestDatas.Add(data.id, data);
}
Debug.LogFormat("dicchestDatas:{0}", dicChestDatas.Count);
}
public List<ChestData> GetChestDatas()
{
return this.dicChestDatas.Values.ToList();
}
private Dictionary<int, MissionData> dicMissionDatas;
public void LoadMissionData()
{
//Resources 폴더에서 mossion_data에셋(Test asset)을 로드
TextAsset asset = Resources.Load<TextAsset>("mission_data");
//가져오기
//string json = asset.text;
Debug.Log(asset.text);
//역직렬화
MissionData[] arrMissionDatas = JsonConvert.DeserializeObject<MissionData[]>(asset.text);
Debug.LogFormat("arrMissionDatas:{0}", arrMissionDatas.Length);
//사전에 넣기
this.dicMissionDatas = arrMissionDatas.ToDictionary(x => x.id);
}
public List<MissionData> GetMissionDatas()
{
return this.dicMissionDatas.Values.ToList();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Test06UIMain : MonoBehaviour
{
[SerializeField]
private UIMissionScrollView missionScrollView;
[SerializeField]
protected Button btnSave;
// Start is called before the first frame update
void Start()
{
DataManager.instance.LoadMissionData();
AtlasManager.instance.LoadAtlases();
this.missionScrollView.Init();
this.btnSave.onClick.AddListener (() =>
{
Debug.Log("save");
});
}
private void Save()
{
Debug.Log(Application.persistentDataPath);
//직렬화
List<UIMissionCell>cells=this.missionScrollView.GetMissionCells();
foreach(UIMissionCell cell in cells)
{
Debug.LogFormat("{0}{1}", cell.Id, cell.Count);
MissionInfo info = new MissionInfo(cell.Id, cell.Count);
}
}
}
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.U2D;
using System;
public class UIMissionCell : MonoBehaviour
{
public enum eState
{
Doing,Complete
}
[SerializeField]
protected string icon_name;
[SerializeField]
private TMP_Text txtMissionProgress;
[SerializeField]
private TMP_Text txtMissionName;
[SerializeField]
private TMP_Text txtMissionDesc;
[SerializeField]
private Image missionIcon;
[SerializeField]
private Image rewardIcon;
private MissionData data;
public string Icon_name
{
get
{
return this.icon_name;
}
}
public int Id
{
get
{
return this.data.id;
}
}
private int count;
public int Count
{
get
{
return this.count;
}
}
public void Init(MissionData data)
{
this.data = data;
this.txtMissionName.text = data.name;
this.txtMissionDesc.text = data.desc;
var atlas = AtlasManager.instance.GetAtlas("UIMissionAtlas");
this.missionIcon.sprite = atlas.GetSprite(data.icon_name);
this.rewardIcon.sprite = atlas.GetSprite(data.reward_icon_name);
this.txtMissionProgress.text = string.Format("0 / {0}", data.goal);
}
public void ApplyCount()
{
Debug.LogFormat("{0}({1})미션을 {2}개 진행 했습니다",this.data.name,this.data.id,0);
//float percent = (float)cnt / this.data.goal;
//this.slider.value = percent;
}
public int GetGoal()
{
if (this.data == null) return -1 ;
return this.data.goal;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.TerrainTools;
[CustomEditor(typeof(UIMissionCell))]
public class UIMissionCellOnInspector : Editor
{
private int SliderValue;
public override void OnInspectorGUI()
{
base.OnInspectorGUI(); //기존꺼
UIMissionCell cell= this.target as UIMissionCell;//커스텀 에디트대상 컴포넌트
GUILayout.Space(10);//10픽셀정도 띤다
//플레이 했을때 보여주기
EditorGUILayout.BeginHorizontal();
GUILayout.Label("0");
this.SliderValue = EditorGUILayout.IntSlider(this.SliderValue, 0, cell.GetGoal());//
GUILayout.Label(cell.GetGoal().ToString());
GUILayout.EndHorizontal();
if (GUILayout.Button("Apply Count"))
{
Debug.Log("미션 진행 수를 반영합니다.");
cell.ApplyCount();//UIMissionCell의 applyCount메서드 호출
}//추가한거
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;
public class UIMissionScrollView : MonoBehaviour
{
[SerializeField]
private Transform content;
[SerializeField]
private GameObject UiMissionCellPrefab;
[SerializeField]
private SpriteAtlas atlas;
private List<UIMissionCell> uiMissionCells;
// Start is called before the first frame update
void Start()
{
//for (int i = 0; i < cells.Length; i++)
//{
// UIMissionCell cell = cells[i];
// Debug.LogFormat("<color=yellow>data.icon_name:{0}</color>", cell.Icon_name);
//}
}
public void Init()
{
this.uiMissionCells = new List<UIMissionCell>();
List<MissionData> missionDatas = DataManager.instance.GetMissionDatas();
foreach(MissionData data in missionDatas)
{
Debug.LogFormat("<color=green>id:{0}, name:{1}</color>", data.id, data.name);
UIMissionCell cell = null;
GameObject go = Instantiate<GameObject>(this.UiMissionCellPrefab, content);
cell = go.GetComponent<UIMissionCell>();
cell.Init(data);
}
}
public List<UIMissionCell> GetMissionCells()
{
return uiMissionCells;
}
}
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.U2D;
using System;
public class UIMissionCell : MonoBehaviour
{
public enum eState
{
Doing,Complete
}
[SerializeField]
protected string icon_name;
[SerializeField]
private TMP_Text txtMissionProgress;
[SerializeField]
private TMP_Text txtMissionName;
[SerializeField]
private TMP_Text txtMissionDesc;
[SerializeField]
private Image missionIcon;
[SerializeField]
private Image rewardIcon;
public Slider slider;
private int doingAmount = 0;
private MissionData data;
public string Icon_name
{
get
{
return this.icon_name;
}
}
public int Id
{
get
{
return this.data.id;
}
}
private int count;
public int Count
{
get
{
return this.count;
}
}
public void Init(MissionData data)
{
this.data = data;
this.txtMissionName.text = data.name;
this.txtMissionDesc.text = data.desc;
var atlas = AtlasManager.instance.GetAtlas("UIMissionAtlas");
this.missionIcon.sprite = atlas.GetSprite(data.icon_name);
this.rewardIcon.sprite = atlas.GetSprite(data.reward_icon_name);
this.txtMissionProgress.text = string.Format("0 / {0}", data.goal);
float progress = (float)this.doingAmount / this.data.goal;
Debug.LogFormat("<color=lime>{0}%</color>0", progress);
this.slider.value = progress;
}
public void ApplyCount(int cnt)
{
Debug.LogFormat("{0}({1})미션을 {2}개 진행 했습니다",this.data.name,this.data.id,cnt);
float percent = (float)cnt / this.data.goal;
this.slider.value = percent;
}
public int GetGoal()
{
if (this.data == null) return -1 ;
return this.data.goal;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.TerrainTools;
[CustomEditor(typeof(UIMissionCell))]
public class UIMissionCellOnInspector : Editor
{
private int SliderValue;
public override void OnInspectorGUI()
{
base.OnInspectorGUI(); //기존꺼
UIMissionCell cell= this.target as UIMissionCell;//커스텀 에디트대상 컴포넌트
GUILayout.Space(10);//10픽셀정도 띤다
if (cell.GetGoal() >= 0)
{
//플레이 했을때 보여주기
EditorGUILayout.BeginHorizontal();
GUILayout.Label("0");
this.SliderValue = EditorGUILayout.IntSlider(this.SliderValue, 0, cell.GetGoal());//
GUILayout.Label(cell.GetGoal().ToString());
GUILayout.EndHorizontal();
if (GUILayout.Button("Apply Count"))
{
Debug.Log("미션 진행 수를 반영합니다.");
cell.ApplyCount(this.SliderValue);//UIMissionCell의 applyCount메서드 호출
}//추가한거
}
}
}
저장하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Newtonsoft.Json;
using System.IO;
using UnityEditor;
public class Test06UIMain : MonoBehaviour
{
[SerializeField]
private UIMissionScrollView missionScrollView;
[SerializeField]
protected Button btnSave;
// Start is called before the first frame update
void Start()
{
DataManager.instance.LoadMissionData();
AtlasManager.instance.LoadAtlases();
this.missionScrollView.Init();
this.btnSave.onClick.AddListener (() =>
{
Debug.Log("save");
this.Save();
});
}
private void Save()
{
List<UIMissionCell>cells=this.missionScrollView.GetMissionCells();
//직렬화 대상 객체 만들기
List<MissionInfo> missionInfos = new List<MissionInfo>();
foreach(UIMissionCell cell in cells)
{
Debug.LogFormat("{0}{1}", cell.Id, cell.Count);
MissionInfo info = new MissionInfo(cell.Id, cell.Count);
missionInfos.Add(info);
}
//직렬화
string json = JsonConvert.SerializeObject(missionInfos);
Debug.Log(json);
//파일로 저장
string fileName = "mission_infos.json";
string path = string.Format("{0}/{1}", Application.persistentDataPath, fileName);
Debug.Log(path);
File.WriteAllText(path, json);
Debug.Log("<color=yellow>SAVED!</color>");
EditorUtility.RevealInFinder(Application.persistentDataPath); //파일 위치 열리게 하는거
}
}
생성됨
계속
MonoBehaviour .destroyCancellationToken 오류가 남
missionInfo의 monobehaviour를 삭제하니 해결됨
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;
public class UIMissionScrollView : MonoBehaviour
{
[SerializeField]
private Transform content;
[SerializeField]
private GameObject UiMissionCellPrefab;
[SerializeField]
private SpriteAtlas atlas;
//1.객체를 그룹화하고 관리하는 방법 2가지(배열, 컬렉션)
private List<UIMissionCell> uiMissionCells;
public void Init()
{
//컬렉션 사용하기 전에 반드시 인스턴스화
this.uiMissionCells = new List<UIMissionCell>();
List<MissionData> missionDatas = DataManager.instance.GetMissionDataList();
for (int i = 0; i < missionDatas.Count; i++)
{
MissionData data = missionDatas[i];
this.CreateUIMissionCell(data);
}
//List<MissionData> missionDatas = DataManager.instance.GetMissionDatas();
//foreach (MissionData data in missionDatas)
//{
// Debug.LogFormat("<color=green>id:{0}, name:{1}</color>", data.id, data.name);
// UIMissionCell cell = null;
// GameObject go = Instantiate<GameObject>(this.UiMissionCellPrefab, content);
// cell = go.GetComponent<UIMissionCell>();
// cell.Init(data);
//}
}
private void CreateUIMissionCell(MissionData data)
{
GameObject go = Instantiate(this.UiMissionCellPrefab, this.content);
UIMissionCell cell = go.GetComponent<UIMissionCell>();
cell.Init(data);
//컬렉션에 추가
this.uiMissionCells.Add(cell);
}
public List<UIMissionCell> GetMissionCells()
{
return uiMissionCells;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MissionInfo
{
public int id;
public int count;
public MissionInfo(int id, int count)
{
this.id = id;
this.count = count;
}
}
카운트가 제대로 안나옴
public void ApplyCount(int count)
{
this.count = count;
Debug.LogFormat("{0}({1})미션을 {2}개 진행 했습니다",this.data.name,this.data.id,count);
float percent = (float)count / this.data.goal;
this.slider.value = percent;
}
코드 추가 후 제대로 나옴
불러오기
집가서 mission 다시 해봐야할것같다 .. sprite 찾기도 시간된다면 ppt도 살짝 제작하기
'유니티 심화' 카테고리의 다른 글
유니티 절대강좌 챕터3 (0) | 2023.09.25 |
---|---|
UIPlayResult (0) | 2023.09.12 |
주말과제(Goldshop) (0) | 2023.09.11 |
UI Chest Shop(수정) (0) | 2023.09.08 |
ui 스테이지 (0) | 2023.09.06 |