-
(6) 내구도 표시 & 구체 파괴Galaxy Ball/1. 멀티플레이 - 대전모드 2024. 3. 26. 10:30
이번에는 각 구체마다 1~5까지의 숫자중 랜덤숫자를 내구도로 부여한뒤 그 숫자를 날아가는 구체위에 보이게까지 하겠다
그리고 내구도가 0이 되버리는 순간 해당 구체를 파괴하는것까지 구현해보도록 하겠다
가장 먼저 1~5사이에 랜덤으로 숫자를 뽑아 공에 표시하는것부터 해보겠다
사실 만들어놓은 공 프리팹에다 텍스트까지 추가해서 하나로 묶어버릴 생각이었다. 하지만 그건 너무 복잡하기도 하고
스크립트도 아예 하나 새로 만들거나 다른곳에 작성해야할것 같아 아예 텍스트 추가없이
BallController 스크립트에 자체적으로 추가하기로 했다
using System.Collections; using TMPro; //TextMeshPro 쓰려면 추가 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; // TextMeshPro 변수 추가 private void Start() { rigid = GetComponent<Rigidbody2D>(); rigid.velocity = transform.up * 300 * Time.deltaTime; //추가된 부분들 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; // 레이어 순서를 조정하여 구체 위에 배치 }
BallController의 스크립트가 좀 길어지긴 하지만 이게 가장 좋은 방법이라 생각한다
가장 먼저 기본적으로 TextMeshPro를 사용하기 위해선 using TMPro를 가져온다
그리고 랜덤으로 숫자를 매길 정수형 변수 randomNumber와 TextMeshPro형 변수 textMesh를 선언한다
GameObject textObject = new GameObject("TextMeshPro");
게임오브젝트로 텍스트 오브젝트를 추가한다
textObject.transform.parent = transform;
텍스트가 구체에 붙어 따라가게 하기 위해 텍스트 오브젝트를 구체의 자식으로 설정한다textMesh = textObject.AddComponent<TextMeshPro>();
TextMeshPro 기능을 사용하기 위해 TextMeshPro 컴포넌트를 가져온다
randomNumber = Random.Range(1, 6);아까 추가한 randomNumber를 1~5 사이 랜덤한 숫자가 들어가게 해준다
textMesh.text = randomNumber.ToString();textMesh에는 이 랜덤으로 받은 randomNumber가 출력되게 한다
textMesh.fontSize = 4;팽창되기 전 구체 사이즈에 맞춰 폰트크기를 조절한다
textMesh.alignment = TextAlignmentOptions.Center;글씨 가운데 정렬
textMesh.autoSizeTextContainer = true;textMesh.rectTransform.localPosition = Vector3.zero;
구체 중심에 텍스트 배치
textMesh.sortingOrder = 1;레이어 순서를 조정하여 구체 위에 배치
이제 구체에 1~5사이 랜덤한 숫자가 부여되고 공이 확장됨에따라 숫자의 크기까지 알맞게 커지는것을 확인할 수 있다
이번엔 이 구체들끼리 충돌시 숫자가 줄어들고, 0이 되는 순간 아예 구체가 파괴되는것까지 구현해보겠다
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; }
이건 의외로 복잡하지 않다. 그저 충돌판정이 일어나는 OnCollisionEnter2D에서 몇가지만 추가해주면 된다
private void OnCollisionEnter2D(Collision2D coll)
충돌이 일어났는데
{
if (coll.gameObject.tag == "P1ball" || coll.gameObject.tag == "P2ball")만약 충돌한 물체의 태그가 "P1ball" 혹은 "P2ball"이라면 (벽이나 다른 고정물체와 충돌시엔 내구도가 깎이지 않음)
{
if (randomNumber > 0)근데 내구도가 1 이상이라면
{
randomNumber--;내구도가 1 깎임
textMesh.text = randomNumber.ToString();그리고 그걸 출력해서 보여줌
}
if (randomNumber <= 0)만약 내구도가 0이거나 0보다 작아지는 순간
{
Destroy(gameObject);구체 파괴
}
}이제 충돌하고 내구도가 깎이고, 파괴되는것까지 구현에 성공했다. 이제 점점 구상했던 게임의 그림이 나오기 시작한다
'Galaxy Ball > 1. 멀티플레이 - 대전모드' 카테고리의 다른 글
(8) 발사구현 마무리 (0) 2024.03.27 (7) Firezone, 발사구현 (1) 2024.03.26 (5) 패배 판정 & 씬 변환 (0) 2024.03.25 (4) 구체 팽창 & 팽창 후 고정 (0) 2024.03.25 (3) 게임 세팅 , 공 발사 & 반사 (0) 2024.03.25