개발/개발일지

Tales Saga Chronicle Blast 개발일지 25 - 코드 리뷰

메피카타츠 2023. 9. 21. 23:10

Mepkatatsu/TSCB_OnlyScript: Tales Saga Chronicle Blast의 Script만이 포함된 Repository (github.com)

 

GitHub - Mepkatatsu/TSCB_OnlyScript: Tales Saga Chronicle Blast의 Script만이 포함된 Repository

Tales Saga Chronicle Blast의 Script만이 포함된 Repository - GitHub - Mepkatatsu/TSCB_OnlyScript: Tales Saga Chronicle Blast의 Script만이 포함된 Repository

github.com

 

벌써 TSCB를 마지막으로 건드린지도 5달 가까이 지났다.

이전에 라이더 글을 쓰면서 코드를 봤는데, 막연하게 굉장히 쓰레기같은 코드를 짜놨을 거라 생각했는데, 의외로 괜찮은 부분도 있었고 구조적으로 문제가 있는 부분도 꽤나 있었다.

 

이번 기회에 작성했던 코드들을 보면서 어떤 문제가 있었고, 어떤 방식으로 대체하면 좋을지를 적어보고자 한다. 그리고... 가능하다면 그 개선 작업도 차근차근 할 수 있으면 좋겠다. ㅋㅋ.

 

루트 폴더부터 알파벳 순으로 정리할 예정이다.

 

Script 폴더

[AudioManager.cs]

FadeOutMusic()

볼륨을 0.01f씩 빼는 게 아니라 (볼륨 / 100)을 변수로 둬서 항상 1초에 걸쳐서 페이드 아웃되도록 수정하면 좋을 것 같다.

 

어차피 SetBGMVolume, GetVolume 1번씩만 할 거면 굳이 따로 volume 변수 만들 필요 없을 것 같다.

 

_isBGMChanged 말고 FadeOutMusic을 저장해뒀다가 PlayBGM할 때 코루틴을 중단하는 것이 좀 더 깔끔할 것 같음.

 

매개변수에 p_ 없애기

 

Sound를 SerializeField에 때려박는 건 별로 안 좋은 것 같다. 테이블 만들어서 관리하면 좋을 듯.

 

 

[ButtonManager]

굳이 버튼 매니저까진 필요 없을 듯 한데... 그냥 관련 스크립트에 추가해서 쓰는 것이 직관적일 듯.

 

현재는 유니티 에디터에서 OnClick을 설정해주는데, 어떤 버튼이 어디서 사용되는지 추적이 힘들고, 함수 변경할 때마다 참조가 끊어지니 재설정을 해줘야 한다. 코드에서 추가하도록 변경하자.

 

[DialogManager]

테이블로 관리하자.

 

[GameManager]

Find는 인스펙터에서 매번 등록하기가 번거롭고 종종 참조가 끊어지는 경우가 있어서 사용했었는데, 구조 변경에 너무 취약하니 빼고 인스펙터에 등록하자.

 

변수 이름들 수정하기.

 

\n부분 \r\n으로 변경하자.

 

로컬라이징도 테이블로 하자. (키값으로 언어 설정에 맞는 텍스트 받아오도록)

 

PlayerPrefs.HasKey("Stage1Cleared")

이게 1~4까지 있는데, 현재 몇 스테이지까지 진행했는지만 가지고 있으면 될 것 같다

 

FadeInImage, FadeOutImage가 GameManager에 있을 이유가 없을 것 같다. 이외에도 필요 없는 것 있으면 분리하기.

 

필요없는 것들 수정하면 코드가 상당히 짧아질 것 같음. GameManager보다는 좀 더 적절한 이름이 있을 것 같다. IntroManager... 싱글톤도 필요 없을 수도. 그러면 IntroController쯤 되려나?

 

[SliderController]

Awake에만 초기화가 있어도 될 것 같은데...

아마 Awake 이전에 다른 함수들이 호출되었던 것 같다. OnEnable을 하면 해결되려나?

 

슬라이더도 인스펙터에 추가하고 이벤트 달아줄 수 있으면 좋을 것 같다.

 

[StoryManager]

