서론
사실 생각했던 것보다 다들 비슷하게 했던 것 같고, 발표자료가 미흡해서 시선을 못끌었던 것 같다.
고생많았습니다:)
아쉬운게 많았던 첫 프로젝트지만 일주일만에 끝냈다는게 나.... 사실은 게으른거일지도..?
근데 빨리빨리 더 좋은 결과를 만들고 싶어서 모르면 생각해보지도않고 바로 인터넷에 검색하고 인터넷에도 잘 안나오면 GPT에 물어보고 해서 온전히 내 지식으로 만들지는 못한 것 같다.
나는 뼈대만 줬지 다른 사람이 모두 만든 것이나 다름 없으니깐.. 가끔 더듬어 보다보면 어? 맞다! 여기 있었지! 하는 느낌.
아마 구현해야하는 기능중에 배분이 쉽지가 않아서 소수의 팀원과 내가 했기에 촉박하게 하느라 어쩔 수 없던 느낌이다.
그래서 했던 코드를 찬... 찬히 읽어보고......... 외울거다.......... 외우고......... 손코딩이 가능할때까지 외울거다........
그게 내 목표다..................
오늘은 발표하는 날이라 따로 뭘하진않았고 몰래 새벽까지 프로젝트를 고쳤다.
난이도별 잠금 시스템을 만들고 나니깐 다시하기와 다음단계를 눌렀을때 오브젝트가 생성되지 않는 오류가 생겼는데 그것때문에 좀 걸렸다. 이 오류가 생긴 이유는 ..... 이건 진짜 사소한 실수인데.. 조원들한테도 말안한문제.... ㅎㅎㅎ
프리팹에 카드프리팹1이 하나가 더 생겨서 처음 생성되는 애랑 그 다음 거기에 잘못 연결시켜놔서 그런거였읍니다.. 여러분 죄송합니다........ ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
자자.... 여기까지는 그렇다 치고!
그러면 끝난거 아니냐 싶은데 아니다. 분명 난이도 클리어 변수로 플레이어 프리팹스에 저장해서 클리어시에 버튼이 활성화 돼서 버튼을 클릭할 수 있도록 하려고 했는데,, (첫번째 단계는 무조건 활성화 되어있게함)
아나 이번엔 메인씬에서 게임 도중에 클리어도 안하고 Home버튼을 눌렀더니 그냥 자동으로 버튼이 하나씩 풀리네?
자 어디까지 해보나 하고 4번해보면 진짜 한번씩 다음단계 다 풀림...
그래서 이게 뭔일인고.... 하고 이걸 수정하다가 시간이 오래 걸렸다.
결국!!! 플레이어컨트롤러 스크립트에 싱글톤으로 클리어 기록을 저장해놓을 수 있도록 해놨다.
근데 아무리해도 안됐다....
아니 왜 안돼. 왜..라고 생각하면서 스크립트를 읽어봐도 안될리가 없는데 아니 왜 안되지 아니 안될리가 없는데 하.. 하다가 그냥 로그로 확인해보자 하고 로그로 작성하고 실행했더니 "플레이어가 연결이 안댐ㅋㅋㅅㄱ"
라고 떴다. 확인해봤는데. 드래그앤드롭 안해놨다.
카악퉷
그리고 어이. 없게. 여러분 .
왜 저 따위의 블로그에 막 들어오시나요 ㅋ?
굉장히 북그럽고요. ㅋ
그 다음날을 기대하게 된다고요 ㅋ... ㅋㅋ
어이!!!!!!!!!!! 이것봐봐!!!!!!!!!!!!!!!!!!!!!
나 혹시 디도스 맞은거 아니지? 꽥...
ㅜ0ㅜ 오늘도 평균인건데 어제 엄청 많아서 비교가 되잖아.....
본론
본론은 별 거 없다. 다 올리려고 했는데 이번에 중요하게 수정한것만 올려야겠다.
넘 길어
// PlayerController.cs - 플레이어의 난이도 클리어 여부 저장할 스크립트
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private int currentDifficulty; // 현재 진행 중인 난이도
private int highDifficulty; // 가장 높은 난이도
private bool[] clearArr; // 클리어한 난이도를 저장하는 배열
void Start()
{
clearArr = new bool[5]; // 난이도는 1부터 5까지이므로 크기가 5인 배열 사용
// 현재 난이도를 설정
currentDifficulty = PlayerPrefs.GetInt("Difficulty", 1);
// 가장 높은 클리어된 난이도를 설정
highDifficulty = PlayerPrefs.GetInt("HighDifficulty", 1);
// 클리어한 난이도를 설정
for (int i = 0; i < currentDifficulty; i++)
{
SetLevelCleared(i + 1, true); // 이전 난이도까지 클리어 상태로 설정
}
}
// 클리어 상태를 설정하는 함수
public void SetLevelCleared(int difficulty, bool cleared)
{
clearArr[difficulty - 1] = cleared; // 배열 인덱스는 0부터 시작하므로 difficulty에서 1을 뺀다. 버튼 난이도 1부터 시작
// 최고값 갱신
if (cleared && difficulty > highDifficulty)
{
highDifficulty = difficulty;
PlayerPrefs.SetInt("HighDifficulty", highDifficulty);
}
}
// 클리어 상태를 반환하는 함수
public bool IsLevelCleared(int difficulty)
{
return clearArr[difficulty - 1];
}
// 현재 진행 중인 난이도 반환
public int GetCurrentDifficulty()
{
return currentDifficulty;
}
// 가장 높은 난이도
public int GetHigDifficulty()
{
return highDifficulty;
}
}
// EndScore.cs - EndPanel에 연결하고 걔가 켜질때 관리하는 스크립트
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class EndScore : MonoBehaviour
{
public Image weName; // 매칭성공시 우리이름
public Text endTitle; // 성공 실패 텍스트
public Text endTimeTxt; // 몇초 남았는지
float timeDate = 0;
public Text TryTxt; // 시도 횟수
int tryDate = 0;
public Text scoreTxt; // 점수 텍스트
int scoreDate = 0;
public Text stageTxt; // 스테이지 텍스트
float stageDate = 0;
float stagePercent = 0;
float stageNum = 0;
public Text totalTxt;
float totalDate = 0;
float clearScore = 0;
public Text bestScoreTxt; // 최고점수 텍스트
public Button retryBtn; // 다시하기 버튼
public Button nextRoundBtn; // 다음 단계 버튼
public Button checkBtn; // 확인 버튼
float bestScore = 0;
void Start()
{
// 플레이어프리팹스에서 저장된 난이도 값을 가져옴
int difficulty = PlayerPrefs.GetInt("Difficulty", 1);
timeDate = 30.0f - GameManager.instance.time;
endTimeTxt.text = timeDate.ToString("N2");
tryDate = GameManager.instance.tryCount;
TryTxt.text = tryDate.ToString();
scoreDate = GameManager.instance.score;
scoreTxt.text = scoreDate.ToString();
stageDate = difficulty; // ImageButton 스크립트에서 저장된 난이도 값을 사용
stagePercent = 1f + (stageDate * 0.2f);
stageNum = stageDate;
stageTxt.text = stageNum.ToString();
totalDate = (timeDate + tryDate + scoreDate) * stagePercent;
totalTxt.text = totalDate.ToString("N0");
clearScore = (stageDate * 10) + 60;
// 이전에 저장된 베스트 스코어 가져오기
bestScore = PlayerPrefs.GetFloat("BestScore" + difficulty, 0);
// 현재 스코어가 베스트 스코어보다 높으면 베스트 스코어를 갱신
if (totalDate > bestScore)
{
bestScore = totalDate;
PlayerPrefs.SetFloat("BestScore" + difficulty, bestScore);
}
// 베스트 스코어 표시
bestScoreTxt.text = bestScore.ToString("N0");
if (timeDate >= 0)
{
endTitle.text = "성공";
weName.gameObject.SetActive(true);
// 다음단계 버튼 활성화 여부 설정
bool isNextRoundUnlocked = difficulty < 5;
nextRoundBtn.interactable = isNextRoundUnlocked;
if (isNextRoundUnlocked)
{
nextRoundBtn.onClick.AddListener(NextRoundButtonClicked);
}
else
{
nextRoundBtn.gameObject.SetActive(false); // 다음 단계 버튼을 비활성화
checkBtn.gameObject.SetActive(true);
checkBtn.onClick.AddListener(SaveAndExit);
}
retryBtn.gameObject.SetActive(true);
retryBtn.onClick.AddListener(RetryGame);
}
else
{
timeDate = 0;
endTitle.text = "실패";
weName.gameObject.SetActive(false);
retryBtn.gameObject.SetActive(true);
retryBtn.onClick.AddListener(RetryGame);
checkBtn.gameObject.SetActive(true);
checkBtn.onClick.AddListener(SaveAndExit);
nextRoundBtn.gameObject.SetActive(false); // 다음 단계 버튼을 비활성화
}
}
public void SaveAndExit()
{
// 현재 난이도
int currentDifficulty = PlayerPrefs.GetInt("Difficulty", 1);
// 클리어한 내용을 플레이어프리팹스에 저장
PlayerPrefs.SetInt("Round" + currentDifficulty + "Cleared", 1); // 현재 난이도의 클리어 상태를 true로 설정
PlayerPrefs.SetInt("GameCleared", 1);
// 스테이지 씬으로 이동
SceneManager.LoadScene("StageScene");
}
public void RetryGame()
{
// 현재 난이도
int currentDifficulty = PlayerPrefs.GetInt("Difficulty", 1);
// 다시하기를 누르면 난이도를 감소시킴 왜냐면 게임매니저에서 짝 다맞추면 자동으로 난이도 +1시켜서 근데 이건 성공하면 다시하기 버튼을 빼서 필요없는 코드가 됐다.
int previousDifficulty = currentDifficulty - 1;
if (previousDifficulty >= 1)
{
PlayerPrefs.SetInt("Difficulty", previousDifficulty);
PlayerPrefs.SetInt("Round" + currentDifficulty + "Cleared", 0); // 현재 난이도의 클리어 상태를 false로 설정
PlayerPrefs.SetInt("GameCleared", 0);
SceneManager.LoadScene("MainScene");
}
}
public void NextRoundButtonClicked()
{
int currentDifficulty = PlayerPrefs.GetInt("Difficulty", 1);
// 현재 클리어한 난이도의 다음 난이도를 확인
int nextDifficulty = currentDifficulty + 1;
SceneManager.LoadScene("MainScene");
}
}
// BtnController.cs - 난이도를 저장할 버튼 버튼에 직접 난이도 지정해주시면 됩니다용
using UnityEngine;
using UnityEngine.UI;
public class BtnController : MonoBehaviour
{
public int difficulty; // 난이도 값을 받을 변수
private Image buttonImage;
private Button button;
private PlayerController playerController;
private void Start()
{
buttonImage = GetComponent<Image>();
button = GetComponent<Button>();
// Player 프리팹에서 스크립트 가져오기
GameObject playerObject = GameObject.FindWithTag("Player");
if (playerObject != null)
{
playerController = playerObject.GetComponent<PlayerController>();
}
bool isCleared = playerController.IsLevelCleared(difficulty);
bool isFirstDifficulty = difficulty == 1; // 첫번째 스테이지는 풀어놔야해서
// 1단계거나 클리어 됐거나하는 버튼 활성화
if (isCleared || isFirstDifficulty)
{
button.interactable = true;
buttonImage.color = Color.white;
}
else
{
// 버튼 비활성화
button.interactable = false;
}
}
public void OnClick()
{
// 플레이어의 클리어 상태 저장
playerController.SetLevelCleared(difficulty, true);
// 다음 난이도가 존재하고 클리어되지 않았다면 클리어 상태 설정
int nextDifficulty = difficulty + 1;
if (nextDifficulty <= 5) // 팀원이 5명이라 총 5단계까지 있음
{
if (!playerController.IsLevelCleared(nextDifficulty))
{
playerController.SetLevelCleared(nextDifficulty, false); // 다음 난이도의 클리어 상태를 false로 설정
}
}
// 난이도 값 저장 보드가 배열을 만들 수 있게 해야함
PlayerPrefs.SetInt("Difficulty", difficulty);
UnityEngine.SceneManagement.SceneManager.LoadScene("MainScene");
}
}
기능 영상
KPT 회고
K(keep): 현재 만족하고 있는 부분, 계속 이어갔으면 하는 부분
P(problem): 불편하다고 느끼는 부분, 개선이 필요하다고 생각되는 부분
T(try): Problem에 대한 해결책, 다음 회고때 판별 가능한 것, 당장 실행 가능한 것
보상이 주어지는 프로젝트가 아니였음에도 내가 먼저 나서서 팀장을 하고 내가 나서서 팀원들이 하지않은 기능들을 구현하려고 노력한 행동이 참 뿌듯하다. 사실 나도 필수 기능만 구현하고 내 공부를 했어도 됐는데 UI를 꾸미고 나 자신이 손에 프로그램이 바뀌어나가는 모습에 참 보람찼던 것 같다.
하지만 팀원들이 하지않는 기능을 무리해서 하려고 하다보니 시간이 부족해서 이해할 시간이 부족하여 결과 나오는것만 집착하여 공부가 전혀 되지않는 행동을 했다. 물론 그렇게 해도 공부는 됐지만 휘발성 기억이라 좋은 기억이라고는 말하지 못할 것 같다. 이런점은 마음속의 짐을 좀 내려놓고 할 수 있는 양까지만해서 내 공부를 완벽하게 끝내야겠다.
이 문제가 일어난 이유가 나는 C#문법이 알고리즘에 집중되어 있는데 유니티에서 사용하는 문법이 어색하다 보니깐 어렵다고 느껴져서 그런 것 같다. 그러니 유니티로 코딩 된 프로그램의 코드를 많이 읽어봐야겠다.
Ps. 나 독수리타법인데 한손독수리거든? 근데 애들이 보면 다들 먼소리냐고 비웃다가 진짜 한타 500 나오면 띠용하는데, 영타는 사실 100나옴... 튜터님이 영타 연습하라는데 답답해서 겨드랑이.에. 땀이. 났다....
'Record > TIL' 카테고리의 다른 글
[Unity] 추상클래스와 파일 세분화 중요성 (2) | 2024.04.23 |
---|---|
[Unity] 코딩 문제로 오니 숨이 트인다!! (2) | 2024.04.22 |
[Unity] 난 감자 돌맹이 방구 코딱지 (4) | 2024.04.18 |
[Unity] 술 한잔 마셨습니다.. (2) | 2024.04.17 |
[Unity] 캠 끄고 몰래 춤추다 매니저님께 들키기 (3) | 2024.04.16 |