2022. 10. 3. 21:50ㆍC#
Click Button 생성
Canvas - UI - Button 생성 ; Click Button 을 생성한뒤 ClickButton.cs 파일을 생성하여 연결해준다
//코드작성
DataController.GetInstance() -이렇게 해주면 singleton 으로 제작한것을 가져올수 있다
그 뒤에 OnClick()하단에 +누르고 이 Component를 끌어다가 가져온뒤 function에서 ClickButton에서 코드에 삽입한
OnClick() function을 클릭하면 이 버튼을 클릭시에 function이 작동한다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ClickButton : MonoBehaviour
{
//public DataController dataController;
public void OnClick(){
// gold = gold + goldPerClick; // 한번 클릭할때마다 1씩 증가
int goldPerClick = DataController.GetInstance().GetGoldPerClick();
DataController.GetInstance().AddGold(goldPerClick);
}
}
DataController 생성
DataController.cs 파일을 생성해서 데이터를 관리한다
empty로 DataController Component 를 생성하고 이를 연결해준다
Private Static DateContoller instance; -이렇게 해서 instacne로 싱글톤을 만들어 클래스에서 바로 접근가능하도록함
PPlayerPerfs.GetInt("Gold"), //orSetInt("Gold " ,1 ) ;PlayerPrefas란 KEY : VALUE로 저장하고 가져옴
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DataController : MonoBehaviour
{
private static DataController instance; // static; 단 하나만 만든다. 클래스에서 접근이 바로 가능.
public static DataController GetInstance(){
if(instance == null){
instance = FindObjectOfType<DataController>(); // Scene에서 다 찾아본다.
if(instance == null){
GameObject container = new GameObject("DataController"); // 새로운 것을 만든다.
instance = container.AddComponent<DataController>(); // 게임오브젝트를 만들고 컴퍼넌트를 넣어준다.
}
}
return instance;
}
private ItemButton[] itemButtons;
// 게임을 이어서 할 수 있도록 저장해 준다
private int m_gold = 0;
private int m_goldPerClick = 0;
void Awake(){ // 게임이 시작되면 자동으로 이 함수가 시작된다 - 초기화할때에
m_gold = PlayerPrefs.GetInt("Gold"); // PlayerPrefs란 KEY : VALUE로 저장하고 가져옴 // 값이 없으면 0이 됨.
m_goldPerClick = PlayerPrefs.GetInt("GoldPerClick", 1); // 값이 없는 경우 1 삽입
itemButtons = FindObjectsOfType<ItemButton>();
}
public void SetGold(int newGold){
m_gold = newGold;
PlayerPrefs.SetInt("Gold", m_gold);
}
public void AddGold(int newGold){
m_gold += newGold;
SetGold(m_gold);
}
public void SubGold(int newGold){
m_gold -= newGold;
SetGold(m_gold);
}
public int GetGold(){
return m_gold;
}
public int GetGoldPerClick(){
return m_goldPerClick;
}
public void SetGoldPerClick(int newGoldPerClick){
m_goldPerClick = newGoldPerClick;
PlayerPrefs.SetInt("GoldPerClick", m_goldPerClick);
}
public void AddGoldPerClick(int newGoldPerClick){
m_goldPerClick += newGoldPerClick;
SetGoldPerClick(m_goldPerClick);
}
public void LoadUpgradeButton(UpgradeButton upgradeButton){
string key = upgradeButton.upgradeName;
upgradeButton.level = PlayerPrefs.GetInt(key + "_level", 1);
upgradeButton.goldByUpgrade = PlayerPrefs.GetInt(key + "_goldByUpgrade",
upgradeButton.startGoldByUpgrade);
upgradeButton.currentCost = PlayerPrefs.GetInt(key + "_cost", upgradeButton.startCurrentCost);
}
public void SaveUpgradeButton(UpgradeButton upgradeButton){
string key = upgradeButton.upgradeName;
PlayerPrefs.SetInt(key + "_level", upgradeButton.level);
PlayerPrefs.SetInt(key + "_goldByUpgrade", upgradeButton.goldByUpgrade);
PlayerPrefs.SetInt(key + "_cost", upgradeButton.currentCost);
}
public void LoadItemButton(ItemButton itemButton){
string key = itemButton.itemName;
itemButton.level = PlayerPrefs.GetInt(key + "_level");
itemButton.goldPerSec = PlayerPrefs.GetInt(key + "_goldPerSec");
itemButton.currentCost = PlayerPrefs.GetInt(key + "_cost", itemButton.startCurrentCost);
if(PlayerPrefs.GetInt(key+"_isPurchased") == 1){
itemButton.isPurchased = true;
}else{
itemButton.isPurchased = false;
}
}
public void SaveItemButton(ItemButton itemButton){
string key = itemButton.itemName;
PlayerPrefs.SetInt(key + "_level", itemButton.level);
PlayerPrefs.SetInt(key + "_goldPerSec", itemButton.goldPerSec);
PlayerPrefs.SetInt(key + "_cost", itemButton.currentCost);
if(itemButton.isPurchased == true){
PlayerPrefs.SetInt(key + "_isPurchased", 1);
}else{
PlayerPrefs.SetInt(key + "_isPurchased", 0);
}
}
public int GetGoldPerSec(){
int goldPerSec = 0;
for(int i=0; i< itemButtons.Length; i++){
goldPerSec += itemButtons[i].goldPerSec;
}
return goldPerSec;
}
}
UIManger 생성
UIManger.cs 파일을 생성하여 UI를 관리한다
Canvas 에 UIManger 를 Component로 삽입한다
이때 각각의 Canves - UI - Text 에서 Text를 생성한 뒤에 UIManger의 Public으로 선언해준 Text 요소와 연결해주면Text
에 하단 코드의 내용이 반영된다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // UI관련 코드를 쓸 수 있다.
public class UIManager : MonoBehaviour
{
public Text goldDisplayer;
public Text goldPerClickDisplayer;
public Text goldPerSecDisplayer;
// public DataController dataController;
void Update(){
//1초에 30-60번 정도 다시 그린다
goldDisplayer.text = "GOLD: "+DataController.GetInstance().GetGold();
goldPerClickDisplayer.text = "GOLD: "+DataController.GetInstance().GetGoldPerClick();
goldPerSecDisplayer.text = "GOLD: "+DataController.GetInstance().GetGoldPerSec();
}
}
UpgradeButton 생성
UpgradeButton.cs 파일을 생성하고 Upgrade Button요소 생성하여 연결한뒤 마찬가리 OnClick시에
PurchaseUpgradefunction 이 작동하도록 한다
[HideInInspector] - public 에선 인스펙터 창에서 보이지만 이것을 사용시 인스펙터 창에서 보이지 않고
다른 스크립트와 연결이 가능하다 보호수준은 낮추며 인스펙터 창에서 너무 많은 자료를 관리 하기 힘들때 사용함
DataContorller로 값을 가져오고 계산하고 저장함
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UpgradeButton : MonoBehaviour
{
public Text upgradeDisplayer;
public string upgradeName;
[HideInInspector] // 기획자들이 수정 못하도록
public int goldByUpgrade;
public int startGoldByUpgrade; // 게임이 처음했을때 기본 goldByUpgrade
[HideInInspector]
public int currentCost = 1; // 지금의 가격
public int startCurrentCost = 1;
[HideInInspector]
public int level = 1;
public float upgradePow = 1.07f; // 값을 증가할 정도.
public float costPow = 3.14f;
//public DataController = dataController;
// 싱글톤을 사용하는 것은 하나만 만들고 언제 어디서든 사용할 수 있다.
void Start(){
// void Awake와 같으나 Start가 좀 더 느리다.
/* currentCost = startCurrentCost;
level = 1;
goldByUpgrade = startGoldByUpgrade; */
DataController.GetInstance().LoadUpgradeButton(this); // 가져옴
UpdateUI();
}
public void PerchaseUpgrade(){
if(DataController.GetInstance().GetGold() >= currentCost){ // static 컴퍼넌트는 . 으로 바로바로 가져올 수 있다.
DataController.GetInstance().SubGold(currentCost);
level++;
DataController.GetInstance().AddGoldPerClick(goldByUpgrade);
UpdateUpgrade();
UpdateUI(); // UI도 갱신해준다.
DataController.GetInstance().SaveUpgradeButton(this);
}
}
public void UpdateUpgrade(){
goldByUpgrade = startGoldByUpgrade * (int) Mathf.Pow(upgradePow, level); // Mathf.Pow() 몇 승.
currentCost = startCurrentCost * (int) Mathf.Pow(costPow, level);
}
public void UpdateUI(){
upgradeDisplayer.text = upgradeName + "\nCost: " + currentCost + "\nLevel:" + level + "\nNext New GoldPerClick: "+ goldByUpgrade;
}
}
Item Button 생성
마찬가지로 ItemButton.cs 파일을 생성하고 Itme Button을 만들어 연결한뒤 OnClick시에 function을 연결한다
특이적으로 자동적으로 초마다 골드가 올라가야하므로 Coroutine을 사용하여 초마다 While 문을 돌린다
StartCoroutine("AddGoldLoop");
IEnumerator AddGoldLoop(){ // COROUTINES 중간에 멈출 수 있다.
while(true){
if(isPurchased){
DataController.GetInstance().AddGold(goldPerSec);
}
yield return new WaitForSeconds(1.0f); // 1초대기후에 다시 실행
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ItemButton : MonoBehaviour
{
public Text itemDisplayer;
public string itemName;
public int level = 0; // item이 활성화되기전에 아무 역할을 못하니까
[HideInInspector]
public int currentCost;
public int startCurrentCost = 1;
[HideInInspector]
public int goldPerSec; // 초간 골드 추가량
public int startGoldPerSec = 1;
public float costPow = 3.14f;
public float upgradePow = 1.07f;
[HideInInspector]
public bool isPurchased = false; // 아이템 구매 여부
void Start(){
// currentCost = startCurrentCost;
// goldPerSec = startGoldPerSec;
DataController.GetInstance().LoadItemButton(this);
StartCoroutine("AddGoldLoop");
UpdateUI();
}
public void PerchaseItem(){
if(DataController.GetInstance().GetGold() >= currentCost){
isPurchased = true;
DataController.GetInstance().SubGold(currentCost);
level++;
UpdateItem();
UpdateUI();
DataController.GetInstance().SaveItemButton(this);
}
}
IEnumerator AddGoldLoop(){ // COROUTINES 중간에 멈출 수 있다.
while(true){
if(isPurchased){
DataController.GetInstance().AddGold(goldPerSec);
}
yield return new WaitForSeconds(1.0f); // 1초대기후에 다시 실행
}
}
public void UpdateItem(){
goldPerSec = goldPerSec + startGoldPerSec * (int) Mathf.Pow(upgradePow, level);
currentCost = startCurrentCost * (int) Mathf.Pow(costPow, level);
}
public void UpdateUI(){
itemDisplayer.text = itemName + "\nLevel: " + level + "\nCost: " + currentCost +
"\nGold Per Sec: "+ goldPerSec + "\nisPerchased: " + isPurchased;
}
}
Canvas에서 UI - Penel을 생성하여 위치와 사이즈를 조정한뒤 각 요소들을 아래로 끌고 온다
Panel에서 Add Component - Vertical Layout Group 삽입후 Control Child Size를 클릭해주면 aligning이 된다.
그 뒤에 생성한 game Object 를 하단의 Assets으로 끌고 오면 Prefab 이 생성되는대 위의 Object를 삭제한후 Pefab을 위로 끌고오면 똑같이 작동하는 요소들이 만들어진다
각각 Public 변수 값을 변경한뒤에 여러 요소로 작동하도록 만들면 된다
'C#' 카테고리의 다른 글
[Unity / C#] 2D 젤리 키우기 게임 -1.도트장면 만들기 및 Ai구현 (1) | 2022.10.03 |
---|---|
클릭커 게임만들기 (다른버전) (0) | 2022.10.03 |
[C#]델리게이트 (delegete)개념 (0) | 2022.08.10 |
이벤트(Event) (0) | 2022.08.09 |
하드코딩(HardCoding)정의 (0) | 2022.08.09 |