본문 바로가기
유니티 심화

mission

by 노재두내 2023. 9. 11.
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