-
(9) 버그 개선#1Galaxy Ball/1. 멀티플레이 - 대전모드 2024. 3. 27. 16:10
원래대로라면 이제 예정대로 턴을 변경하고 번갈아가며 공을 한개씩만 날리는 기능을 구현하려했는데
방금 치명적인 오류를 하나 발견했다
만약 내가 이런 상황이라고 가정해보자. 사실상 이건 어디로 공을 쏘든 패배 확정이나 다름없는 상황이어야만 한다
근데 이걸 이렇게 빠져나올수 있고 이러면 게임의 승패가 갈릴수가 없어진다
이걸 해결하기 위해 내가 생각한 방법은 두가지이다
1. 만약 구체에 들어간 힘이 너무 약하다면 임의로 최소한의 힘을주어 앞으로 나가게 하기
2. 구체가 팽창하는 과정에서 일어난 충돌은 내구도의 감소로 이어지지 않기
하지만 후에 밸런스를 위해서라도 2번이 더 적합해보이니 2번으로 결정했다
사실 2번 기능은 초반에 구현할 계획이 있었지만 여러번의 시도 끝에 도저히 감을 못잡고 실패한 기능이다
using System.Collections; using TMPro; using UnityEngine; public class BallController : MonoBehaviour { Rigidbody2D rigid; Vector2 lastVelocity; float deceleration = 2f; public float increase = 4f; private bool iscolliding = false; public bool hasExpanded = false; private bool isStopped = false; private int randomNumber; private TextMeshPro textMesh; private void Start() { rigid = GetComponent<Rigidbody2D>(); GameObject textObject = new GameObject("TextMeshPro"); textObject.transform.parent = transform; textMesh = textObject.AddComponent<TextMeshPro>(); randomNumber = Random.Range(1, 6); textMesh.text = randomNumber.ToString(); textMesh.fontSize = 4; textMesh.alignment = TextAlignmentOptions.Center; textMesh.autoSizeTextContainer = true; textMesh.rectTransform.localPosition = Vector3.zero; textMesh.sortingOrder = 1; } private void Update() { if (Input.GetMouseButtonUp(0) && rigid != null) { rigid.velocity = GameManager.shotDirection * GameManager.shotDistance; // GameManager에서 값 가져와서 구체 발사 } Move(); expand(); } void Move() { if (rigid == null || isStopped) return; lastVelocity = rigid.velocity; rigid.velocity -= rigid.velocity.normalized * deceleration * Time.deltaTime; if (rigid.velocity.magnitude <= 0.01f && hasExpanded) { isStopped = true; StartCoroutine(DestroyRigidbodyDelayed()); } } void expand() { if (rigid == null || iscolliding) return; if (rigid.velocity.magnitude > 0.01f) return; if (Input.GetMouseButton(0)) return; transform.localScale += Vector3.one * increase * Time.deltaTime; hasExpanded = true; } private void OnCollisionEnter2D(Collision2D coll) { if (coll.gameObject.tag == "P1ball" || coll.gameObject.tag == "P2ball") { if (randomNumber > 0) { randomNumber--; textMesh.text = randomNumber.ToString(); } if (randomNumber <= 0) { Destroy(gameObject); } } if (coll.contacts != null && coll.contacts.Length > 0) { Vector2 dir = Vector2.Reflect(lastVelocity.normalized, coll.contacts[0].normal); if (rigid != null) rigid.velocity = dir * Mathf.Max(lastVelocity.magnitude, 0f); // 감속하지 않고 반사만 진행 } this.iscolliding = true; } private void OnCollisionExit2D(Collision2D collision) { this.iscolliding = false; } IEnumerator DestroyRigidbodyDelayed() { yield return new WaitForSeconds(0.8f); if (rigid != null) Destroy(rigid); } }
하지만 이번에도 코드를 집중해서 잘 살펴보자. 코드가 길어봤자 필요한 곳만 집중하면 된다. 내구도를 닳게 하는 메서드는
private void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.tag == "P1ball" || coll.gameObject.tag == "P2ball")
{
if (randomNumber > 0)
{
randomNumber--;
textMesh.text = randomNumber.ToString();
}
if (randomNumber <= 0)
{
Destroy(gameObject);
}
}여기. 그중에서도 내구도를 닳게 하는 조건만 수정하면 된다
if (coll.gameObject.tag == "P1ball" || coll.gameObject.tag == "P2ball")
바로 여기. 지금까지는 닿은 콜라이더의 태그가 P1ball이나 P2ball이면 내구도가 1씩 감소하게 만들었지만
여기서 한가지의 조건을 추가해보겠다
"닿은 콜라이더의 태그가 P1ball 혹은 P2ball이면서 충돌한 구체가 팽창과 고정이 완전히 끝나버린 구체일때)
여기서 중요한건 팽창이 아닌 고정이 완전히 끝나버린 구체라는 것이다.
그렇다면 조건에 고정이 끝난 구체를 추가하는게 더 적합할 것이다
코드에서 완벽하게 구체를 고정해버리는 코드는 어디 있을까?
IEnumerator DestroyRigidbodyDelayed() { yield return new WaitForSeconds(0.8f); if (rigid != null) Destroy(rigid); }
여기있다. rigid 자체를 완전히 제거해버리는 코루틴이다. 그러니 조건을 이렇게 수정하면 된다
private void OnCollisionEnter2D(Collision2D coll)
{
if ((coll.gameObject.tag == "P1ball" || coll.gameObject.tag == "P2ball") && rigid == null)
{
if (randomNumber > 0)
{
randomNumber--;
textMesh.text = randomNumber.ToString();
}
if (randomNumber <= 0)
{
Destroy(gameObject);
}
}자 이제 결과를 보자
이제 팽창하는 과정에서 충돌이 일어났을때, 팽창중인 구체의 내구도에는 변화가 일어나지 않는다
좀 더 알아보기 쉽게 하기 위해 다시 비교 동영상을 첨부했다.
그리고 선택의 폭을 줄이기 위해 Firezone의 면적도 줄여주었다
'Galaxy Ball > 1. 멀티플레이 - 대전모드' 카테고리의 다른 글
(10.5) - 버그 개선#2 (0) 2024.03.28 (10) BGM & Sound Effect (2) 2024.03.28 (8) 발사구현 마무리 (0) 2024.03.27 (7) Firezone, 발사구현 (1) 2024.03.26 (6) 내구도 표시 & 구체 파괴 (0) 2024.03.26