[Unity]등속도/등가속도 운동을 활용한 게임 구현하기

728x90

등가속도 운동 개념

 

등가속도 공식을 활용한 오브젝트 이동

  • shotAngle = 45 가정
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallController : MonoBehaviour
{
    public float shotVelocity;
    public float shotAngle;

    private Rigidbody2D ballRB2D;
    private bool isGround = true;
    private bool isCenter = false;
    private float totalTime = 0f;

    void Start()
    {
        ballRB2D = GetComponent<Rigidbody2D>();
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(ShotBall());
        }
    }
    IEnumerator ShotBall()
    {
        Debug.Log("=== Simulation ===");

        isGround = false;
        transform.right = new Vector2(Mathf.Cos(shotAngle * Mathf.Deg2Rad), Mathf.Sin(shotAngle * Mathf.Deg2Rad)); //공의 각도 설정
        ballRB2D.velocity = transform.right * shotVelocity; //설정된 각도로 shotVelocity속도로 발사

        totalTime = 0f; //처음 시간을 0으로 초기화
        while (true)
        {
            yield return null;
            if (isGround) break; //착지를 하면 while문 끝남
            totalTime += Time.deltaTime; //착지하기 쩐까지 시간을 계속 측정
            if (Mathf.Abs(ballRB2D.velocity.y) < 0.1f && !isCenter) //y축 속도의 절대값이 0.1보다 작을 때/isCenter가 faled일 때(딱 1번만 발동)
            {
                isCenter = true;
                Debug.Log("CenterHeight: " + transform.position.y); //최고 높이
            }
        }
    }
    private void OnCollisionEnter2D(Collision2D _col)
    {
        if(isGround == false) //그라운드에 착지
        {
            isGround = true;
            ballRB2D.velocity = Vector2.zero; //속도 0(더이상 움직이지 않게 하기 위해)
            Debug.Log("Totaltime: " + totalTime); //총 걸린 시간
            Debug.Log("TotalMeter: " + (transform.position.x + 8)); //초기 위치가 -8에서 시작했기 때문에(+8로 보정

            Verification();
        }
    }

    private void Verification()
    {
        Debug.Log("=== Verification ===");

        float totalTime = 2 * shotVelocity * Mathf.Sin(shotAngle * Mathf.Deg2Rad) / 9.81f;
        //총 걸린 시간은 2t, 9.81은 중력가속도
        //2*V*sin(theta)/g
        float centerHeight = Mathf.Pow(shotVelocity * Mathf.Sin(shotAngle * Mathf.Deg2Rad), 2) / (2*9.81f); 
        //최고 높이
        // (V*sin(theta))^2 / 2g
        float totalMeter = Mathf.Pow(shotVelocity,2) / 9.81f * Mathf.Sin(2 * shotAngle * Mathf.Deg2Rad); 
        //총 날아간 거리
        //2*v^2sin(theta)*cos(theta)/g => 2sint(theta)cos(theta) == sin(2theta)
        // v^2/g*sin(2*theta)

        Debug.Log("CenterHeight: " + centerHeight);
        Debug.Log("Totaltime: " + totalTime);        
        Debug.Log("TotalMeter: " + totalMeter);
    }
}

유니티 내부의 연산값(project settings)들이 차이가 있어 실험 결과가 미세한 차이가 있다.

728x90