ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 최적화 - 17 (최적화 성공)
    Galaxy Ball/5. 최적화 2024. 11. 30. 00:09

    드디어 최적화가 성공했다!

     

    오늘 아침 앱을 빌드하여 확인해보니 드디어 게임의 모든 부분들이 부드럽게 움직이는것을 확인하였다

    너무나도 감격스럽다....

     

     

    그래서 게임이 여태 끊겼던 결정적인 원인이 뭐냐고 묻는다면

    매 수정을 할때마다 빌드를 하여 알아본것이 아니기에 확실히 이거다라고 대답할 순 없지만

    내 개인적인 생각으로 가장 영향이 컸던것은 Rigidbody2D - Interpolate 설정 유무라고 생각한다

     

    실제로 이걸 했냐 안했냐에 따라 컴퓨터에서도 한눈에 보일만큼 굉장한 차이가 보였고

    이 영향이 가장 크지 않았을까 싶다

     

    물론 코드들도 최대한 최적화가 되도록 수정해준것도 있고

    그중 무엇보다 공을 컨트롤하는 코드 수정이 가장 영향이 크다고 생각한다

     

    using System.Collections;
    using System.Collections.Generic;
    using TMPro;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class ExBallController : MonoBehaviour
    {
        SPGameManager spgamemanager;
        Rigidbody2D rb;
        BGMControl bGMControl;
        bool hasBeenLaunched = false;
        public bool isExpanding = false; // 공이 팽창 중인지 여부
        bool isStopped = false; // 공이 완전히 멈췄는지 여부
        private float decelerationThreshold = 0.4f;
        private float dragAmount = 1.1f;
        private float expandSpeed = 1f; // 팽창 속도
        private Vector3 initialScale; // 초기 공 크기
        private Vector3 targetScale; // 목표 크기
        private int durability; // 공의 내구도
        private const string SPTwiceFName = "SPTwiceF(Clone)";
        private const string TwiceBulletName = "TwiceBullet(Clone)";
        public PhysicsMaterial2D bouncyMaterial;
        private TextMeshPro textMesh;
        private const string GojungTag = "Gojung";
        private const string WallTag = "Wall";
        private Vector3 velocity = Vector3.zero;
    
        public int fontsize;
        public int PlusScale;
    
    
        void Start()
        {
            bGMControl = FindAnyObjectByType<BGMControl>();
            spgamemanager = FindAnyObjectByType<SPGameManager>();
            rb = GetComponent<Rigidbody2D>();
    
            GameObject textObject = new GameObject("TextMeshPro");
            textObject.transform.parent = transform; // 구체의 자식으로 설정
            durability = Random.Range(1, 6);
    
            textMesh = textObject.AddComponent<TextMeshPro>();
            textMesh.text = durability.ToString();
            textMesh.fontSize = fontsize;
            textMesh.alignment = TextAlignmentOptions.Center;
            textMesh.autoSizeTextContainer = true;
            textMesh.rectTransform.localPosition = Vector3.zero; // 구체 중심에 텍스트 배치
            textMesh.sortingOrder = 1; // 레이어 순서를 조정하여 구체 위에 배치
    
            rb.drag = 0f;
            rb.collisionDetectionMode = CollisionDetectionMode2D.Continuous;
            rb.interpolation = RigidbodyInterpolation2D.Interpolate;
    
            Collider2D collider = GetComponent<Collider2D>();
            if (collider != null && bouncyMaterial != null)
            {
                collider.sharedMaterial = bouncyMaterial;
            }
    
            initialScale = transform.localScale; 
        }
    
        void Update()
        {
            if (isExpanding)
            {
                ExpandBall(); 
            }
        }
    
        private void FixedUpdate()
        {
            if (!hasBeenLaunched && !spgamemanager.isDragging)
            {
                LaunchBall();
            }
            if (hasBeenLaunched && !isStopped)
            {
                SlowDownBall();
            }
        }
        void LaunchBall()
        {
            Vector2 launchForce = SPGameManager.shotDirection * (SPGameManager.shotDistance*1.4f);
            rb.AddForce(launchForce, ForceMode2D.Impulse);
    
            rb.drag = dragAmount;
            hasBeenLaunched = true;
        }
    
        void SlowDownBall()
        {
            if (rb == null) return;
    
            if (rb.velocity.magnitude <= decelerationThreshold)
            {
                rb.velocity = Vector2.zero; 
                isStopped = true;
                StartExpansion();
            }
        }
    
        void StartExpansion()
        {
            if (bGMControl.SoundEffectSwitch)
            {
                bGMControl.SoundEffectPlay(1);
            }
            targetScale = initialScale * PlusScale; 
            isExpanding = true;
        }
    
        void ExpandBall()
        {
            transform.localScale = Vector3.SmoothDamp(transform.localScale, targetScale, ref velocity, expandSpeed);
    
            if (Vector3.Distance(transform.localScale, targetScale) < 0.01f)
            {
                transform.localScale = targetScale; // 목표 크기에 도달하면 팽창 완료
                isExpanding = false; // 팽창 중단
            }
        }
    
        private void OnCollisionEnter2D(Collision2D collision)
        {
            if(!isExpanding && bGMControl.SoundEffectSwitch)
            {
                bGMControl.SoundEffectPlay(0);
            }
            if (!collision.collider.isTrigger && isExpanding)
            {
                isExpanding = false; // 팽창 중단
                transform.localScale = transform.localScale; // 현재 크기에서 멈춤
                DestroyRigidbody(); // Rigidbody 제거
            }
    
            if ((collision.collider.name != SPTwiceFName || collision.collider.name != TwiceBulletName) && rb == null)
            {
                if (collision.collider.CompareTag(GojungTag)) return;
                if (collision.collider.CompareTag(WallTag)) return;
    
                TakeDamage(1);
                textMesh.text = durability.ToString();
            }
            if ((collision.collider.name == SPTwiceFName || collision.collider.name == TwiceBulletName) && rb == null)
            {
                TakeDamage(2);
                textMesh.text = durability.ToString();
            }
        }
    
        void TakeDamage(int damage)
        {
            durability -= damage;
            if (durability <= 0)
            {
                spgamemanager.RemoveBall();
                Destroy(gameObject); 
            }
        }
    
        void DestroyRigidbody()
        {
            if (rb != null)
            {
                Destroy(rb);
                rb = null; 
            }
        }
    }

     

     

    그리고 아마 게임에 쓰인 배경이미지의 화질을 내려준것도 영향이 있지 않을까싶다

     

     

    게임은 처음부터 끝까지 부드럽게 잘 작동하는것을 확인할 수 있었고 

    모바일에서 돌렸을때 컴퓨터와 조금 다른점이나 수정해야할 짜잘한 부분들은 전부 수정해주었다

     

    정말 별거 없고 스테이지 공 터치 감도 증가 정도..?

     

    아무튼 이렇게 최적화가 성공적으로 마무리되어 기쁘다. 하나님께 감사드린다ㅠㅠ

    이제 테스터 모집해서 정식 출시만 하면 될 것 같다!

Designed by Tistory.