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를 만들어 그룹화.
유니티는 그룹화가 중요한것 같다.
왜? 재사용할거니까