음... 굉장히 끔찍한 코드다. 일단 DoStoryAction()만 다르게 처리되어도 상당히 짧아질 수 있을 것 같다.

 

한 씬에 때려박는 것보다 씬 전환이 나을 것 같다.

 

선택지 관련도 뭔가 테이블로 처리할 수 있으면 좋겠다. 선택지 뿐만 아니라 스토리 전체적으로 가능하면 좋을 것 같은데 약간 어려울 것 같다. 기똥찬 방법을 고민해봐야 할 듯. 몇 가지 행동들을 정의해놓고 에디터에서 진행을 구성할 수 있도록 툴을 만들고, 이걸 json으로 바꿔서 번호를 매긴 다음에 각 번호에 해당하는 스토리를 진행할 때 이걸 다시 파싱해서 스토리 액션을 취하는 방식?

 

원래도 이런 걸 하고 싶었는데 그땐 모르는 게 너무 많아서 못했었다. 지금이라면 해볼 수 있을 것 같다.

 

전체적인 구조 개선이 필요할 것 같은데 굉장히 힘든 작업이 될 것 같다. 천천히 해보면 좋은 경험이 될 듯.

 

Script/Game1 폴더

 

[BulletController]

아군의 공격만 해당되는 것 같아서 MidoriBullet이라고 이름을 바꾸면 좋을 듯

 

[EnemyController]

StopAllCoroutines() 말고 명확하게 코루틴을 저장해놓고 정지해주는 방법이 좋을 것 같다.

 

BossController는 분리하면 좋을 것 같은데... EnemyController를 상속받아서 사용하게끔 하면 될 듯?

 

보스 스킬은 숫자 4 이런식말고 최소한 const로 선언해서 하든가 하는 게 좋을 듯

 

[LazerController]

함수가 좀 긴 것 같아서 분리 가능하면 분리하면 좋을 것 같다.

 

총알 사라지는 처리는 나쁘지 않은데 레이저는 살짝 짤리는 문제가 있어서 아예 왼쪽 오른쪽 공간을 덮어버리면 어떨지 확인해보기

-> 아마도 스토리에서 바로 보여주는 식이라 미도리 일러스트 순서때문에 그랬던 것 같은데... 잠깐 부모를 바꾼다거나 하는 식으로 하면 어떨까 싶음

 

[MidoriPlaneController]

굳이 Controller라는 이름을 붙여야만 했을까? 떼도 괜찮을 듯.

EnemyController도 걍 ShootingGameEnemy라고 하면 될 것 같다.

 

[ShootingGameManager]

ㅋㅋ 기능 분리가 좀 필요할 것 같다. 슈팅 게임 만들면서 사용할 기능들을 전부 하나에 때려박아서... 오브젝트 풀링이나 LookRotation2D 등은 밖으로 꺼내서 활용해도 될 것 같음.

 

CreateNewMidoriHalo() 등은 거의 비슷한 코드들이라 하나로 묶어서 처리하도록 처리하면 좋을 것 같다.

 

여기는 기능은 유지하되 전체적으로 코드 정리가 필요할 것 같다.

 

[StarColorController]

별들 하나하나마다 반짝거리는 시퀀스를 추가해줘서 성능상 좀 부담이 있을까 싶기도 한데 폰으로 했을 때도 딱히 렉걸리는 건 없었던 것 같아서 이대로 유지해도 괜찮을 것 같음.

 

단, DOTween.Sequence의 Loop가 GameObject의 active 상태가 false가 되면 멈춘다는 확인이 필요할 것 같다.

 

 

이외에도 Canvas scaler로 화면 비율도 조절해줘야 할 듯

옵션은 따로 OptionManager 만드는 편이 깔끔할 것 같다.

 

 

생각보다 고칠 부분이 엄청 많지는 않을 것 같다.

 

테이블 추가해서 연동하고 사용

스토리 관련 툴 만들고 따로 처리하는 과정

필요하다면 Addressables 사용하는 것

 

 

정도가 큼직한 변경이 될 것 같다.

 

일단은 쉽게 처리할 수 있는 것들부터 차근차근 수정해야겠다.