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);
}
}
}
|