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
'게임 프로그래밍 > 유니티 프로젝트' 카테고리의 다른 글
[Unity]2D게임 Background Scroll(배경 스크롤) (0) | 2021.12.30 |
---|---|
[Unity]마찰력 및 저항력을 활용한 게임요소 구현하기 (0) | 2021.12.30 |
[Unity]힘과 가속도의 관계와 AddForce를 활용한 게임 구현하기 (0) | 2021.12.29 |
[Unity]행렬과 Transform 이동 함수 (0) | 2021.12.29 |
[Unity]벡터의 외적을 활용한 게임요소 구현하기 (0) | 2021.12.29 |