Unity/UIUX프로그래밍

0423 _ 스크롤에 만든 데이터 불러오기

minquu 2021. 4. 23. 16:32
반응형

스크롤 만들었다..

 

 

 

데이터불러오기 

 

테이블 부터 만들기 

 

 

 

 

필요한 것을 먼저 정리한 후 

 

Json 파일로 만들어준다.

 

 

맵핑할 스크립터를 만들어준다 .

 

 

 

관리를 해줄 데이터매니저를 만들어서 로드를 해준다.

데이터는 리소스 폴더에  넣어 줌

 

데이터 로드를 끝나면

--

 

로드가 끝나면 아이템의 프리팹을 만들어보고,

로드된 데이타가 잘 출력되는지 확인을 한다.

 

0.먼저 아이템프리팹에 스크립터를 달아주고, text 변수를 넣어서 Init에 받아서 변경시켜준다.

 

Init 으로 외부(상위 클래스)에서 전달을 받으면 텍스트를 변경 시켜준다.

 

 

1. 관리해주는 스크립터에서, 프리팹을 달아주고, 값을 전달해준다.

 

    public GameObject listItemPrefab;
    public Transform contents;

생성할 프리팹을 받습니다.

붙일 (부모가 되는) 오브젝트의 트샌스 값을 가져와준다.

 

 void Start()
    {
        DataManager.GetInstance().LoadDatas();

        foreach (var pair in DataManager.GetInstance().dicMissionDatas) {
            var go = Instantiate<GameObject>(this.listItemPrefab, contents);
            var listItem = go.GetComponent<UIItem>();
            var data = pair.Value;
            var missionName = string.Format(data.name, data.goal);
            listItem.Init(missionName);
        }
    }

foreach 문으로 딕셔너리의 값을 구해온다. (pair 는 키와 밸류로 찾는다.)

 

 

 var go = Instantiate<GameObject>(this.listItemPrefab, contents);

인스턴스를 해준다. 생성될 프리팹, 위치(종속이 되는 것)

 

var listItem = go.GetComponent<UIItem>();

그생성된 오브젝트 안에 UIItem 스크립터를 가져온다.

 

            var data = pair.Value;

data 변수에 딕셔너리의 값을 집어넣어준다.

            var missionName = string.Format(data.name, data.goal);

missionName 에 string.Format() 구조로 넣어준다.

 

 

listItem.Init(missionName);

UIItem 스크립터에 Init 안에 값을 넣어준다.

 

----

 

 

2.필요한 곳에 어사인를 해주고 테스트를 해본다.

 

 

 

 

3. Info 만들어주기

 

데이터 테이블 중에

Data 파일은 변화가 없는 고정된 값 위주로 만들어주고

 

Info 파일은 값이 계속 변화되는 값을 써주는 경우가 많다. (별, 현재 클리어한 양 등등)

 

 

 

MissionInfo //미션의 인포가 들어가는 스크립터

GameInfo // 여러가지 게임 중 사용하는 인포를 받는곳

 

두 개를 만들어준다.

 

 

MissionInfo

 

생성자에서 받아서 데이터가 맵핑이 되게한다.

 

 

 

 

GameInfo

 

게임 인포에서는 미션인포를 배열로 받아서 관리하도록한다.

 

4. 관리해주는 스크립터에서 데이터를 저장해준다.

 

 

 

 public GameInfo gameInfo;
    public int maxItem = 5;

게임인포 변수를 만들어주고,

목록이 되는 것의 최대 갯수를 정해준다.

 

  var path = string.Format("{0}/game_info.json", Application.persistentDataPath);

 

데이터를 저장해주는 경로를 path에 넣어준다.

 

 if (File.Exists(path))
        {
            //파일이 존재한다.
        }

존재하면 나중에

 

 else {//그렇지 않으면 신규유저 
              //데이터를 만들어준다.
            this.gameInfo = new GameInfo();
            for (int i = 0; i < this.maxItem; i++) {
                var state = 0;
                if (i == 0)
                {
                    state = 1;
                }
                else if (i == 1) {
                    state = 2;
                }
                var missionInfo = new MissionInfo(1000 + i, 0, 0, state);
                this.gameInfo.missionInfos.Add(missionInfo);
            }
            var json = JsonConvert.SerializeObject(this.gameInfo);
            File.WriteAllText(path, json);
        }

 

