-
최적화 - 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; } } }
그리고 아마 게임에 쓰인 배경이미지의 화질을 내려준것도 영향이 있지 않을까싶다
게임은 처음부터 끝까지 부드럽게 잘 작동하는것을 확인할 수 있었고
모바일에서 돌렸을때 컴퓨터와 조금 다른점이나 수정해야할 짜잘한 부분들은 전부 수정해주었다
정말 별거 없고 스테이지 공 터치 감도 증가 정도..?
아무튼 이렇게 최적화가 성공적으로 마무리되어 기쁘다. 하나님께 감사드린다ㅠㅠ
이제 테스터 모집해서 정식 출시만 하면 될 것 같다!
'Galaxy Ball > 5. 최적화' 카테고리의 다른 글
최적화 - 16 (최종 마무리 #텍스쳐 낮추기) (0) 2024.11.19 최적화 - 15 (코드 수정 마무리) (7) 2024.11.13 최적화 - 14 (코드수정 #InvokeRepeating) (1) 2024.11.07 최적화 - 13 (코드 수정 #SmoothDamp, #LateUpdate, #Awake) (0) 2024.11.05 최적화 - 12 (코드수정 #Canvas Group, #DOTween) (2) 2024.10.30