Unity/복습

2020-05-19 스크롤바 팝업 코드분석

J월드 2020. 5. 19. 22:01

오늘 배운 소스코드를 분석해 보았습니다.

아직 제 생각을 코드로 풀기에는 저의 지식이 한참 부족한 것 같아, 먼저 제가 이 코드를 읽을 수 있는지 없는지를 판단하기위해 코드 분석을 했습니다.

다행히도 읽을 수 없는 부분, 또는 이해를 하지 못하는 부분은 딱히 없었고, 많은 부분반복이 필요하다고 생각됩니다.    

 

 

App.class

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class App : MonoBehaviour //App클래스는 Mono를 상속
{
    //App이하는일과 UIApp이 하는일을 분리.
    //why? App이 많은 일을 하지 않게 하기위해서. 
    public UIApp uiApp;     
 
    //미리 만들어둔 UIMission 프리팹을 가져오기위해 선언
    private GameObject uiMissionPrefab;
 
    //UIMission 컨트롤하기 위해 선언
    private UIMission uiMission;
 
    void Start()
    {
        //UIMission의 프리팹을 불러와서 담아둡니다.
        this.uiMissionPrefab = Resources.Load<GameObject>("Prefabs/UIMission");
 
        // UIApp 클래스의 대리자 onClickBtnMission이 호출되었을때 실행되는 무명 메서드
        //언제 호출될지 모름, 그렇기 때문에, 대리자 함수 아래 코드가 먼저 실행됨
        this.uiApp.onClickBtnMission = () => {
            Debug.Log("show mission popup");    //출력
 
            //UIMission이 실체화되면서 동시에 UIMission 컴포넌트를 붙인다.
            this.uiMission = Instantiate<GameObject>(this.uiMissionPrefab).GetComponent<UIMission>();
 
            //UiMission 클래스에 있는 버튼 btnClose를 클릭했을때 실행 되는 메서드
            this.uiMission.btnClose.onClick.AddListener(() => {
                Object.Destroy(this.uiMission.gameObject);  //UIMission 컴포넌트의 게임오브젝트를 파괴
            });
 
            this.uiMission.Init(); //UIMission 클래스 초기화 함수
        };
    }
    void Update()
    {
 
    }
}
 
 
 

 

MissionData.class

더보기
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;
}
 
 
 
 

 

UIApp.class

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class UIApp : MonoBehaviour  //UIApp은  Mono를 상속
{
    public Button btnMission;   //UIApp에 btnMission을 public 으로 선언해 버튼 넣어줌(가상의 시작버튼)
 
    //Action은 델리게이트와 같음, 개발자들이 델리게이트를 하도 많이사용해서 MS에서 미리 정의해둔 델리게이트 함수
    //대리자 onClickBtnMission 선언.
    public System.Action onClickBtnMission; 
 
    void Start()
    {
        //현재 클래스 멤버 변수 btnMission을 클릭하면 실행되는 메서드
        //언제 호출될지 모름, 그렇기 때문에, 대리자 함수 아래 코드가 먼저 실행됨
        this.btnMission.onClick.AddListener(() =>
        {
            this.onClickBtnMission();   //대리자 onClickBtnMission이 실행됨.
        });    
    }
 
 
    void Update()
    {
        
    }
}
 
 
 

 

UIBinder_ListItem_Mission.class

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
 
//UIBinder_ListItem_Missio클래스 는 Mono 상속
//스크롤바 안의 컨텐츠 각각을 관리하는 클래스
public class UIBinder_ListItem_Mission : MonoBehaviour  //ListItem_Mission프리팹에 바인딩 되어있음
{
    public Text textMissionName;   // 미션 이름
    public Button btnGetReward;    // btnGetReward 버튼 선언
    public UnityAction<int> onClickBtnReward; // int 정수형 값 하나를 반환하는 onClickBtnReward 대리자 선언
 
    private int id; //미션 아이디
 
