유니티3D 프로그래밍
Unity UGUI 미션 창 구현 (21.04.23) 본문
미션 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);
}
}
'Unity > 수업내용' 카테고리의 다른 글
Unity NGUI 클릭 움직임 구현 (21.04.28) (0) | 2021.04.28 |
---|---|
Unity UGUI 상점 창 구현 (21.04.23) (0) | 2021.04.23 |
Unity UGUI Test 2 (21.04.20~21) (0) | 2021.04.20 |
Unity UGUI Test (21.04.20) (0) | 2021.04.20 |
Unity 6주차 5일 수업 내용 : 다단계 Scene 구성 (21.04.06) (0) | 2021.04.16 |