C#/수업내용

2020.05.21. 수업내용 - Lobby에서 캐릭터 선택하기 (익명 메소드 참고)

dev_sr 2020. 5. 21. 18:19

 

Lobby :

캐릭터 목록을 횡스크롤로 보여주고 캐릭터 선택할 수 있다

버튼을 누르면 아이디를 InGame씬에 넘겨준다          

 

InGame:

선택된 캐릭터의 아이디 값을 이용해서 Profile UI 상태를 해당 아이디 값에 맞는 항목으로 변경하고

선택된 캐릭터 모델의 데이터를 불러와서 실체화한다.

 

 

1. Lobby - 로비 씬을 관리한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Lobby : MonoBehaviour
{
    public UILobby uiLobby;
 
    private void Start()
    {
        DataManager.GetInstance().Load();
 
        this.uiLobby.Init();
    }
}
 

 

2. UILobby - 로비씬의 UI를 관리한다.

 

SceneManager.LoadSceneAsync 메서드를 이용해서 InGame씬으로 데이터를 넘길 때

UILobby씬을 파괴하지 않아야 하는데 문제는 UILobby 게임 오브젝트에 속하게 되는 스크롤 리스트도 같이 넘어오게 됨.

씬 로딩이 완료된 뒤에 스크롤 리스트를 파괴하면 스크롤 리스트는 보이지 않게 되고

InGame 씬에 데이터를 넘길 때 필요한 UILobby 컴포넌트가 구성되어 있는 UILobby 오브젝트만 남게되어

원하는 값만 Init메서드를 통해 전달할 수 있음  

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
 
public class UILobby : MonoBehaviour
{
    public Transform contentsTrans;
    private GameObject listItemPrefabs;
 
    private void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
 
 
    public void Init()
    {
 
        this.listItemPrefabs = Resources.Load("Prefabs/UI/ui_listItem_Hero"as GameObject;
 
        var characterDatas = DataManager.GetInstance().GetCharacterDatas();
        foreach(var data in characterDatas)
        {
            var listItemGo = Instantiate(this.listItemPrefabs) as GameObject;
            var listItem = listItemGo.GetComponent<UI_ListItem_Hero>();
 
            string uiModelPrefabsName = string.Format("Prefabs/UI/ui_{0}", data.res_name);
            var uiModelPrefab = Resources.Load(uiModelPrefabsName) as GameObject;
 
            var uiModel = Instantiate<GameObject>(uiModelPrefab);
 
            listItem.Init(data.id,data.res_name,uiModel);
 
 
 
 
            listItem.btn.onClick.AddListener(() =>
            {
                Debug.LogFormat("selected character ID : {0}", data.id);
 
                AsyncOperation asynOper = SceneManager.LoadSceneAsync("InGame");
                asynOper.completed += (obj) =>
                {
                    var inGame = GameObject.FindObjectOfType<InGame>();
                    Object.Destroy(GameObject.Find("scrollview"));
                    inGame.Init(data.id);
                };
 
 
            });
 
 
            listItem.transform.SetParent(this.contentsTrans, false);
 
 
        }
    }
 
}
 

 

 

3. UI_ListItem_Hero - 로비씬에 구성되는 UI 중 하나인 캐릭터 리스트를 관리한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class UI_ListItem_Hero : MonoBehaviour
{
    public Text txtId;
    public Button btn;
    public Text txtName;
 
    private GameObject uiModel;
 
    public void Init(int id, string name, GameObject uiModel)
    {
        this.txtId.text = id.ToString();
        this.txtName.text = name;
 
        this.uiModel = uiModel;
        this.uiModel.transform.SetParent(this.transform, false);
    }
}
 

 

4. InGame - InGame 씬을 관리한다.

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class InGame : MonoBehaviour
{
    public UIInGame uiInGame;
    private int selectedHeroId;
    private CharacterData selectedCharacterData;
 
    private void Start()
    {
        DataManager.GetInstance().Load();
        
    }
 
    public void Init(int selectedHeroId)
    {
        this.selectedHeroId = selectedHeroId;
        this.selectedCharacterData = DataManager.GetInstance().GetCharacterDatas(this.selectedHeroId);
 
        string Name = selectedCharacterData.res_name;
        string ThumbName = selectedCharacterData.thumb_name;
        int CurrentHp = selectedCharacterData.hp;
        int MaxHp = selectedCharacterData.hp;
        int CurrentExp = 50;
        int TargetExp = 100;
        int Level = 1;
 
        this.uiInGame.Init(Name, ThumbName, CurrentHp, MaxHp, CurrentExp, TargetExp, Level);
 
 
        //캐릭터 생성하기
        string path = string.Format("Prefabs/{0}"this.selectedCharacterData.res_name);
 
        GameObject heroShell = new GameObject();
        heroShell.name = "Hero";
 
        GameObject heroPrefabs = Resources.Load(path) as GameObject;
        GameObject heroGo = Instantiate(heroPrefabs) as GameObject;
 
        heroGo.transform.SetParent(heroShell.transform);
 
        //리소스 이름 ch_01_01
        //썸네일 thumb_ch_01_01
        //Hp 게이지(current hp / max hp)
        //exp 게이지 (current exp, target exp)
        //레벨 1
 
        //익명메소드 (dynamic)을 사용해서 넘기기인데 버그남..
 
        //this.uiInGame.Init(
        //    new UIInGameParam
        //    {
        //        Name = selectedCharacterData.res_name,
        //        ThumbName = selectedCharacterData.thumb_name,
        //        CurrentHp = selectedCharacterData.hp,
        //        MaxHp = selectedCharacterData.hp,
        //        CurrentExp = 50,
        //        TargetExp = 100,
        //        Level = 1
        //    }
        //    );
 
    }
 
}
 

 

 

5. UIInGame - InGame씬의 UI 를 관리한다.

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
using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;
 
public class UIInGame : MonoBehaviour
{
    public UIHeroState uiHeroState;
    public Sprite[] arrThumbsIcons;
    public SpriteAtlas uiInGameAtlas;
 
 
    //public void Init(dynamic param)
    //{
 
