무한모드 제작#1
오류 수정 #메타데이터이제 검토만 끝내고 본격적으로 사람만 모으면 될거라 생각했는데 문제가 한가지 생겼다 바로 검토 과정에서 앱이 거부된것.이메일로 자세한 정보를 전송했다니 확인
sangeun00.tistory.com
위글에서 어려운 부분이 전부 끝났으니 이제 본격적으로 무한모드에 맞춰 모든 프리팹이나
코드들을 고쳐주도록 하겠다

우선 ELEnemy용으로 프리팹을 복사하여 만들어주었다.
굳이 이렇게 한 이유는 기존 적 유닛들은 SPGameManager와 상응하는 관계이기 때문...
이 유닛들은 ELGameManager와 연계될 예정이다
자 이제 이 유닛들을 컨트롤하는 스크립트가 있을것이다. 하지만 그 스크립트 역시
SPGameManager와 연계되기 때문에 조금 번거럽더라도 코드의 쉬운 관리를 위해 EndLess용 코드를 새로 만들어주었다

당연히 기존 코드들과 다른건 SPGameManager > ELGameManager로 바꿔주었다는것
그것말고는 아무것도 없다

그 다음은 Endless 모드에서 쓰일 플레이어의 공을 컨트롤 하는 코드이다
하나하나 다 짚을순없고 SPGameManager와 관련된 모든것을 ELGameManager로 대체해주었다
---------------------------------------------
아....아니다...이렇게 하려니 정말 끝도 없다는 생각이 들어 방법을 바꿔주었다
public void RemoveEnemy()
{
totalEnemies--;
if (totalEnemies <= 0)
{
string currentSceneName = SceneManager.GetActiveScene().name;
if (currentSceneName == "Story-InGame")
{
StoryStageClear();
}
else if (currentSceneName == "EndlessInGame")
{
EndlessStageClear();
}
else
{
Debug.LogWarning("RemoveEnemy: Unknown scene name. No clear action taken.");
}
}
}
private void StoryStageClear()
{
if (gameManager.StageClearID == StageState.chooseStage && gameManager.StageClearID != 65)
{
gameManager.StageClearID += 1;
gameManager.SaveStageClearID();
}
SceneManager.LoadScene("Clear");
}
private void EndlessStageClear()
{
gameManager.ELlevel += 0.2f;
gameManager.SaveELlevel();
SceneManager.LoadScene("Clear");
}
}
그냥 SPGameManager를 그대로 쓰되, 약간의 수정으로 현재 씬의 이름에 따라 실행하는 메서드를
다르게 해주기로 했다
이렇게 하면 아무것도 바꿔줄 필요없이 클리어씬과 패배씬만 만들어주면 된다


클리어씬은 기존 스토리모드에서 쓴 클리어 씬을 그대로 가져온 대신 ELClearBall이라는 스크립트를 따로 만들어
드래그한 부분만 수정해주었다

Fail씬도 우선 임시로 챌린지모드에서 쓰던걸 가져왔다.
재도전을 누르면 당연히 Endless모드로, 뒤로 가기를 누르면 시작화면으로 가도록 하였다

그 다음은 게임 정지시 나오는 옵션메뉴. 나머지는 그대로고
랜덤 스테이지는 다시 똑같은 ELlevel안에서 스테이지를 랜덤으로 돌릴수 있도록 해주었다
----------------------------------------------------------
사실 전글에서 난이도 밸런스를 만들어보긴 했지만 너무나도 허점이 많이 보이고
개선해야 할 부분이 필요해 보여 다시 다듬어보도록 하겠다

원래는 한 스테이지마다 0.2씩 늘어나 밸런스를 올려가던 ELlevel에 이어
ELnum, ELRound라는 변수를 추가해주었다
둘다 스테이지 넘버링에 붙을 예정이며 만약 계속해서 게임을 클리어하여
ELlevel이 100까지 올라간다면...사실 아무리 숙달된 사람이라도 더이상 클리어하기 불가능한 영역이다
그리고 점점 생성되는 유닛의 수가 많아질수록 성능에 부담이 가기도 하고...
그렇기에 라운드라는 개념을 추가해주었다
맨처음엔
라운드 : 1 (ELRound) 스테이지 : 1 (ELnum) 난이도 : 2(ELlevel) 로 시작한다

