Global Game Jam 2021
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
5.1 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.InputSystem;
  5. public class YeetController : InputBehaviour
  6. {
  7. [Tooltip("This is where the babies are held")]
  8. public GameObject handCarryingPosition;
  9. public GameObject parent { get; set; }
  10. public float yeetVelocity = 5f;
  11. public float yeetDuration = 2f;
  12. public float windupSpeed = 0.01f;
  13. [SerializeField]
  14. private Animator m_YeetAnimator;
  15. public Material trajectoryLineMaterial;
  16. public enum YeetState { Unheld, Held, Preyeet, Yeeting };
  17. public YeetState yeetState { get; private set; } = YeetState.Unheld;
  18. private GameObject _child;
  19. private float m_time;
  20. private GameObject m_child;
  21. private GameObject m_body;
  22. private float m_velocityWindup;
  23. private LineRenderer m_lineRenderer;
  24. private Vector3 preyeetPosition;
  25. private void Awake()
  26. {
  27. m_body = this.gameObject;
  28. }
  29. public void Hold(GameObject child)
  30. {
  31. _child = child;
  32. _child.transform.parent = parent.transform;
  33. _child.GetComponent<YeetHandle>().held = true;
  34. _child.GetComponent<YeetHandle>().lastHeld = parent;
  35. yeetState = YeetState.Held;
  36. m_YeetAnimator.SetBool("Carry", true);
  37. m_YeetAnimator.SetBool("Yeet", true);
  38. }
  39. public void Preyeet()
  40. {
  41. preyeetPosition = parent.transform.position;
  42. m_lineRenderer = gameObject.AddComponent<LineRenderer>();
  43. m_lineRenderer.material = trajectoryLineMaterial;
  44. yeetState = YeetState.Preyeet;
  45. }
  46. public void Yeet()
  47. {
  48. m_YeetAnimator.SetBool("Yeet", false);
  49. m_YeetAnimator.SetBool("Carry", false);
  50. _child.transform.parent = null;
  51. _child.transform.rotation = parent.transform.rotation;
  52. _child.GetComponent<YeetHandle>().held = false;
  53. _child.GetComponent<Rigidbody>().velocity = calculateVelocityVector();
  54. yeetState = YeetState.Yeeting;
  55. m_time = yeetDuration;
  56. m_velocityWindup = 0;
  57. Destroy(m_lineRenderer);
  58. }
  59. void Start()
  60. {
  61. }
  62. void Update()
  63. {
  64. switch(yeetState)
  65. {
  66. case YeetState.Yeeting:
  67. m_time -= Time.deltaTime;
  68. if(m_time <= 0f)
  69. {
  70. Debug.Log("YeetController.Update: Yeet finished");
  71. yeetState = YeetState.Unheld;
  72. }
  73. break;
  74. case YeetState.Preyeet:
  75. //TODO: Stop player
  76. parent.transform.position = preyeetPosition;
  77. _child.transform.position = handCarryingPosition.transform.position;
  78. if (m_velocityWindup < yeetVelocity)
  79. {
  80. m_velocityWindup += windupSpeed;
  81. }
  82. Vector3 velocity = calculateVelocityVector();
  83. float t;
  84. t = (-1f * velocity.y) / Physics.gravity.y;
  85. t = 2f * t;
  86. m_lineRenderer.positionCount = 10;
  87. Vector3 trajectoryPoint;
  88. for (int i = 0; i < m_lineRenderer.positionCount; i++)
  89. {
  90. float time = t * i / (float)(m_lineRenderer.positionCount);
  91. trajectoryPoint = parent.transform.position + velocity * time + 0.5f * Physics.gravity * time * time;
  92. m_lineRenderer.SetPosition(i, trajectoryPoint);
  93. }
  94. break;
  95. case YeetState.Held:
  96. //TODO: slow player
  97. // Stop child from wriggling
  98. _child.transform.position = handCarryingPosition.transform.position;
  99. break;
  100. case YeetState.Unheld:
  101. _child = null;
  102. break;
  103. }
  104. }
  105. private Vector3 calculateVelocityVector()
  106. {
  107. return parent.transform.forward * m_velocityWindup + parent.transform.up * m_velocityWindup;
  108. }
  109. private void OnTriggerEnter(Collider collider)
  110. {
  111. Debug.Log("PlayerInputController.OnTriggerEnter: arrived");
  112. m_child = collider.gameObject;
  113. }
  114. private void OnTriggerExit(Collider collider)
  115. {
  116. m_child = null;
  117. }
  118. private void OnYeet(InputAction.CallbackContext args)
  119. {
  120. parent = m_body;
  121. switch (yeetState)
  122. {
  123. case YeetController.YeetState.Unheld:
  124. if(m_child)
  125. Hold(m_child);
  126. // Grab nearest baby
  127. break;
  128. case YeetState.Preyeet:
  129. Yeet();
  130. break;
  131. case YeetController.YeetState.Held:
  132. // Yeet baby
  133. Preyeet();
  134. break;
  135. case YeetController.YeetState.Yeeting:
  136. // Cooldown?
  137. break;
  138. }
  139. }
  140. public override void RegisterInput(PlayerInput playerInput)
  141. {
  142. playerInput.currentActionMap.FindAction("Yeet").performed += OnYeet;
  143. }
  144. public override void UnregisterInput(PlayerInput playerInput)
  145. {
  146. playerInput.currentActionMap.FindAction("Yeet").performed -= OnYeet;
  147. }
  148. }