ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (8) 발사구현 마무리
    Galaxy Ball/1. 멀티플레이 - 대전모드 2024. 3. 27. 15:12

    왜 한템포가 늦게 나가는지 생각을 해봤다

     

    1. 클릭

    2. BallController가 삽입된 구체 생성

    3. BallController Start 컴포넌트에 있는 발사가 실행됨

    하지만 shotDirection, ShotDistance가 없으니 초기값으로 값을 넣고 발사

    4. 클릭을 뗌

    5. 그제서야 shotDirection, ShotDistance에 원하는 값이 들어감

    6. 두번째 발사에 적용됨

     

    발사하는 코드를 Start에 넣었으니 그럴만도 했다. 그럼 Update에 발사문을 옮겨보자

     

     private void Update()
     {
         if(Input.GetMouseButtonUp(0))
         {
             rigid.velocity = GameManager.shotDirection * GameManager.shotDistance; // GameManager에서 값 가져와서 구체 발사
         }
         Move();
         expand();
     }

     

    BallController의 Update메서드이다. 조건을 걸어 마우스에서 버튼을 떼어냈을때 발사가 진행되도록 하였다

     

     

    이제 확실히 방향은 내가 조준한대로 바로바로 반영되는것이 보인다

    하지만 문제는 반사가 되지도 않고, 클릭을 해서 생성을 하자마자 곧바로 팽창이 된다는것

     

    문제를 하나 해결했더니 두개가 생겼다...ㅎㅎ

     

    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.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;
            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);
        }
    }

     

    클릭을 해서 구체가 생성되는순간 팽창되는걸 어떻게하면 막을 수 있을까?

     

    결국 구체를 확장시키는건 expand 메서드.

    그럼 expand 메서드가 마우스 클릭 상태일때 작동하지 않도록 하면 되지 않을까?

     

    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;
    }

     

    그러므로 expand 메서드가 실행되지 않을 조건을 하나 더 추가해주자

    GetMouseButtonDown이 아니라 마우스 클릭을 누르는 내내 팽창이 되면 안되기에 GetMouseButton이 맞다

     

     

    하...드디어 그럴싸한 발사구현을 보게되었다. 감격스럽다 정말

     

    'Galaxy Ball > 1. 멀티플레이 - 대전모드' 카테고리의 다른 글

    (10) BGM & Sound Effect  (2) 2024.03.28
    (9) 버그 개선#1  (0) 2024.03.27
    (7) Firezone, 발사구현  (1) 2024.03.26
    (6) 내구도 표시 & 구체 파괴  (0) 2024.03.26
    (5) 패배 판정 & 씬 변환  (0) 2024.03.25
Designed by Tistory.