해당 글은 유튜버 골드메탈님의 강의를 기반으로 작성되었습니다.
이번 강의에서는 이전 시간에 만들었던 인터페이스를 바탕으로 젤리 해금 시스템을 구현해보았습니다.
먼저 젤리의 Sprite, 이름, 가격을 저장하기 위한 배열 변수를 GameManager 스크립트에 추가해줍니다.
public Sprite[] jelly_spritelist;
public string[] jelly_namelist;
public int[] jelly_jelatinlist;
유니티 프로그램으로 돌아가 각각의 배열에 값을 저장해줍니다.
![]() |
![]() |
![]() |
이후 강의 영상에 나오는 UI 페이지 구현 부분을 따라하여 Jelly Panel이 아래와 같은 모습으로 나오도록 해주었습니다.
이제 버튼 클릭에 따른 페이지 이동을 구현해보도록 하겠습니다.
먼저 GameManager 스크립트 내에 다음의 변수들을 추가해줍니다.
public Text page_text;
public Image unlock_group_jelly_img;
public Text unlock_group_gold_text;
public Text unlock_group_name_text;
int page;
다음으로 세 개의 함수를 추가해줍니다.
public void PageUp()
{
if (page >= 11) return;
++page;
ChangePage();
}
public void PageDown()
{
if (page <= 0) return;
--page;
ChangePage();
}
void ChangePage()
{
page_text.text = string.Format("#{0:00}", (page + 1));
unlock_group_jelly_img.sprite = jelly_spritelist[page];
unlock_group_name_text.text = jelly_namelist[page];
unlock_group_gold_text.text = string.Format("{0:n0}", jelly_goldlist[page]);
unlock_group_jelly_img.SetNativeSize();
}
PageUp/Down() 함수는 버튼이 클릭될 시에 호출될 것이며 각각 page 변수의 값을 증가시키거나 감소시킨 뒤, ChangePage() 함수를 호출할 것입니다.
ChangePage() 함수에서는 각 오브젝트의 Sprite 또는 Text를 변경하여 마치 다음 페이지로 넘어가는 것처럼 구현하였습니다. 또한 SetNativeSize()를 함수 내에서 호출함으로써 Sprite Image가 깨지는 현상을 방지해주었습니다.
이후 유니티 프로그램으로 돌아와 새로 만들었던 변수에 오브젝트를 지정해줍니다.
게임을 실행해보면 잘 구현된 것을 확인할 수 있습니다.
다음으로 젤리 해금 상태에 따라 인터페이스가 달라지도록 구현해보겠습니다.
먼저 Lock Group 오브젝트를 컨트롤하기 위해 GameManager 스크립트에 변수를 추가한 뒤, 유니티 프로그램에서 각각의 오브젝트를 지정해주었습니다.
public GameObject lock_group;
public Image lock_group_jelly_img;
public Text lock_group_jelatin_text;
다음으로 젤리의 해금 상태를 확인하기 위한 배열을 추가해준 뒤, Awake() 함수에서 이를 초기화 해주었으며 각 인터페이스의 초기 텍스트를 설정해주었습니다.
bool[] jelly_unlock_list;
void Awake()
{
...
unlock_group_gold_text.text = jelly_goldlist[0].ToString();
lock_group_jelatin_text.text = jelly_jelatinlist[0].ToString();
jelly_unlock_list = new bool[12];
}
이후 ChangePage() 함수를 다음과 같이 수정해주었습니다.
void ChangePage()
{
lock_group.gameObject.SetActive(!jelly_unlock_list[page]);
page_text.text = string.Format("#{0:00}", (page + 1));
if (lock_group.activeSelf) {
lock_group_jelly_img.sprite = jelly_spritelist[page];
lock_group_jelatin_text.text = string.Format("{0:n0}", jelly_jelatinlist[page]);
lock_group_jelly_img.SetNativeSize();
}
else {
unlock_group_jelly_img.sprite = jelly_spritelist[page];
unlock_group_name_text.text = jelly_namelist[page];
unlock_group_gold_text.text = string.Format("{0:n0}", jelly_goldlist[page]);
unlock_group_jelly_img.SetNativeSize();
}
}
이렇게 하면 lock_group 오브젝트는 젤리의 해금 상태에 따라 활성화 또는 비활성화 될 것이며 상황에 맞는 인터페이스를 사용자에게 보여줄 수 있습니다.
다음으로 젤리 해금에 필요한 Unlock() 함수를 작성해줍니다.
public void Unlock()
{
if (jelatin < jelly_jelatinlist[page]) return;
jelly_unlock_list[page] = true;
ChangePage();
jelatin -= jelly_jelatinlist[page];
}
위 함수는 젤리 구입 버튼을 클릭할 시 호출되며 현재 소지하고 있는 jelatin의 값에 따라 젤리를 해금시킬 수 있습니다.
유니티 프로그램으로 돌아가 Lock Group의 Button 오브젝트에 OnClick() 함수를 추가한 뒤, GameManager의 Unlock() 함수를 지정해줍니다.
이후 게임을 실행하여 잘 동작하는지 확인합니다.
다음으로 현재 Unlock한 젤리가 있다면 게임을 껏다 켜도 Unlock 상태가 유지될 수 있도록 PlayerPrefs 클래스를 사용하여 간단하게 Save 기능을 추가하였습니다.
void Awake()
{
jelly_anim = jelly_panel.GetComponent<Animator>();
plant_anim = plant_panel.GetComponent<Animator>();
isLive = true;
jelatin_text.text = jelatin.ToString();
gold_text.text = gold.ToString();
unlock_group_gold_text.text = jelly_goldlist[0].ToString();
lock_group_jelatin_text.text = jelly_jelatinlist[0].ToString();
jelly_unlock_list = new bool[12];
for(int i = 0; i < 12; ++i)
if (PlayerPrefs.HasKey(i.ToString()))
jelly_unlock_list[i] = true;
lock_group.gameObject.SetActive(!jelly_unlock_list[page]);
}
public void Unlock()
{
if (jelatin < jelly_jelatinlist[page]) return;
jelly_unlock_list[page] = true;
ChangePage();
jelatin -= jelly_jelatinlist[page];
PlayerPrefs.SetInt(page.ToString(), 1);
}
수정 사항
GameManager.cs
void Awake()
{
jelly_anim = jelly_panel.GetComponent<Animator>();
plant_anim = plant_panel.GetComponent<Animator>();
isLive = true;
jelatin_text.text = jelatin.ToString();
gold_text.text = gold.ToString();
unlock_group_gold_text.text = jelly_goldlist[0].ToString();
lock_group_jelatin_text.text = jelly_jelatinlist[0].ToString();
jelly_unlock_list = new bool[12];
}
void LateUpdate()
{
jelatin_text.text = string.Format("{0:n0}", (int)Mathf.SmoothStep(float.Parse(jelatin_text.text), jelatin, 0.5f));
gold_text.text = string.Format("{0:n0}", (int)Mathf.SmoothStep(float.Parse(gold_text.text), gold, 0.5f));
}
'📌 etc > Unity 2D Raising Jelly Game' 카테고리의 다른 글
[Unity / C#] 2D 젤리 키우기 게임 - 8. 업그레이드 시스템 구현 (2) | 2022.03.27 |
---|---|
[Unity / C#] 2D 젤리 키우기 게임 - 7. 구매 시스템 만들기 (3) | 2022.03.27 |
[Unity / C#] 2D 젤리 키우기 게임 - 5. UI 창 구축하기 (0) | 2022.03.23 |
[Unity / C#] 2D 젤리 키우기 게임 - 4. 젤리 판매 기능 구현 (0) | 2022.03.22 |
[Unity / C#] 2D 젤리 키우기 게임 - 3. 클리커 기능 구현 (0) | 2022.03.21 |