Unity/유니티 기본

[4.27] 세로 Scroll View

ljw4104 2021. 4. 27. 15:39

결과물

MissionItem.cs

프리팹에 붙는 스크립트

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

public class MissionItem : MonoBehaviour
{
    public GameObject completeGo;
    public GameObject doingGo;
    public UILabel missionName;
    public UILabel missionDesc;
    public UILabel compleItemNum;
    public UILabel doingItemNum;
    public UILabel playerDoing;
    public UILabel completeProgress;
    public UISprite missionIcon;
    public UISprite slider;
    public UISprite compleItem;
    public UISprite doingItem;

    public void Init(string name, string desc, string iconPath, int progress, int complete, bool isComplete, string path, int itemNum)
    {
        this.missionName.text = name;
        this.missionDesc.text = desc;
        this.missionIcon.spriteName = iconPath;

        if (!isComplete)
        {
            this.completeGo.SetActive(false);
            this.slider.fillAmount = (float)progress / (float)complete;
            this.doingItem.spriteName = path;
            this.doingItem.MakePixelPerfect();
            this.doingItemNum.text = itemNum.ToString();
            this.playerDoing.text = progress.ToString();
            this.completeProgress.text = complete.ToString();
        }
        else
        {
            this.doingGo.SetActive(false);
            this.compleItem.spriteName = path;
            this.compleItem.MakePixelPerfect();
            this.compleItemNum.text = itemNum.ToString();
        }
    }
}

 

Mission.cs

Grid에 붙이는 코드, 저장은 따로 구현안함 (UserInfo형 객체 만들고 기본값으로 다 넣으면 끝)

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

public class Mission : MonoBehaviour
{
    public GameObject missionPrefab;
    public Transform grid;

    // Start is called before the first frame update
    void Start()
    {
        DataManager.Instance.Init();
        for(int i = 0; i < DataManager.Instance.arrMissison.Count; i++)
        {
            MissionData mission = DataManager.Instance.arrMissison[i + 1];
            UserInfo user = DataManager.Instance.arrUserInfo[i + 1];
            var go = Instantiate(this.missionPrefab, this.grid);
            go.GetComponent<MissionItem>().Init(mission.mission_name, mission.mission_desc, mission.icon_path, user.progress, mission.completeProgress, user.isComplete,
                DataManager.Instance.arrReward[mission.rewardID].item_path, DataManager.Instance.arrReward[mission.rewardID].item_num);
        }
    }
}

 

Mission Prefab구조

Complete 상태의 미션프리팹이랑 Doing 상태의 미션 프리팹을 겹쳐놓은뒤, 완료인가 미완료인가 구분하여 하나를 꺼주는 식으로 구현하였다.

Drag Scroll View에 Scroll View 속성에 값을 먼저 넣은 뒤에 프리팹화 해주는게 편하다.

 

Scroll View 컴포넌트와 Grid 컴포넌트의 방향을 Vertical로 해주어야 한다. 아니면 가로로 드래그됨.

 

더보기

DataManager.cs

제일 귀찮다.

자동화코드를 언젠가 한번 만들어야 할듯. 라이브러리로

using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;

public class DataManager : MonoBehaviour
{
    public Dictionary<int, MissionData> arrMissison;
    public Dictionary<int, RewardData> arrReward;
    public Dictionary<int, UserInfo> arrUserInfo;

    private static DataManager instance;
    public static DataManager Instance
    {
        get
        {
            if(instance == null)
            {
                instance = FindObjectOfType<DataManager>();
            }
            return instance;
        }
    }
    private DataManager() { }
    public void Init()
    {
        this.GetDatas();
    }
    private void GetDatas()
    {
        var ta = Resources.Load<TextAsset>("MissionData");
        var json = ta.text;
        this.arrMissison = JsonConvert.DeserializeObject<MissionData[]>(json).ToDictionary(x => x.id);

        ta = Resources.Load<TextAsset>("RewardData");
        json = ta.text;
        this.arrReward = JsonConvert.DeserializeObject<RewardData[]>(json).ToDictionary(x => x.rewardID);

        ta = Resources.Load<TextAsset>("user_info");
        json = ta.text;
        this.arrUserInfo = JsonConvert.DeserializeObject<UserInfo[]>(json).ToDictionary(x => x.id);
    }
}