신규유저라면

  this.gameInfo = new GameInfo();

게임인포를 인스턴스를해주고,

 for (int i = 0; i < this.maxItem; i++) {
                var state = 0;
                if (i == 0)
                {
                    state = 1;
                }
                else if (i == 1) {
                    state = 2;
                }

최대 갯수만큼 i 값을 돌려준다. (0 doing 1 done 2 complete)

var state = 0 ; // 초기값은 doing 으로 

 

if 인덱스의 0이면, 처음 목록이면 상태를 1로

 

두번째는 complete로 state 값을 초기화 해줄것이다.

 

                var missionInfo = new MissionInfo(1000 + i, 0, 0, state);

 

 

MissionInfo에 생성자로 값을 건내주고, missioninfo를 만들어준다.

 

this.gameInfo.missionInfos.Add(missionInfo);

게임인포 배열 // 안의 missioninfos 에 값을 넣어준다. (for으로 하나씩 넣어주는 것이다.)

 

var json = JsonConvert.SerializeObject(this.gameInfo);

 

게임인포를 직렬화를해주고,

            File.WriteAllText(path, json);

 

경로, 데이터 를 저장해준다.

 

 

=

 

만약 파일이 있다면

 

그 파일 기준으로 역직렬화를 해준다.

 

 

 

5. UIItem 스크립터를 수정해준다. (Item이 되는 녀석)

 

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

public class UIItem : MonoBehaviour
{
    public enum eMissionState { 
        DOING, DONE, COMPLETE
    }
    public Image[] stateIcons;
    public GameObject doingGo;
    public GameObject doneGo;
    public GameObject completeGo;
    public Text txtName;

    private eMissionState state;

    public void Init(string txtName, eMissionState state)
    {
        this.state = state;
        this.txtName.text = txtName;
        switch (this.state) {
            case eMissionState.DOING:
                {
                    this.doingGo.SetActive(true);
                    this.doneGo.SetActive(false);
                    this.completeGo.SetActive(false);
                }
                break;
            case eMissionState.DONE:
                {
                    this.doingGo.SetActive(false);
                    this.doneGo.SetActive(true);
                    this.completeGo.SetActive(false);
                }
                break;
            case eMissionState.COMPLETE:
                {
                    this.doingGo.SetActive(false);
                    this.doneGo.SetActive(false);
                    this.completeGo.SetActive(true);
                }
                break;
        }
    }
}

 

 

    public enum eMissionState { 
        DOING, DONE, COMPLETE
    }
    public Image[] stateIcons;
    public GameObject doingGo;
    public GameObject doneGo;
    public GameObject completeGo;
    public Text txtName;

    private eMissionState state;

 

이넘 타입을 지정해주고,

필요한 변수를 지정해준다.

 

public void Init(string txtName, eMissionState state)

 

외부에서 Init 하면 값을 받아오도록한다.

 

 this.state = state;
        this.txtName.text = txtName;
        switch (this.state) {
            case eMissionState.DOING:
                {
                    this.doingGo.SetActive(true);
                    this.doneGo.SetActive(false);
                    this.completeGo.SetActive(false);
                }
                break;
            case eMissionState.DONE:
                {
                    this.doingGo.SetActive(false);
                    this.doneGo.SetActive(true);
                    this.completeGo.SetActive(false);
                }
                break;
            case eMissionState.COMPLETE:
                {
                    this.doingGo.SetActive(false);
                    this.doneGo.SetActive(false);
                    this.completeGo.SetActive(true);
                }
                break;
        }

 

외부에서 받은 값을 현재 아이템 클래스에 변수에 넣는다. 

 

 

 

★6. 인포와 Data를 써서 Init에 넣어주기

 

 

 

★ (쌤이 봐주신것)

 

 var info = this.gameInfo.missionInfos.Find(x => x.id == data.id);
            if (info != null) {
                uIItem.Init(missionName,(UIItem.eMissionState)info.state);
            }

 

info 에  위에서 가져온 gameInfo.missionInfos.(★중요)Find를 쓰고 (x => x.id == data.id) // data.id로 id를 찾아서 

info로 꺼낸다.

info가 낫 널이면

Init에 넣어준다.

 

해결!

 

 

 

---

 

일단 2가지만 넣음

 

 

 

반응형