    //    //Debug.LogFormat("{0} {1} {2} {3} {4} {5} {6}", param.Name, param.ThumbName, param.CurrentHp,
    //    //param.MaxHp, param.CurrentExp, param.TargetExp, param.Level);
 
    //    //this.uiHeroState.Init(null, param.CurrentHp,
    //    //    param.MaxHp, param.CurrentExp, param.TargetExp, param.Level, param.Name);
    //}
 
    public void Init(string Name, string ThumbName, int CurrentHp, 
        int MaxHp, int CurrentExp, int TargetExp, int Level)
    {
        Sprite spthumb = null;
        //foreach(var thumb in this.arrThumbsIcons)
        //{
        //    if(thumb.name == ThumbName)
        //    {
        //        spthumb = thumb;
        //    }
        //}
 
        //아틀라스 묶음에서 리소스 이름을 가진 스프라이트를 가져온다.
        spthumb = this.uiInGameAtlas.GetSprite(ThumbName);
 
        this.uiHeroState.Init(spthumb, CurrentHp, MaxHp, 
            CurrentExp, TargetExp, Level, Name);
    }
}
 

 

 

6. UIHeroState - InGame씬의 UI 중 하나인 상태창을 관리한다.

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class UIHeroState : MonoBehaviour
{
    public Image ImgThumb;
    public Slider sliderHp;
    public Slider sliderExp;
    public Text txtProgress;
    public Text txtLevel;
    public Text txtName;
 
    public void Init(Sprite spThumb, int currnetHp, int maxHp, int currentExp, int targetExp, int level, string name)
    {
        var strProgress = string.Format("{0}/{1}", currnetHp, maxHp);
        this.txtProgress.text = strProgress;
        this.txtLevel.text = level.ToString();
        this.txtName.text = name;
        this.ImgThumb.sprite = spThumb;
 
        this.sliderHp.value = (float)currnetHp / (float)maxHp;
        this.sliderExp.value = (float)currentExp / (float)targetExp;
 
    }
}
 

 

7.UIInGameParam (참고용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class UIInGameParam
{
    public string Name;
    public string ThumbName;
    public int CurrentHp;
    public int MaxHp;
    public int CurrentExp;
    public int TargetExp;
    public int Level;
 
 
    //Debug.LogFormat("{0} {1} {2} {3} {4} {5} {6}",param.Name, param.ThumbName, param.CurrentHp, 
    //        param.MaxHp, param.CurrentExp, param.TargetExp, param.Level);
}