반응형
1. DataManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DataManager : MonoBehaviour
{
public static DataManager instance;
[Header(" Data ")]
private int coins;
private int score;
private int bestScore;
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
LoadData();
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void AddCoins(int amount)
{
coins += amount;
SaveData();
}
public void RemoveCoins(int amount)
{
coins -= amount;
coins = Mathf.Max(coins, 0); // Ensure coins don't go negative
SaveData();
}
public void IncreaseScore(int amount)
{
score += amount;
if (score > bestScore)
bestScore = score;
SaveData();
}
public int GetCoins()
{
return coins;
}
public int GetScore()
{
return score;
}
public int GetBestScore()
{
return bestScore;
}
private void LoadData()
{
coins = PlayerPrefs.GetInt("coins", 150);
score = PlayerPrefs.GetInt("score");
bestScore = PlayerPrefs.GetInt("bestScore");
}
private void SaveData()
{
PlayerPrefs.SetInt("coins", coins);
PlayerPrefs.SetInt("score", score);
PlayerPrefs.SetInt("bestScore", bestScore);
}
}

2. UIManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class UIManager : MonoBehaviour
{
public static UIManager instance;
[Header(" Elements ")]
[SerializeField] private CanvasGroup gameCG;
[SerializeField] private CanvasGroup levelCompleteCG;
[Header(" Level Complete Elements ")]
[SerializeField] private TextMeshProUGUI levelCompleteCoins;
[SerializeField] private TextMeshProUGUI levelCompleteSecretWord;
[SerializeField] private TextMeshProUGUI levelCompleteScore;
[SerializeField] private TextMeshProUGUI levelCompleteBestScore;
[Header(" Game Elements ")]
[SerializeField] private TextMeshProUGUI gameScore; //3차 코드
[SerializeField] private TextMeshProUGUI gameCoins; //3차 코드
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
ShowGame();
HideLevelComplete();
GameManager.onGameStateChanged += GameStateChangedCallback;
}
private void OnDestroy()
{
GameManager.onGameStateChanged -= GameStateChangedCallback;
}
private void GameStateChangedCallback(GameState gameState)
{
switch (gameState)
{
case GameState.LevelComplete:
ShowLevelComplete();
HideGame();
break;
}
}
// Update is called once per frame
void Update()
{
}
private void ShowGame()
{
gameCoins.text = DataManager.instance.GetCoins().ToString(); // 3차 코드
gameScore.text = DataManager.instance.GetBestScore().ToString(); // 3차 코드
ShowCG(gameCG);
}
private void HideGame()
{
HideCG(gameCG);
}
private void ShowLevelComplete()
{
levelCompleteCoins.text = DataManager.instance.GetCoins().ToString();
levelCompleteSecretWord.text = WordManager.instance.GetSecretWord();
levelCompleteScore.text = DataManager.instance.GetScore().ToString();
levelCompleteBestScore.text = DataManager.instance.GetBestScore().ToString();
ShowCG(levelCompleteCG);
}
private void HideLevelComplete()
{
HideCG(levelCompleteCG);
}
private void ShowCG(CanvasGroup cg)
{
cg.alpha = 1f;
cg.interactable = true;
cg.blocksRaycasts = true;
}
private void HideCG(CanvasGroup cg)
{
cg.alpha = 0f;
cg.interactable = false;
cg.blocksRaycasts = false;
}
}
3. GameManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public enum GameState { Menu, Game, LevelComplete, Gamecovr, Idle }
public class GameManager : MonoBehaviour
{
public static GameManager instance;
[Header(" Settings ")]
private GameState gameState;
[Header(" Events ")]
public static Action<GameState> onGameStateChanged;
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
}
public void SetGameState(GameState gameState)
{
this.gameState = gameState;
onGameStateChanged?.Invoke(gameState);
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void NextButtonCallback() // **GAMEUI Score추가 후 4차 코드
{
SetGameState(GameState.Game); // **GAMEUI Score추가 후 4차 코드
}
}

4. InputManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class InputManager : MonoBehaviour
{
[Header(" Elements ")]
[SerializeField] private WordContainer[] wordContainers;
[SerializeField] private Button tryButton;
[SerializeField] private KeyboardColorizer keyboardColorizer;
[Header(" Settings ")]
private int currentWordContainerIndex;
private bool canAddLetter = true;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
Initialize();
KeyboardKey.onKeyPressed += KeyPressedCallback;
GameManager.onGameStateChanged += GameStateChangedCallback; // 5차 코드 추가
}
private void OnDestroy() //추가
{
KeyboardKey.onKeyPressed -= KeyPressedCallback; // 추가
GameManager.onGameStateChanged -= GameStateChangedCallback; // 5차 코드 추가
}
private void GameStateChangedCallback(GameState gameState) // 5차 코드 추가
{
switch (gameState)
{
case GameState.Game:
Initialize();
break;
case GameState.LevelComplete:
break;
}
} // 여기까 5차 코드 추가
// Update is called once per frame
void Update()
{
}
private void Initialize()
{
currentWordContainerIndex = 0; // 5차 추가 코드
canAddLetter = true; // 5차 추가 코드
DisableTryButton(); // 5차 추가 코드
for (int i = 0; i < wordContainers.Length; i++)
wordContainers[i].Initialize();
}
private void KeyPressedCallback(char letter)
{
if (!canAddLetter)
return;
wordContainers[currentWordContainerIndex].Add(letter);
if (wordContainers[currentWordContainerIndex].IsComplete())
{
canAddLetter = false;
EnableTryButton();
//CheckWord();
//currentWordContainerIndex++;
}
}
public void CheckWord()
{
string wordToCheck = wordContainers[currentWordContainerIndex].GetWord();
string secretWord = WordManager.instance.GetSecretWord();
wordContainers[currentWordContainerIndex].Colorize(secretWord);
keyboardColorizer.Colorize(secretWord, wordToCheck);
if (wordToCheck == secretWord)
{
SetLevelComplete(); // 추가
}
else
{
Debug.Log("Wrong word");
canAddLetter = true;
DisableTryButton();
currentWordContainerIndex++;
}
}
private void SetLevelComplete()
{
UpdateData(); //3차 추가
GameManager.instance.SetGameState(GameState.LevelComplete);
}
private void UpdateData()
{
int scoreToAdd = 6 - currentWordContainerIndex;
DataManager.instance.IncreaseScore(scoreToAdd);
DataManager.instance.AddCoins(scoreToAdd * 3);
}
public void BackspacePressedCallback()
bool removedLetter = wordContainers[currentWordContainerIndex].RemoveLetter();
if (removedLetter)
DisableTryButton();
canAddLetter = true;
}
private void EnableTryButton()
{
tryButton.interactable = true;
}
private void DisableTryButton()
{
tryButton.interactable = false;
}
}
5. WordContainer.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class WordContainer : MonoBehaviour
{
[Header(" Elements ")]
private LetterContainer[] letterContainers;
[Header(" Settings ")]
private int currentLetterIndex;
private void Awake()
{
letterContainers = GetComponentsInChildren<LetterContainer>();
//Initialize();
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void Initialize()
{
currentLetterIndex = 0; // 6차 코드 추가
for (int i = 0; i < letterContainers.Length; i++)
letterContainers[i].Initialize();
}
public void Add(char letter)
{
letterContainers[currentLetterIndex].SetLetter(letter);
currentLetterIndex++;
}
public bool RemoveLetter()
{
if (currentLetterIndex <= 0)
return false;
currentLetterIndex--;
letterContainers[currentLetterIndex].Initialize();
return true;
}
public string GetWord()
{
string word = "";
for (int i = 0; i < letterContainers.Length; i++)
word += letterContainers[i].GetLetter().ToString();
return word;
}
public void Colorize(string secretWord)
{
List<char> chars = new List<char>(secretWord.ToCharArray());
for (int i = 0; i < letterContainers.Length; i++)
{
char letterToCheck = letterContainers[i].GetLetter();
if(letterToCheck == secretWord[i])
{
//Valid
letterContainers[i].SetValid();
chars.Remove(letterToCheck);
}
else if(chars.Contains(letterToCheck))
{
// Pontential
letterContainers[i].SetPotential();
chars.Remove(letterToCheck);
}
else
{
// Invalid
letterContainers[i].SetInvalid();
}
}
}
public bool IsComplete()
{
return currentLetterIndex >= 5;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class KeyboardColorizer : MonoBehaviour
{
[Header(" Elements ")]
private KeyboardKey[] keys;
private void Awake()
{
keys = GetComponentsInChildren<KeyboardKey>();
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
GameManager.onGameStateChanged += GameStateChangedCallback; // 6차 코드 추가
}
private void OnDestroy()
{
GameManager.onGameStateChanged -= GameStateChangedCallback; // 6차 코드 추가
}
private void GameStateChangedCallback(GameState gameState) // 6차 코드 추가
{
switch (gameState)
{
case GameState.Game:
Initialize();
break;
case GameState.LevelComplete: // 6차 코드 추가
break;
}
}
private void Initialize()
{
for (int i = 0; i < keys.Length; i++)
keys[i].Initialize();
} // 여기끼지 6차 코드 추가
// Update is called once per frame
void Update()
{
}
public void Colorize(string secretWord, string wordToCheck)
{
for (int i = 0; i < keys.Length; i++)
{
char keyLetter = keys[i].GetLetter();
for (int j = 0; j < wordToCheck.Length; j++)
{
if (keyLetter != wordToCheck[j])
continue;
// the key letter we've pressed is equals to the current wordToCheck letter
if(keyLetter == secretWord[j])
{
// Valid
keys[i].SetValid();
}
else if(secretWord.Contains(keyLetter))
{
// Potential
keys[i].SetPotential();
}
else
{
// InValid
keys[i].SetInvalid();
}
}
}
}
}반응형
'IT > programming' 카테고리의 다른 글
| 5-LETTER WORD GAME SCRIPTS 1차 최종 정리 (0) | 2025.07.04 |
|---|---|
| Letter & KeyboardKey Colorize All C# Code (0) | 2025.07.03 |
| 대장동 사업의 진실 (1) | 2025.06.28 |
| 이재명 일기장 (3) | 2025.06.23 |
| 내란의 힘이 이재명을 두려워하는 이유 (0) | 2025.06.23 |