ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (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를 가져온다

     

    그리고 랜덤으로 숫자를 매길 정수형 변수 randomNumberTextMeshPro형 변수 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);

                구체 파괴
            }
        }

     

     

     

    이제 충돌하고 내구도가 깎이고, 파괴되는것까지 구현에 성공했다. 이제 점점 구상했던 게임의 그림이 나오기 시작한다

Designed by Tistory.