유니티3D 프로그래밍

Unity UGUI 미션 창 구현 (21.04.23) 본문

Unity/수업내용

Unity UGUI 미션 창 구현 (21.04.23)

tjdgus9955 2021. 4. 23. 15:39

미션 UI 구현

1차

2차

 

미션 창 UI를 구현했고 내부 미션 오브젝트는 프리펩으로 구성해서 데이터 파일을 통해 각각의 미션들을 스크립트로 구현할 예정임. 현재 미션 미션 목표와 이미지를 하나의 프리펩이서 값들을 바꿔 호출함. 미션 보상과 버튼, 별 개수, 목표까지 남은 숫자를 알려주는 슬라이더는 아직 미구현

 

 

 

 

ScrollView 컴포넌트 구성

 

Contents 컴포넌트 구성

Mission_contents 프리펩 구성

 

 

이미지, 미션 목표, 별 개수, 미션 성공 시 보상, 미션 목표 도달 시 활성화되는 버튼 등 동적으로 구현해서 하나의 프리펩으로 모든 미션을 구현하게끔 작성함.

 

사용 스크립트

MissionData : Json 파일을 통해 미션 관련 데이터들을 저장함.

using UnityEngine;

public class MissionData
{
    public int id;
    public string mission_desc;
    public int goal;
    public int stars;
    public int reward_id;
    public int reward_amount;
    public int btn_state;
    public string sprite_name;
}

MissionInfo : 데이터를 초기화하는 역할.

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

public class MissionInfo
{
    public int id;
    public int count;
    public int star;
    public int state;

    public MissionInfo(int id, int count, int star, int state)
    {
        this.id = id;
        this.count = count;
        this.star = star;
        this.state = state;
    }
}

MissionRewardData : 미션의 성공 보상을 Json 파일을 통해 불러오는 스크립트

using UnityEngine;

public class MissionRewardData
{
    public int id;
    public string name;
}

UIListItem : DataManager를 통해 Load한 미션 정보를 불러와서 변수에 저장한 후 ScrollviewTest를 통해 호출해서 프리펩을 생성할 때 데이터를 제공하는 역할

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

public class UIListItem : MonoBehaviour
{
    public Image reward_image;
    public Text reward_amount;
    public Image imageName;
    public Text txtName;
    private MissionInfo info;
    public void Init(MissionInfo info)
    {
        this.info = info;
        var data = DataManager.GetInstance().dicMissionDatas[this.info.id];
        this.txtName.text = string.Format(data.mission_desc, data.goal);
        var path = string.Format("07_Mission/{0}", data.sprite_name);
        this.imageName.sprite = Resources.Load<Sprite>(path);
    }
}

ScrollviewTest : DataManager를 통해 Json 파일을 Load하고 DIctionary에 저장된 미션들을 프리펩으로 생성

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

public class ScrollviewTest : MonoBehaviour
{
    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<UIListItem>();
            var data = pair.Value;

            var info = new MissionInfo(data.id, 0, 0, 0);
            listItem.Init(info);
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

DataManager : Json 파일을 역직렬화를 통해 Dictionary에 저장함. instance를 통해 다른 스크립트에서 쉽게 접근이 가능하도록 함.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.Linq;
public class DataManager
{
    private static DataManager instance;
    public Dictionary<int, StageData> dicStageDatas;
    public Dictionary<int, RewardData> dicRewardDatas;
    public Dictionary<int, ItemData> dicItemDatas;
    public Dictionary<int, MissionData> dicMissionDatas;
    public Dictionary<int, MissionRewardData> dicMissionRewardDatas;

    //생성자 
    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>("Datas/mission_data");
        var json = ta.text;
        this.dicMissionDatas = JsonConvert.DeserializeObject<MissionData[]>(json).ToDictionary(x => x.id);

        ta = Resources.Load<TextAsset>("Datas/missionreward_data");
        json = ta.text;
        this.dicMissionRewardDatas = JsonConvert.DeserializeObject<MissionRewardData[]>(json).ToDictionary(x => x.id);


        Debug.LogFormat("load completed!, {0}, {1}", this.dicMissionDatas.Count, this.dicMissionRewardDatas.Count);
    }
}