-
최적화 - 6Galaxy Ball/5. 최적화 2024. 9. 24. 21:47
두개의 글에 걸쳐 완성된 새로운 BallController. 하지만 지금은 어디까지나 임시씬 안에서만 동작이 되도록 하였다
하지만 최종목표는 기존에 만든 게임에 연계하여 자연스럽게 녹아들도록 하는것. 이제 이 작업을 시작하겠다
우선 SPGameManager와는 연계가 되도록 설계되었기 때문에 BGMControl부터 넣어주었다
이제 충돌과 팽창이 일어날때마다 알맞은 효과음이 재생될것이다
한가지 더 추가해야할것이 있다. 전까지는 임시로 P1ball 태그만 내구도가 감소하도록 했지만 이젠 아니라는것
수많은 태그들을 검사하여 각 태그에 맞는 반응을 해줘야하는데....
가만히 보니 왜 굳이 이렇게까지 비효율적으로 했었나 싶다
위에 첨부된 사진은 전에 사용하던 코드 중 일부인데...굳이 태그를 일일이 저렇게 적어줘야하나?
그냥 SPTwice나 TwiceBullet(Clone) 이 둘 중 한개만 아니면 나머지의 케이스들은 전부 똑같은거 아닌가?
그래서 수정해주었다. 만약 오브젝트의 이름이 SPTwice, TwiceBullet 이 둘중 하나가 아니라면 1데미지,
둘중 하나라면 2데미지가 들어가게 했다
그리고 전에는 데미지를 입는 즉시 내구도가 0이하로 떨어지는지 그 자리에서 확인했지만
이번엔 TakeDamage라는 메서드를 만들어 한번 돌려주기만 하면 된다
추가로 전코드와 똑같이 공이 파괴되기 전 RemoveBall 메서드도 한번 돌려준다
아 그리고 한가지 빼먹은게 있다.
고정구체와 사방의 벽에 부딫힐 경우에는 데미지가 들어가면 안되기에 2가지는 제외시켜주었다
전에는 하나하나 되는 케이스만 써주었지만 이번에는 안되는 케이스만 적어주었기에 이렇게 해야한다
--------------------------------------------------
<최종 코드>
using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; public class ExBallController : MonoBehaviour { SPGameManager spgamemanager; Rigidbody2D rb; BGMControl bGMControl; bool hasBeenLaunched = false; 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; 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 = 4; 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 (!hasBeenLaunched && !spgamemanager.isDragging) { LaunchBall(); } if (hasBeenLaunched && !isStopped) { SlowDownBall(); } if (isExpanding) { ExpandBall(); } } 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() { targetScale = initialScale * 10f; isExpanding = true; } void ExpandBall() { if (Vector3.Distance(transform.localScale, targetScale) > 0.01f) { bGMControl.SoundEffectPlay(1); transform.localScale = Vector3.Lerp(transform.localScale, targetScale, Time.deltaTime * expandSpeed); } else { transform.localScale = targetScale; // 목표 크기에 도달하면 팽창 완료 isExpanding = false; // 팽창 중단 } } private void OnCollisionEnter2D(Collision2D collision) { if(isExpanding) { bGMControl.SoundEffectPlay(0); } if (!collision.collider.isTrigger && isExpanding) { isExpanding = false; // 팽창 중단 transform.localScale = transform.localScale; // 현재 크기에서 멈춤 DestroyRigidbody(); // Rigidbody 제거 } if ((collision.collider.name != "SPTwiceF(Clone)" || collision.collider.name != "TwiceBullet(Clone)") && rb == null) { TakeDamage(1); textMesh.text = durability.ToString(); } if ((collision.collider.name == "SPTwiceF(Clone)" || collision.collider.name == "TwiceBullet(Clone)") && 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; } } }
자 얼추 된것같다...이제 이 코드 그대로 실전에 넣어보기만 하면 된다. 제발 잘 붙었으면 좋겠다..
하... 잘 붙는다...ㅠㅠ 정말 다행이다
파란공은 최적화가 되었고, 빨간공은 최적화가 되어있질 않은데 이렇게보니까 더더욱 차이가 느껴진다
이제 해야할건 기존 BallController와 연관되있는 코드들을 돌면서 전부 수정해주는 것이다
우선 Deadzone 스크립트. 팽창도중에 Deadzone에 닿는건 게임 패배로 간주하지 않는다
BGMControl 과도 연계하여 알맞은 타이밍에 효과음이 재생되도록 코드를 수정해주었다
'Galaxy Ball > 5. 최적화' 카테고리의 다른 글
최적화 - 8 (1) 2024.10.01 최적화 - 7 (0) 2024.09.25 최적화 - 5 (BallController 스크립트 제작#2) (0) 2024.09.20 최적화 - 4 (BallController 스크립트 제작#1) (1) 2024.09.20 최적화 - 3 (1) 2024.09.19