오늘은 어제 계획한대로 1주차 게임을 체크리스트를 확인하며 수정하게 되었습니다.
비교하기 쉽도록 이전과 이후의 영상을 올렸습니다.
추가된 점
- 새로운 씬
- 오디오
- 다른 캐릭터와 반응형 동작 애니메이션
- 피버시스템
- 대형 몬스터
문제와 해결 경험
1번째 문제.
❌ : 피버게이지를 0.2f 씩 추가하는데도 반복하는 과정에서 0.998과 같이 코드가 이상해져 피버 게이지 이상을 넘겼습니다.
🔨 : 확인해보니 피버 게이지를 초기화할 때, 0.05f씩 감소시켰는데 그로 인해 피버 게이지가 마이너스를 가는 것이 문제였습니다. 그렇기에 0.0f 미만일 때는 0.0f로 고정하도록 하였습니다.
//피버상태일 때,
if(isFever == true)
{
//Invoke가 켜져 있지 않다면,
if(isInvoke == false)
{ //피버를 줄이는 Invoke를 실행해라.
InvokeRepeating("FeverDown", 1f, 0.5f);
isInvoke = true;
}
if(fever < 0.0f)
{
isFever = false;
fever = 0.0f;
AudioManager.Instance.musicChange();
//피버가 종료되면 Invoke를 꺼라.
CancelInvoke("FeverDown");
isInvoke = false;
}
}
public void FeverDown()
{
fever -= 0.05f;
Front.localScale = new Vector3(fever / 1.0f, 1.0f, 1.0f);
}
2번째 문제.
❌ : 빗물의 빠르기를 조절하고 싶은데 Invoke로 생성 중이었기에 변경이 불가능했습니다.
🔨 : Invoke를 CancelInvoke로 지우고 다시 실행하는 것으로 속도를 줄였습니다.
void Start()
{
InvokeRepeating("MakeRain", 0f, 1.0f);
}
void MakeRain()
{
Instantiate(rain);
totalRain += 1;
if (totalRain % 10 == 0)
{
MakeMonster();
InvokeSpeed();
}
}
void InvokeSpeed()
{
CancelInvoke("MakeRain");
Speed = Speed - Speed * 0.3f;
InvokeRepeating("MakeRain", 1f, Speed);
}
3번째 문제.
❌ : 특정 동작을 할 때, 버벅거림이 생겼습니다.
🔨 : 튜터님 찬스, 코드 상에는 큰 문제가 없었으나, 두 개의 씬에서 각각 AudioManager를 1개씩 사용하고 있었습니다. static의 경우, 충돌이 일어날 수 있으니, 최초의 실행이 필요한 곳에 하나만 두고 DontDestroy를 이용하여 옮겨서 사용해야한다고 들었습니다. Destroy 함수가 같은 스크립트를 가진 다른 Manager를 지울 것이라 기대하였지만, 그런 용도는 아닌 거 같습니다.
private void Awake()
{
if(Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
4번째 문제.
❌ : 캐릭터에 점프 애니메이션을 추가하였으나, 물방울에 밀려서 애니메이션이 정상 작동되지 않았습니다.
🔨 : 기존에 사용하던 코드에서는 OnColisionEnter2D를 사용하고 있었는데, 이는 물리효과를 받는 상태일 때 쓰는 코드였습니다. Collision 에서 is Trigger 체크를 하고 OnTriggerEnter2D로 바꾸면 물리엔진은 받지 않으며, Collision에 들어온 것에 대해 대응하는 코드를 만들 수 있습니다.
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Bubble"))
{
audio.PlayOneShot(clip);
anim.SetTrigger("Isbubble");
}
if (collision.gameObject.CompareTag("Monster"))
{
audio.PlayOneShot(monsterCut);
anim.SetTrigger("Isbubble");
}
}
5번째 문제.
❌ : IF 문에서 값을 비교하는데 계속 False 값만 나왔다.
🔨 : public으로 선언된 변수와 Start나 Update 내에 있는 변수는 이름이 같아도 별개로 취급되는 지역변수, 전역변수이기에 이름을 작성할 때 유의하며 작성해야한다. 버그도 아닐 뿐더러 이와 관련된 문제는 검색해서 문제해결도 힘들기에 처음부터 잘 보면서 작성해야한다.
//public int status였다.
int status = 0;
void Start()
{
float x = Random.Range(-1.8f, 1.8f);
float y = Random.Range(3.0f, 4.0f);
transform.position = new Vector3(x, y, 0);
Type = Random.Range(1, 7);
renderer.sprite = Resources.Load<Sprite>($"Bird{Type}");
//밑에 글을 int status라고 적었었다.
status = Random.Range(1, GameManager.Instance.totalRain) + GameManager.Instance.totalScore;
statusText.text = status.ToString();
}
이외에도 배운 것
- 버그가 많을수록 고치는데 드는 시간이 제작하는 시간의 배로 든다.
- 올바르게 정리된 기획은 추후 기획을 확인하고, 게임을 제작할 때 길잡이가 되어 많은 도움이 된다.
- [튜터님] 모든 참조 찾기를 통해 현재 선택한 함수가 참조된 곳을 쉽게 찾을 수 있다.
- [튜터님] 참조된 함수를 드래그하고 F12를 누르면 그 함수의 정의된 곳을 확인할 수 있다.
후기
오늘 1, 2주차까지 업그레이드 버전을 만들려고 했었는데 문제가 제법 많았고 기획이 제대로 되어있지 못해 상당히 많은 시간을 소비하였습니다. 1주차도 간신히 합격점인 느낌으로 완성할 수 있었고 오늘의 문제점 및 배운 것을 마음에 되새기며, 더 성장하는 개발자가 되어봅시다.
'유니티 스파르타 캠프 1주차' 카테고리의 다른 글
주석, TIL, 3주차 게임 편집, Tistory 잘 쓰기 (2) | 2025.04.11 |
---|---|
3주차 게임 업그레이드 기획 (0) | 2025.04.10 |
2주차 게임 수정 결과 (0) | 2025.04.10 |
9시부터 9시까지 개발 첫 후기 (2) | 2025.04.07 |