프로그램/유니티 스크립트 소스
[유니티 스크립트 소스] 목표 위치값까지 Rigidbody를 이용하여 포물선 궤적으로 오브젝트 날리기
코더 제로
2021. 2. 21. 03:47
728x90
반응형
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class Parabola : MonoBehaviour
{
public Transform m_Target;
public float m_InitialAngle = 30f; // 처음 날라가는 각도
private Rigidbody m_Rigidbody;
void Start()
{
m_Rigidbody = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Vector3 velocity = GetVelocity(transform.position, m_Target.position, m_InitialAngle);
m_Rigidbody.velocity = velocity;
}
}
public Vector3 GetVelocity(Vector3 player, Vector3 target, float initialAngle)
{
float gravity = Physics.gravity.magnitude;
float angle = initialAngle * Mathf.Deg2Rad;
Vector3 planarTarget = new Vector3(target.x, 0, target.z);
Vector3 planarPosition = new Vector3(player.x, 0, player.z);
float distance = Vector3.Distance(planarTarget, planarPosition);
float yOffset = player.y - target.y;
float initialVelocity
= (1 / Mathf.Cos(angle)) * Mathf.Sqrt((0.5f * gravity * Mathf.Pow(distance, 2)) / (distance * Mathf.Tan(angle) + yOffset));
Vector3 velocity
= new Vector3(0f, initialVelocity * Mathf.Sin(angle), initialVelocity * Mathf.Cos(angle));
float angleBetweenObjects
= Vector3.Angle(Vector3.forward, planarTarget - planarPosition) * (target.x > player.x ? 1 : -1);
Vector3 finalVelocity
= Quaternion.AngleAxis(angleBetweenObjects, Vector3.up) * velocity;
return finalVelocity;
}
}
728x90
반응형