ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 최적화 - 15 (코드 수정 마무리)
    Galaxy Ball/5. 최적화 2024. 11. 13. 01:36

    이제 정말 얼마 안남았다... 게임에 쓰인 대부분의 스크립트들이 한번 이상 최적화를 거치거나 확인했고

    마지막으로 남은 카테고리는 바로 멀티플레이다.

     

    지금까지 늘 메인컨텐츠라고 생각하고 여겨온 싱글플레이에 개발을 집중해왔기에 멀티플레이는 

    계속 우선순위에서 미뤄오긴 했었다. 그렇기에 최적화도 맞지만 개발 마무리라고 하는것도 맞는 표현이겠다

     

     void Update()
        {
            if (Time.time >= nextSpawnTime)
            {
                SpawnSphere(); 
                nextSpawnTime = Time.time + Random.Range(minSpawnTime, maxSpawnTime);
            }
        }

     

    우선 멀티플레이에서 아이템을 일정 텀마다 생성하던 RandomGenerate. 

    이제 알다시피 최적화할때 update는 정말 필요한게 아니라면 없애주는것이 맞다. 모바일 환경이라면 더더욱

     

      IEnumerator SpawnSphereRoutine()
        {
            while (true)
            {
                float waitTime = Random.Range(minSpawnTime, maxSpawnTime);
                yield return new WaitForSeconds(waitTime);
                SpawnSphere();
            }
        }
    
        void SpawnSphere()
        {
            Vector2 min = backgroundCollider.bounds.min;
            Vector2 max = backgroundCollider.bounds.max;
            Vector3 randomPosition = new Vector3(Random.Range(min.x, max.x), Random.Range(min.y, max.y), 0f);
    
            int prefabIndex = Random.Range(0, spherePrefabs.Length);
            Instantiate(spherePrefabs[prefabIndex], randomPosition, Quaternion.identity);
            bGMControl.SoundEffectPlay(2);
        }

     

    그래서 대신 코루틴을 사용하여 주었다.

    물론 Invoke를 사용할 수도 있었지만 Invoke는 유니티 내의 타이머를 이용한다고 한다

     

    그리고 멀티플레이 코드를 쳐가면서 자연스럽게 이런저런 부분들도 손봐주었다

    혹시 몰라 남겨둔 ForceF 아이템...

     

    예를 들어 10개에 가까운 멀티플레이 아이템을 다 쳐내고 싱글플레이와 똑같이 개수를 맞췄다

     

    최적화랑은 좀 관련없긴 하지만 어쨋든 최적화를 했기때문에 필요한 거니까...

     

    그리고 가장 핵심인 MultiBallController!

    싱글플레이로 치면 플레이어의 공을 컨트롤하는 BallController와 똑같은 개념으로

    멀티플레이에서는 각 플레이어의 공과 Big, Small 아이템도 컨트롤하는데 쓰인다

     void LaunchBall()
        {
            Vector2 launchForce = GameManager.shotDirection * (GameManager.shotDistance * 1.4f);
            rb.AddForce(launchForce, ForceMode2D.Impulse);
    
            rb.drag = dragAmount;
            hasBeenLaunched = true;
        }

     

    당연히 전체적으로 최적화를 해주었고 다른 점이라면 spgamemanager와 관련된 기능은 전부 제거했다는것이다

     

    그리고 너무 공의 탄성이 부족해 가끔씩 벽에 달라붙는 현상이 보여 Bounciness를 1 > 1.1로 올려주었다

     

    그리고 두개의 캔버스에 나뉘어진 요소들! 이것도 하나로 합쳐주었다. 

     

    그리고 하나 고칠게 있다. 멀티플레이에서는 환경설정에서 설정한 BGM, 사운드 이펙트 스위치의 영향을 받지 않는다는것

    점점 최적화보다는 오류수정쪽에 기울고 있긴 하지만 어쨋든 이것도 바로잡아보자

     

    .......이게 왜 안되나 했더니 다른 씬에는 전부 있던 IsPlayBGM에 오디오소스 컴포넌트를 이어주지 않았었다

     

    해당 씬에 맞는 BGM을 재생할건지 말건지에 대한 여부를 결정하는 IsPlayBGM

    이로써 소리도 스위치에 맞춰 잘 재생되는것을 확인할 수 있다

     

    그리고 말나온김에 IsPlayBGM의 코드를 살펴보자

    굳이 저 조건에 BGM[0] != null 이라는 조건을 같이 달아줘야 할까?

    물론 이 게임이 계속 개발중이거나 복잡한 구조로 이루어져 있다면 후에 코드관리를 용이하게 하기 위해 하면 좋겠지만

    이미 나는 알고 있다. 별로 많지도 않은 씬에서 절대 저게 널 값이 나올수가 없다는걸....

     

    그러니 조금이라도 최적화를 위해 저런 의미없는 조건들도 빼주기로 하였다

     

    이로써 멀티플레이도 모든 최적화와 함께 기능구현까지 멀쩡하게 성공시켰다....이제 남은게 뭘까

     

    이제 정말 코드 한번 쭉 훑어보고 수정할 곳 있는지 확인한 뒤 현재 게임에서 몇개 보이는 오류들만 잡아주고

    최종적으로 게임을 처음부터 끝까지 쭉 플레이해보면서 점검해주면 될 것 같다.

    다음 글에서는 오류수정과 최종마무리를 해보도록 하겠다

     

     

Designed by Tistory.