0423 ui scroll view+데이터 테이블 연동

2021. 4. 23. 11:02unity

스크롤 뷰 영역을 정할 빈 오브젝트 생성
스크롤 뷰 컴포넌트에 이미지를 붙혀 대충 영역 표시를 가시화 시켜주고
스크롤 뷰 오브젝트 안에 컨텐츠 영역용 빈 오브젝트 만들어서 영역 설정
컨텐츠 안에 반복할 아이템용 빈 오브젝트 생성
컨텐츠에 스크롤 방향에 따른 레이아웃 컴포넌트 부착
스크롤 뷰에 붙은 컴포넌트들
컨텐츠에 붙은 컴포넌트들
컨텐츠 오브젝트 전체를 끌어서 Assign
1. 스크롤 영역=컨텐츠 영역, 그리고 그 안에 들어갈 리스트 영역을 먼저 잡아둔다.
2. 컨텐츠 영역에 vertical layout group 컴포넌트 붙혀준 뒤 컨텐츠 복사
4. 컨텐츠 영역에 content size fitter 컴포넌트 부착 후 스크롤 방법에 따라 preferred로 바꿔주기 
5. 스크롤 영역에 마스크 부착 후 show mask graphic 틱 꺼주기
컨텐츠 내용은 prefab으로 만들어둔다.

 


mission_data

id

name

goal

reward_id

reward_amount

sprite_name

int

string

int

int

int

string

1000

Collect {0} Golds

10000

100

5

mission_img_collect

1001

Play {0} times

500

101

10

mission_img_goal

1002

Kill {0} monsters

300

102

300

mission_img_kill

1003

New Episode open

1

101

5

mission_img_key

1004

Reash Level {0}

10

101

10

mission_img_crown

reward_data

id

name

int

string

100

하트

101

다이아몬드

102

골드

using UnityEngine;
using UnityEngine.U2D;

public class ScrollViewTest : MonoBehaviour
{

    // Start is called before the first frame update
    void Start()
    {
        DataManager.GetInstance().LoadDatas();
        var data = DataManager.GetInstance().dicMissionData[1000];
        var missionName = string.Format(data.name, data.goal);
        Debug.LogFormat(missionName);
    }
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;


public class DataManager 
{
    private static DataManager instance;
    public Dictionary<int, MissionData> dicMissionData;
    public Dictionary<int, RewardData> dicRewardData;

    private DataManager() 
    {
    }

    public static DataManager GetInstance() 
    {
        if (DataManager.instance == null) 
        {
            DataManager.instance = new DataManager();
        }
        return DataManager.instance;
    }

    public void LoadDatas() 
    {
        var ta = Resources.Load<TextAsset>("mission_data");
        var json = ta.text;
        this.dicMissionData = JsonConvert.DeserializeObject<MissionData[]>(json).ToDictionary(x => x.id);

        ta = Resources.Load<TextAsset>("reward_data");
        json = ta.text;
        this.dicRewardData = JsonConvert.DeserializeObject<RewardData[]>(json).ToDictionary(x => x.id);
    }
}

 

프리팹 불러오기

using UnityEngine;
using UnityEngine.U2D;

public class ScrollViewTest : MonoBehaviour
{
    public GameObject listItemPrefab;
    public Transform contents;
    // Start is called before the first frame update
    void Start()
    {
        DataManager.GetInstance().LoadDatas();
        for (int i = 0; i < DataManager.GetInstance().dicMissionData.Count; i++) 
        {
            var go = Instantiate<GameObject>(this.listItemPrefab,contents);
        }
    }

 

using UnityEngine;
using UnityEngine.U2D;

public class ScrollViewTest : MonoBehaviour
{
    public GameObject listItemPrefab;
    public Transform contents;
    // Start is called before the first frame update
    void Start()
    {
        DataManager.GetInstance().LoadDatas();
        foreach (var pair in DataManager.GetInstance().dicMissionData) 
        {
            var go = Instantiate<GameObject>(this.listItemPrefab, contents);
            var listItem = go.GetComponent<UIMissionItem>();
            var data = pair.Value;
            var missionName = string.Format(data.name, data.goal);
            listItem.Init(missionName);
        }
        
    }
using UnityEngine;
using UnityEngine.UI;

public class UIMissionItem : MonoBehaviour
{
    public Text txtName;
    
    public void Init(string missionName) 
    {
        this.txtName.text = missionName;
    }
    
}

 

using UnityEngine;
using UnityEngine.UI;

public class UIMissionItem : MonoBehaviour
{
    public Text txtName;
    public Image icon;
    
    public void Init(string missionName,Sprite icon) 
    {
        this.txtName.text = missionName;
        this.icon.sprite = icon;
    }
    
}
using UnityEngine;
using UnityEngine.U2D;

public class ScrollViewTest : MonoBehaviour
{
    public GameObject listItemPrefab;
    public Transform contents;
    public SpriteAtlas atlas;

    // Start is called before the first frame update
    void Start()
    {
        DataManager.GetInstance().LoadDatas();
        foreach (var pair in DataManager.GetInstance().dicMissionData) 
        {
            var go = Instantiate<GameObject>(this.listItemPrefab, contents);
            var listItem = go.GetComponent<UIMissionItem>();
            var data = pair.Value;
            var missionName = string.Format(data.name, data.goal);
            var icon = this.atlas.GetSprite(data.sprite_name);
            listItem.Init(missionName,icon);

            var sp = this.atlas.GetSprite(data.sprite_name);
        }
        
    }

    
}