|
|
@ -6,18 +6,23 @@ public class YeetController : MonoBehaviour |
|
|
|
{ |
|
|
|
public GameObject parent { get; set; } |
|
|
|
|
|
|
|
public float yeetVelocity = 10f; |
|
|
|
public float yeetVelocity = 5f; |
|
|
|
public float yeetDuration = 2f; |
|
|
|
public float windupSpeed = 0.01f; |
|
|
|
|
|
|
|
public enum YeetState { Unheld, Held, Yeeting }; |
|
|
|
public YeetState yeetState { get; private set; } = YeetState.Unheld; |
|
|
|
|
|
|
|
private GameObject _child; |
|
|
|
private float _time; |
|
|
|
private float m_time; |
|
|
|
|
|
|
|
private GameObject m_child; |
|
|
|
private GameObject m_body; |
|
|
|
|
|
|
|
private float m_velocityWindup; |
|
|
|
|
|
|
|
private LineRenderer m_lineRenderer; |
|
|
|
|
|
|
|
private void Awake() |
|
|
|
{ |
|
|
|
m_body = this.gameObject; |
|
|
@ -28,39 +33,63 @@ public class YeetController : MonoBehaviour |
|
|
|
_child = child; |
|
|
|
_child.transform.parent = parent.transform; |
|
|
|
yeetState = YeetState.Held; |
|
|
|
|
|
|
|
m_lineRenderer = gameObject.AddComponent<LineRenderer>(); |
|
|
|
} |
|
|
|
|
|
|
|
public void Yeet() |
|
|
|
{ |
|
|
|
_child.transform.parent = null; |
|
|
|
_child.transform.rotation = parent.transform.rotation; |
|
|
|
_child.GetComponent<Rigidbody>().velocity = _child.transform.forward * yeetVelocity + _child.transform.up * yeetVelocity; |
|
|
|
_child.GetComponent<Rigidbody>().velocity = _child.transform.forward * m_velocityWindup + _child.transform.up * m_velocityWindup; |
|
|
|
yeetState = YeetState.Yeeting; |
|
|
|
_time = yeetDuration; |
|
|
|
m_time = yeetDuration; |
|
|
|
m_velocityWindup = 0; |
|
|
|
|
|
|
|
Destroy(m_lineRenderer); |
|
|
|
} |
|
|
|
|
|
|
|
// Start is called before the first frame update
|
|
|
|
void Start() |
|
|
|
{ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// Update is called once per frame
|
|
|
|
void Update() |
|
|
|
{ |
|
|
|
switch(yeetState) |
|
|
|
{ |
|
|
|
case YeetState.Yeeting: |
|
|
|
//_child.transform.position += _child.transform.forward * yeetVelocity * Time.deltaTime;
|
|
|
|
_time -= Time.deltaTime; |
|
|
|
m_time -= Time.deltaTime; |
|
|
|
|
|
|
|
if(_time <= 0f) |
|
|
|
if(m_time <= 0f) |
|
|
|
{ |
|
|
|
Debug.Log("YeetController.Update: Yeet finished"); |
|
|
|
yeetState = YeetState.Unheld; |
|
|
|
} |
|
|
|
break; |
|
|
|
case YeetState.Held: |
|
|
|
// draw yeet lines
|
|
|
|
|
|
|
|
if(m_velocityWindup < yeetVelocity) |
|
|
|
{ |
|
|
|
m_velocityWindup += windupSpeed; |
|
|
|
} |
|
|
|
|
|
|
|
Vector3 velocity = parent.transform.forward * m_velocityWindup + parent.transform.up * m_velocityWindup; |
|
|
|
|
|
|
|
float t; |
|
|
|
t = (-1f * velocity.y) / Physics.gravity.y; |
|
|
|
t = 2f * t; |
|
|
|
|
|
|
|
m_lineRenderer.positionCount = 10; |
|
|
|
Vector3 trajectoryPoint; |
|
|
|
|
|
|
|
for (int i = 0; i < m_lineRenderer.positionCount; i++) |
|
|
|
{ |
|
|
|
float time = t * i / (float)(m_lineRenderer.positionCount); |
|
|
|
trajectoryPoint = parent.transform.position + velocity * time + 0.5f * Physics.gravity * time * time; |
|
|
|
m_lineRenderer.SetPosition(i, trajectoryPoint); |
|
|
|
} |
|
|
|
break; |
|
|
|
case YeetState.Unheld: |
|
|
|
_child = null; |
|
|
@ -98,4 +127,5 @@ public class YeetController : MonoBehaviour |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |