Unity/수업내용
2020-05-18 유니티 UITitle 만들기
J월드
2020. 5. 18. 18:11
UITitle.Class
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class UITitle : MonoBehaviour
{
enum eMenuType
{
Items, Shop, Messages, Mission, Ranking, Settings,
}
enum eShopType
{
SoulgemShop, CoinShop, GemShop,
}
enum eTitleBtnType
{
Start,AddFriend,SocialLogin,
}
public List<ButtonMenu> btnList;
public Sprite[] arrIcons;
public List<Button> budgetBtnList; //재화 종류의 버튼을 저장해줄 리스트
public List<Button> TitleBtnList; //메뉴, 재화상점 버튼을 제외한 모든 버튼
public GameObject notiShopIconGo;
public bool showNotiShopIcon; //True일 경우 N아이콘을 보여준다.
public bool showNotiMailIcon;
public int mailCount; //0보다 크다면 보여주고 그렇지 않다면 안보여줌
public UIBinder_NotificationMail uiBinderNotiMail;
public GameObject notiMissionIconGo;
public bool showNotiMissionIcon; //True일 경우 ! 아이콘을 보여준다.
private Dictionary<int,MissionData> TempDicMissionData;
private Dictionary<int, MissionInfo> dicMissionInfo;
private bool isNewbie;
void Start()
{
DataManager.GetInstance().LoadData();
//사전 넣어놓기
this.TempDicMissionData = new Dictionary<int, MissionData>();
this.dicMissionInfo = new Dictionary<int, MissionInfo>();
TempDicMissionData = DataManager.GetInstance().GetDicMissionData();
//var path = string.Format("{0}/data/mission_Info.json",Application.persistentDataPath);
//파일 저장 및 불러오기
//이렇게도 사용가능
//this.btnMenu.OnClick = (idx) =>
//{
// Debug.LogFormat("인덱스는 : " + idx);
//};
//shop부분
if (this.showNotiShopIcon) this.notiShopIconGo.SetActive(true);
else this.notiShopIconGo.SetActive(false);
//mail부분
this.uiBinderNotiMail.Init(this.mailCount);
//mission부분
if (this.showNotiMissionIcon) this.notiMissionIconGo.SetActive(true);
else this.notiMissionIconGo.SetActive(false);
for (int i = 0; i < this.btnList.Count; i++)
{
var btnName = ((eMenuType)i).ToString();
var btnMenu = this.btnList[i];
btnMenu.Init(this.arrIcons[i], btnName);
}
//메뉴타입
for (int i = 0; i < this.btnList.Count; i++) //메뉴 버튼
{
int captureinx = i;
this.btnList[i].btn.onClick.AddListener(() =>
{
Debug.LogFormat("index: {0}, menuType: {1}", captureinx, (eMenuType)captureinx);
});
}
for (int i = 0; i < this.budgetBtnList.Count; i++) //재화상점 버튼
{
int captureinx = i;
this.budgetBtnList[i].onClick.AddListener(() =>
{
Debug.LogFormat("index: {0}, shopType: {1}", captureinx, (eShopType)captureinx);
});
}
for (int i = 0; i < this.TitleBtnList.Count; i++) //위의 버튼들을 제외한 버튼들
{
int captureinx = i;
this.TitleBtnList[i].onClick.AddListener(() =>
{
Debug.LogFormat("index: {0}, titleBtnType: {1}", captureinx, (eTitleBtnType)captureinx);
});
}
}
void Update()
{
}
}
|
DataManager.Class
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.Linq;
public class DataManager
{
static DataManager instance;
private Dictionary<int, MissionData> dicMissionData;
private DataManager()
{
this.dicMissionData = new Dictionary<int, MissionData>();
}
public static DataManager GetInstance()
{
if (DataManager.instance == null)
{
instance = new DataManager();
}
return DataManager.instance;
}
public void LoadData()
{
TextAsset textAsset = Resources.Load("Json/mission_data") as TextAsset;
string json = textAsset.text;
this.dicMissionData = JsonConvert.DeserializeObject<MissionData[]>(json).ToDictionary(x=>x.id, x=>x);
}
public MissionData GetMissionDataById(int id)
{
return this.dicMissionData[id];
}
public Dictionary<int, MissionData> GetDicMissionData()
{
return this.dicMissionData;
}
}
|
UIBinder_NotificationMail.Class
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIBinder_NotificationMail : MonoBehaviour
{
public GameObject mailCountBgGo;
public Text txtMailCount;
private int mailCount;
public void Init(int mailCount)
{
this.mailCount = mailCount;
if (mailCount == 0)
{
this.Hide();
}
else
{
this.Show();
}
}
public void Show()
{
this.mailCountBgGo.SetActive(true);
this.txtMailCount.gameObject.SetActive(true);
this.txtMailCount.text = this.mailCount.ToString();
}
public void Hide()
{
this.mailCountBgGo.SetActive(false);
this.txtMailCount.gameObject.SetActive(false);
}
}
|
MissionData.Class
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MissionData
{
public int id;
public string name;
public int goal;
public string res_name;
public int reward_type;
public int reward_amount;
public bool btn_icon_type;
}
|
부록
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
유니티에서 UI, Image등으로 사용하고 있는 시스템이 UGI
걔네는 무조건 Canvas안에 있어야함
Canvas안에 있는애들은 Rect Transform이다.
강사님 UI 구조는----
캔버스
└가이드
└메인
----------------------
UI 만들때 공통점을 찾아야함.
하나만 잘만들어서 프리팹만들어놓으면, 재사용가능
이미지나, 텍스트를 선택하고 T를 누르면 GUI로 크기조정가능
이미지 넣을때 Set Native Size 잊지 말자.
픽셀 안찌그러지고 1:1비율로 만들어줌
텍스트에 쉐도우 넣기
-> Text에 Shadow 컴포넌트 붙이면끝
같이 일할때는,
씬에 수동으로 이미지다 박아놓는다.
UI할때는 자식오브젝트옮기지 말고, 부모오브젝트를 옮겨야함
----------------------
1. 엑셀테이블 만든다 (mission_data)
2. mission_data.json
3. Mapping Class 생성
4. DataManager 만들기
5. 로드하기 (역직렬화->Dictionary넣기)
6. Data가져다 쓸수있도록 인터페이스 만들기
----------------------
..파일입출력 저장.
---------------------
인게임이랑 UIInGame을 분리, 인게임이 UIInGame을 가지고있는 구조,
모든 UI는 UIInGame이 관리 Binder를 만들어 그룹화.
유니티는 그룹화가 중요한것 같다.
왜? 재사용할거니까
|