한번 클리어 할때마다 스테이지는 1씩 증가하고 난이도는 0.4씩 증가할 예정이다
그리고 25번째 스테이지를 클리어하는 순간 1라운드가 증가하고 스테이지와 난이도는 각각 1, 2로 초기화된다
그럼 라운드가 올라가면 무엇이 달라지냐? 앞으로 등장할 모든 유닛의 체력이 라운드 수만큼 증가하게 된다
using UnityEngine;
public class StageGameManager : MonoBehaviour
{
public static StageGameManager instance = null;
public int StageClearID;
public int ELRound;
public int ELnum;
public float ELlevel;
private int ELnumIDCache;
private float ELlevelIDCache;
private int ELRoundIDCache;
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
ELRoundIDCache = PlayerPrefs.GetInt("ELRound", 1);
ELnumIDCache = PlayerPrefs.GetInt("ELnum", 1);
ELlevelIDCache = PlayerPrefs.GetFloat("ELlevel", 2);
stageClearIDCache = PlayerPrefs.GetInt("StageClearID", 0);
isEndingCache = PlayerPrefs.GetInt("IsEnding", 0) == 1;
ELRound = ELRoundIDCache;
ELnum = ELnumIDCache;
ELlevel = ELlevelIDCache;
StageClearID = stageClearIDCache;
isending = isEndingCache;
}
}
public void SaveELlevelAndELnum ()
{
if (ELRoundIDCache != ELRound)
{
PlayerPrefs.SetInt("ELRound", ELRound);
PlayerPrefs.Save();
ELRoundIDCache = ELRound;
}
if (ELnumIDCache != ELnum)
{
PlayerPrefs.SetInt("ELnum", ELnum);
PlayerPrefs.Save();
ELnumIDCache = ELnum;
}
if (ELlevelIDCache != ELlevel) // 값이 변경된 경우에만 저장
{
PlayerPrefs.SetFloat("ELlevel", ELlevel);
PlayerPrefs.Save();
ELlevelIDCache = ELlevel;
}
}
}
우선 당연히 라운드와 스테이지의 개념을 추가해주었고
using System;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SPGameManager : MonoBehaviour
{
private void CheckBallLimit()
{
if (totalBalls > 16)
{
string currentSceneName = SceneManager.GetActiveScene().name;
if (currentSceneName == "Story-InGame")
{
SceneManager.LoadScene("Fail");
}
else if (currentSceneName == "EndlessInGame")
{
SceneManager.LoadScene("ELFail");
}
}
}
public void RemoveEnemy()
{
totalEnemies--;
if (totalEnemies <= 0)
{
string currentSceneName = SceneManager.GetActiveScene().name;
if (currentSceneName == "Story-InGame")
{
StoryStageClear();
}
else if (currentSceneName == "EndlessInGame")
{
EndlessStageClear();
}
}
}
private void EndlessStageClear()
{
gameManager.ELnum += 1;
gameManager.ELlevel += 0.4f;
if(gameManager.ELnum >= 25)
{
gameManager.ELRound += 1;
gameManager.ELnum = 1;
gameManager.ELlevel = 2;
}
gameManager.SaveELlevelAndELnum();
SceneManager.LoadScene("ELClear");
}
}
인게임 매니저에서 게임이 클리어 조건을 만족시킨다면 EndlessStageClear 메서드를 실행시켜준다
여기 25 스테이지 = 1라운드 업의 조건을 만들어주었다
public class Enemy1center : MonoBehaviour
{
StageGameManager stagegameManager;
SPGameManager spGameManager;
public int durability;
private void Start()
{
string scenename = SceneManager.GetActiveScene().name;
durability = Random.Range(MinHP, MaxHP);
if(scenename == "EndlessInGame")
{
durability += stagegameManager.ELRound;
}
initialRandomNumber = durability; // 초기 randomNumber 값을 저장
if (isShowHP)
{
textMesh.text = durability.ToString();
}
그리고 적 유닛의 체력을 관리하는 부분에서 내구도에 ELRound만큼 체력을 더해주었다
이제 이렇게 되면 어느정도 밸런스 조절이 될것이다
난이도도 수정하고 밸런스도 잡았겠다, 이제 정말 마무리 작업으로 해줄것은
인게임 내에 있는 고정구체와 배경색의 랜덤생성이다
private void Start()
{
stageGameManager = FindAnyObjectByType<StageGameManager>();
if (stageGameManager != null)
{
SpawnEnemies(stageGameManager.ELlevel);
}
SpawnRandomGojungPrefab();
RandomizeBackgroundColor();
}
private void RandomizeBackgroundColor()
{
if (BackGround != null)
{
SpriteRenderer spriteRenderer = BackGround.GetComponent<SpriteRenderer>();
if (spriteRenderer != null)
{
// RGB 값을 랜덤으로 설정 (0.0f ~ 1.0f 범위)
float r = Random.Range(0f, 1f);
float g = Random.Range(0f, 1f);
float b = Random.Range(0f, 1f);
spriteRenderer.color = new Color(r, g, b);
Debug.Log($"Background color randomized to: R={r}, G={g}, B={b}");
}
}
}
private void SpawnRandomGojungPrefab()
{
if (GojungPrefabs.Length > 0)
{
GameObject selectedGojung = GojungPrefabs[Random.Range(0, GojungPrefabs.Length)];
Instantiate(selectedGojung, Vector3.zero, Quaternion.identity);
}
}
사실 어렵지 않았다...
SpawnRandomGojungPrefab();
RandomizeBackgroundColor();
각자의 역할을 맡고 있는 두개의 메서드를 만들고 Start메서드에서 게임이 시작될때 둘다 한번씩 돌려주면 된다
랜덤 생성이 잘 이뤄지는걸 확인해볼수 있는 동영상
무슨 이유인지 첨부가 되질 않아 이렇게 붙인다...
'Galaxy Ball > 4. 싱글플레이 - 무한모드' 카테고리의 다른 글
무한모드 제작#1 (0) | 2025.01.01 |
---|