0. 들어가기 전에
이번엔 업그레이드 판넬을 제작하고 업그레이드 기능을 구현했다. 그리고 수치 데이터 저장 기능도 추가했다.
1. 게임 오브젝트
1. Plant Button
Plant Button 의 On Click() 에 직접 추가한 기능은 다음과 같다.
2. Plant Panel
Plant Panel 에는 NumGroup 과 ClickGroup 이 자식 오브젝트로 존재한다.
게임 창에서 Plant 버튼을 누르면 뜨는 업그레이드 창의 모습은 다음과 같다. 각 수치 레벨에 맞게 UI 가 바뀌도록 스크립트를 설정해놓았다.
2. 스크립트
이번에 새로 만든 스크립트는 UpgradePanel 와 ValueDatas 이다. 이번에 수정한 스크립트의 종류가 너무 많아서 변경사항만 간략하게 작성하려고 한다.
2.1 UpgradePanel 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System.Net;
public class UpgradePanel : MonoBehaviour
{
[Header("Plant Panel UI")]
public Text houseSubText; // 업그레이드 내용
public Text houseLoveText; // 필요한 애정 수치
public Button houseUpButton; // 업그레이드 버튼
public Text clickSubText;
public Text clickLoveText;
public Button clickUpButton;
private void Start()
{
SetUpgardePanel(); // 판넬 정보 설정
// 버튼에 메서드 연결
houseUpButton.onClick.AddListener(UpgradeHouse);
clickUpButton.onClick.AddListener(UpgradeClick);
}
private void OnEnable()
{
// 활성화 될 때 호출되는 함수
SetUpgardePanel(); // ui 세팅
}
// 게임매니저의 델리게이트에 연결할거임
public void SetUpgardePanel()
{
if (GameManager.instance.clayHouseLevel == 5) return;
houseSubText.text = "점토 수용량 " + (GameManager.instance.clayHouseLevel + 1);
houseLoveText.text = GameManager.instance.clayHouseLoveList[GameManager.instance.clayHouseLevel] + "";
if (GameManager.instance.clayClickLevel == 5) return;
clickSubText.text = "클릭 생산량 x " + (GameManager.instance.clayClickLevel + 1);
clickLoveText.text = GameManager.instance.clayClickLoveList[GameManager.instance.clayClickLevel] + "";
}
public void UpgradeHouse()
{
// 이미 레벨이 최고면 걍 빠져나가도록..
if (GameManager.instance.clayHouseLevel == 5) {
// 안내창 띄우기
GameManager.instance.StartInfoPanel("최대 레벨입니다!");
return;
}
else if (GameManager.instance.clayHouseLoveList[GameManager.instance.clayHouseLevel] > GameManager.instance.love)
{
// 안내창 띄우기
GameManager.instance.StartInfoPanel("애정이 부족해요 ㅠ_ㅠ");
return;
}
GameManager.instance.GetLove(-GameManager.instance.clayHouseLoveList[GameManager.instance.clayHouseLevel]); // 애정 차감
GameManager.instance.clayHouseLevel++;
GameManager.instance.curPossibleClayNum++; // 키울 수 있는 점토 수 +1
if (GameManager.instance.clayHouseLevel == 5)
{
houseLoveText.text = "max";
}
SetUpgardePanel();
}
public void UpgradeClick()
{
// 이미 레벨이 최고면 걍 빠져나가도록..
if (GameManager.instance.clayClickLevel == 5)
{
GameManager.instance.StartInfoPanel("최대 레벨입니다!");
return;
}
else if (GameManager.instance.clayClickLoveList[GameManager.instance.clayClickLevel] > GameManager.instance.love)
{
// 안내창 띄우기
GameManager.instance.StartInfoPanel("애정이 부족해요 ㅠ_ㅠ");
return;
}
GameManager.instance.GetLove(-GameManager.instance.clayClickLoveList[GameManager.instance.clayClickLevel]); // 애정 차감
GameManager.instance.clayClickLevel++;
if (GameManager.instance.clayClickLevel == 5)
{
clickLoveText.text = "max";
}
SetUpgardePanel();
}
public void ClosePanel()
{
gameObject.SetActive(false); // 활성화 끄기..
}
}
2.2 UpgradePanel 스크립트 설명
1. 변수
변수는 다음과 같다. 업그레이드 판넬 창의 UI 를 관리하기 위해 그에 맞는 변수들을 선언했다.
[Header("Plant Panel UI")]
public Text houseSubText; // 업그레이드 내용
public Text houseLoveText; // 필요한 애정 수치
public Button houseUpButton; // 업그레이드 버튼
public Text clickSubText;
public Text clickLoveText;
public Button clickUpButton;
2. Start()
진입하자마자 판넬의 정보를 설정할 수 있도록 SetUpgradePanel() 메서드를 호출했다.
그리고 업그레이트 버튼에 각각 메서드를 연결해주었다.
private void Start()
{
SetUpgardePanel(); // 판넬 정보 설정
// 버튼에 메서드 연결
houseUpButton.onClick.AddListener(UpgradeHouse);
clickUpButton.onClick.AddListener(UpgradeClick);
}
3. OnEnable()
판넬이 활성화 될 때마다 ui 정보를 세팅할 수 있도록 진입하자마자 SetUpgradePanel() 메서드를 호출했다.
private void OnEnable()
{
// 활성화 될 때 호출되는 함수
SetUpgardePanel(); // ui 세팅
}
4. SetUpgardePanel()
업그레이드 판넬의 ui 를 설정하는 메서드이다. 현재 레벨 수치에 맞게 ui 를 설정하도록 했다.
// 게임매니저의 델리게이트에 연결할거임
public void SetUpgardePanel()
{
if (GameManager.instance.clayHouseLevel == 5) return;
houseSubText.text = "점토 수용량 " + (GameManager.instance.clayHouseLevel + 1);
houseLoveText.text = GameManager.instance.clayHouseLoveList[GameManager.instance.clayHouseLevel] + "";
if (GameManager.instance.clayClickLevel == 5) return;
clickSubText.text = "클릭 생산량 x " + (GameManager.instance.clayClickLevel + 1);
clickLoveText.text = GameManager.instance.clayClickLoveList[GameManager.instance.clayClickLevel] + "";
}
5. UpgradeHouse()
점토들의 집을 업그레이드 하는 메서드이다. 집을 업그레이드 할 때마다 키울 수 있는 점토의 수가 1씩 늘어난다. 최대 5레벨까지 존재하기 때문에 최대 5마리를 한 번에 키울 수 있도록 했다.
public void UpgradeHouse()
{
// 이미 레벨이 최고면 걍 빠져나가도록..
if (GameManager.instance.clayHouseLevel == 5) {
// 안내창 띄우기
GameManager.instance.StartInfoPanel("최대 레벨입니다!");
return;
}
else if (GameManager.instance.clayHouseLoveList[GameManager.instance.clayHouseLevel] > GameManager.instance.love)
{
// 안내창 띄우기
GameManager.instance.StartInfoPanel("애정이 부족해요 ㅠ_ㅠ");
return;
}
GameManager.instance.GetLove(-GameManager.instance.clayHouseLoveList[GameManager.instance.clayHouseLevel]); // 애정 차감
GameManager.instance.clayHouseLevel++;
GameManager.instance.curPossibleClayNum++; // 키울 수 있는 점토 수 +1
if (GameManager.instance.clayHouseLevel == 5)
{
houseLoveText.text = "max";
}
SetUpgardePanel();
}
6. UpgradeClick()
이 메서드가 호출될 때마다 점토를 클릭해서 얻을 수 있는 애정의 양에 수치만큼 곱셈이 된다. 각 레벨에 맞게 1레벨이면 1배, 2레벨이면 2배가 될 수 있도록 했다.
public void UpgradeClick()
{
// 이미 레벨이 최고면 걍 빠져나가도록..
if (GameManager.instance.clayClickLevel == 5)
{
GameManager.instance.StartInfoPanel("최대 레벨입니다!");
return;
}
else if (GameManager.instance.clayClickLoveList[GameManager.instance.clayClickLevel] > GameManager.instance.love)
{
// 안내창 띄우기
GameManager.instance.StartInfoPanel("애정이 부족해요 ㅠ_ㅠ");
return;
}
GameManager.instance.GetLove(-GameManager.instance.clayClickLoveList[GameManager.instance.clayClickLevel]); // 애정 차감
GameManager.instance.clayClickLevel++;
if (GameManager.instance.clayClickLevel == 5)
{
clickLoveText.text = "max";
}
SetUpgardePanel();
}
7. ClosePanel()
판넬을 비활성화하는 메서드이다.
public void ClosePanel()
{
gameObject.SetActive(false); // 활성화 끄기..
}
2.3 ValueDatas 스크립트
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class ValueDatas
{
[Header("GameValueData")]
// 수치 저장
public float gold;
public float love;
public int clayHouseLevel;
public int clayClickLevel;
public int curPossibleClayNum;
}
2.4 ValueDatas 스크립트 설명
1. 변수
수치 데이터를 저장하기 위해 해당하는 변수를 선언했다.
[Header("GameValueData")]
// 수치 저장
public float gold;
public float love;
public int clayHouseLevel;
public int clayClickLevel;
public int curPossibleClayNum;
2.5 Datas 스크립트 변경 사항 설명
1. 변수
ValueDatas 타입의 valueDatas 변수를 선언했다.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[Serializable] // 직렬화
public class Datas
{
[Header("Clay")]
public List<ClayDatas> clayInfos;
public List<bool> unlockClays; // 해금 여부
public List<bool> catchClays; // 포획 여부
public ValueDatas valueDatas;
}
2.6 GameManager 스크립트 변경 사항 설명
1. 변수
업그레이트 기능에 필요한 변수들을 새로 선언했다.
public int clayHouseLevel = 1; // 점토 아파트 레벨
public int clayClickLevel = 1; // 점토 클릭 레벨
public int[] clayHouseLoveList; // 업그레이드 비용
public int[] clayClickLoveList; // 업그레이드 비용
public int curPossibleClayNum = 1; // 최대로 키울 수 있는 점토의 개수(1레벨은 1마리, 2레벨은 2마리...)
2. Start()
로드한 수치 데이터를 게임 매니저 변수에 반영하는 로직을 추가했다.
// 저장된 게임 수치 데이터가 있는 경우 데이터 가져와서 반영
if (DataManager.instance.data.valueDatas != null)
{
// 저장된 데이터 반영해서 가져오기
gold = DataManager.instance.data.valueDatas.gold;
love = DataManager.instance.data.valueDatas.love;
clayHouseLevel = DataManager.instance.data.valueDatas.clayHouseLevel;
clayClickLevel = DataManager.instance.data.valueDatas.clayClickLevel;
curPossibleClayNum = DataManager.instance.data.valueDatas.curPossibleClayNum;
}
3. SetSaveData()
메서드를 수정했다. 마지막에 수치 데이터를 저장하는 부분이 추가됐다.
public void SetSaveData()
{
int size = unLockedClays.Length;
DataManager.instance.data.unlockClays = new List<bool>();
DataManager.instance.data.catchClays = new List<bool>();
for (int i = 0; i < size; i++)
{
DataManager.instance.data.unlockClays.Add(unLockedClays[i]); // 해금 여부 저장
DataManager.instance.data.catchClays.Add(catchedClays[i]); // 포획 여부 저장
}
// 수치 데이터 저장
DataManager.instance.data.valueDatas = new ValueDatas();
DataManager.instance.data.valueDatas.gold = gold;
DataManager.instance.data.valueDatas.love = love;
DataManager.instance.data.valueDatas.clayHouseLevel = clayHouseLevel;
DataManager.instance.data.valueDatas.clayClickLevel = clayClickLevel;
DataManager.instance.data.valueDatas.curPossibleClayNum = curPossibleClayNum;
}
2.7 Clay 스크립트 변경 사항 설명
1. OnMouseDown()
아래와 같이 점토를 클릭하면 애정을 얻는 코드를 수정했다. 업그레이드 한 레벨의 수치만큼 원래 얻는 수치에 곱해줬다.
GameManager.instance.GetLove(loves[clayLevel - 1] * GameManager.instance.clayClickLevel); // 레벨에 맞는 수치를 함수로 넘겨주기
2.8 ButtonMove 스크립트 변경 사항 설명
1. CloseButton()
메서드를 살짝 수정했다. else if 문을 추가해서 현재 닫으려고 하는 판넬이 업그레이드 판넬이면 업그레이트 판넬의 속성을 가져온 후 ClosePanel 메서드를 호출했다.
// 자기 자신을 끄는 함수
public void CloseButton()
{
gameObject.GetComponent<ButtonMove>().ResetButtonSprite(); // 버튼 모습 초기화
if (gameObject.GetComponent<ButtonMove>().panel != null)
{
gameObject.GetComponent<ButtonMove>().panel.GetComponent<Animator>().SetBool("isOpened", false); // 창 닫힘 애니메이션 실행
if (gameObject.GetComponent<ButtonMove>().panel.GetComponent<ClayPanel>() != null) // 점토 구매 판넬
gameObject.GetComponent<ButtonMove>().panel.GetComponent<ClayPanel>().ClosePanel(); // 판넬 꺼
else if (gameObject.GetComponent<ButtonMove>().panel.GetComponent<UpgradePanel>() != null) // 업그레이트 판넬
gameObject.GetComponent<ButtonMove>().panel.GetComponent<UpgradePanel>().ClosePanel(); // 판넬 꺼
}
}
2.9 ClayPanel 스크립트 변경 사항 설명
1. BuyClay(int idx)
메서드를 수정했다. else if 문을 하나 더 추가해서 집이 좁은 경우 빠져나가도록 했다. 한 번에 키울 수 있는 점토의 수치와 현재 게임 속 점토의 개수가 같을 때 점토를 더 구매하려고 하면 위와 같이 메서드를 빠져나가게 되는 것이다.
public void BuyClay(int idx)
{
int price = GameManager.instance.poolManager.clayPrefabs[idx].GetComponent<Clay>().buyPrice;
// 돈이 충분하고 공간이 있으면 점토 구매
if (GameManager.instance.gold >= price && (GameManager.instance.curPossibleClayNum > GameManager.instance.poolManager.curClayNum))
{
GameManager.instance.GetGold(-price);
GameManager.instance.poolManager.GetGameObject(idx); // 동물 get!
GameManager.instance.poolManager.curClayNum++; // 점토 개수 증가
}
else if (GameManager.instance.gold < price)
{
// 안내 판넬 띄우기
GameManager.instance.StartInfoPanel("돈이 부족해요 ㅠ_ㅠ");
return;
}
else if (GameManager.instance.curPossibleClayNum <= GameManager.instance.poolManager.curClayNum) {
// 안내 판넬 띄우기
GameManager.instance.StartInfoPanel("집이 너무 좁아요 ㅠ_ㅠ");
return;
}
}
2.10 GameDataUIController 스크립트 변경 사항 설명
1. UpdateTextUI(string name, float target, float current)
코루틴을 수정했다. 기존 코드는 수치가 올라갈 때만 정상적으로 애니메이션이 작동하길래 다음과 같이 바꿨다. 이제는 수치가 줄어들 때도 정상적으로 애니메이션이 수행된다.
public IEnumerator UpdateTextUI(string name, float target, float current)
{
// Text 가 참조 타입이라 가능한것..
Text targetText = null; // 변경할 대상 text 할당용 변수
if (name == "gold")
{
targetText = goldText; // goldText 게임 오브젝트 할당
}
else if (name == "love")
{
targetText = loveText; // loveText 게임 오브젝트 할당
}
float duration = 0.5f; // 카운팅에 걸리는 시간 설정
float offset = (target - current) / duration;
if (target > current)
{
while (current < target)
{
current += offset * Time.deltaTime;
targetText.text = (current).ToString("N0");
yield return null; // 다음 프레임까지 기다림
}
}
else
{
while (current > target)
{
current += offset * Time.deltaTime;
targetText.text = (current).ToString("N0");
yield return null; // 다음 프레임까지 기다림
}
}
current = target;
targetText.text = (current).ToString("N0");
}
2.11 ClaySellController 스크립트 변경 사항 설명
1. SellClay()
현재 점토의 개수를 -1 해주는 부분이 추가되었다.
public void SellClay()
{
if (sellClay != null)
{
if (sellClay.clayLevel == 5) // 성체만 판매 가능
{
poolManager.ReturnToPool(sellClay.gameObject); // 비활성화시키기..
GameManager.instance.GetGold(sellClay.sellPrice); // 돈 얻기
GameManager.instance.poolManager.curClayNum--; // 현재 점토 개수 -1 해주기
}
else
{
// 안내 문구 시작
GameManager.instance.StartInfoPanel("성체가 된 점토만 판매할 수 있어요!");
return;
}
}
}
2.12 PoolManager 스크립트 변경 사항 설명
1. 변수
현재 게임에 존재하는 점토의 개수를 알 수 있도록 변수를 선언했다.
public int curClayNum; // 현재 점토 개수
3. 결과물