    //초기화 함수, 매개변수 정수형 id와, 문자열 missionName을 받아옴
    public void Init(int id,string missionName) 
    {
        //매개변수 id를 현재 클래스 정수형 멤버 변수 id에 할당
        this.id = id;
 
        //매개변수 missionName을 현재 클래스 문자열 멤버 변수 missionName에 할당
        this.textMissionName.text = missionName;
 
        //현재 클래스 버튼형식 멤버변수 btnGetReward를 클릭하면 실행되는 무명메서드
        //언제 호출될지 모름, 그렇기 때문에, 대리자 함수 아래 코드가 먼저 실행됨
        this.btnGetReward.onClick.AddListener(() =>
        {
            //위에 선언해둔 onClickBtnReward 대리자 호출과, 현재 클래스 정수형 멤버변수 id의 값을 반환
            this.onClickBtnReward(this.id); 
        });
    }
}
 
 
 

 

UIMission.class

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using UnityEngine.AI;
using System.Linq;
using UnityEngine.UI;
 
public class UIMission : MonoBehaviour
{
    //ListItem_Mission를 하나의 오브젝트로 관리하기 위해 선언
    public Transform contents; 
    
    //종료버튼을 만들기위해 선언
    public Button btnClose;
 
    //ListItem_Mission의 프리팹을 저장해두기 위해 선언
    private GameObject listItemPrefab;  
    //맵핑 클래스를 통해 로드해온 데이터를 저장해두기 위해서 선언
    private Dictionary<int, MissionData> dicMissionDatas;
 
    public void Init() //초기화 함수
    {
        var ta = Resources.Load<TextAsset>("mission_data"); //json파일을 불러와서 TextAsset형식의 ta에 할당함
        
        //역직렬화해서 현재클래스 멤버 딕셔너리에 저장
        this.dicMissionDatas =
            JsonConvert.DeserializeObject<MissionData[]>(ta.text).ToDictionary(x => x.id, x => x);
 
        //프리팹을 불러와서 현재 클래스 멤버 게임오브젝트형식 listItemPrefab에 할당
        this.listItemPrefab = Resources.Load<GameObject>("Prefabs/ListItem_Mission");
 
        //딕셔너리 값들에 접근하여 foreach문을 돌림
        foreach (var data in this.dicMissionDatas.Values)
        {
            //listItemGo에 현재 클래스 멤버 listItemPrefab에 할당되어 있는 프리팹을 클론을 만듬
            var listItemGo = Instantiate<GameObject>(this.listItemPrefab);
 
            //UIBinder_ListItem_Mission형식 uiBinder에
            //listItemGo에 UIBinder_ListItem_Mission 컴포넌트를 붙여 할당
            var uiBinder = listItemGo.GetComponent<UIBinder_ListItem_Mission>();
 
            //UIBinder_ListItem_Mission클래스의 대리자 onClickBtnReward 호출 시 실행되는 무명클래스
            //언제 호출될지 모름, 그렇기 때문에, 대리자 함수 아래 코드가 먼저 실행됨
 
            uiBinder.onClickBtnReward = (id) => //반환되어오는 id값을 받는다.
            {
                Debug.LogFormat("mission id: {0}", id); // 반환된 id값을 출력
                // 반환된 id값으로 현재클래스 멤버 dicMissionDatas에 id값으로 Value값에 접근하여,
                // MissionData 형식 missionData에 할당.
                var missionData = this.dicMissionDatas[id];
 
                //missionData로 액세스해 reward_type과 reward_amount를 출력
                Debug.LogFormat("[reward] type: {0}, amount: {1}", missionData.reward_type, missionData.reward_amount);
            };
 
            //테이블에 name이 예를들어 "Collect {0} Golds" 이렇게 되어있는데,
            //name의 {0}에 goal의 값을 넣어서 다시 문자열로 포맷하여
            //missionName에 할당해준다.
            var missionName = string.Format(data.name, data.goal);
 
            //UIBinder_ListItem_Mission 형식의 uiBinder의 초기화함수\
            //매개변수로 MissionData형식의 data에 액세스하여 정수형 id값과, 재 포맷한 missionName을 보내준다.
            uiBinder.Init(data.id, missionName);
 
            //listItemPrefab을 매개로 실체화된 클론 listItemGo를
            //contents의 자식으로 넣어줌.
            listItemGo.transform.SetParent(contents, false);
        }
    }
}