Global Game Jam 2023
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.

130 lines
2.9 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. using NaughtyAttributes;
  6. /// <summary>
  7. /// Script to control player input and oars
  8. /// </summary>
  9. public class OarController : MonoBehaviour
  10. {
  11. #region Inspector Fields
  12. [SerializeField,BoxGroup("References")]
  13. private HandController m_leftHand;
  14. [SerializeField, BoxGroup("References")]
  15. private HandController m_rightHand;
  16. [SerializeField, BoxGroup("References")]
  17. private Rigidbody m_oarRigidbody;
  18. [SerializeField, BoxGroup("References")]
  19. private Transform m_body;
  20. [SerializeField]
  21. private List<Collider> m_forbiddenColliders;
  22. #endregion Inspector Fields
  23. #region Private Fields
  24. float m_distanceFromRightHand;
  25. bool undoDoneThisFrame = false;
  26. #endregion Private Fields
  27. #region Getters
  28. public new Transform transform => m_oarRigidbody.transform;
  29. #endregion Getters
  30. #region MonoBehaviour Functions
  31. private void Awake()
  32. {
  33. m_distanceFromRightHand = Vector3.Distance(m_rightHand.transform.position, transform.position);
  34. m_oarRigidbody = GetComponent<Rigidbody>();
  35. }
  36. /// <summary>
  37. /// OnEnable is called when the object becomes enabled and active.
  38. /// </summary>
  39. private void OnEnable()
  40. {
  41. }
  42. /// <summary>
  43. /// OnDisable is called when the behaviour becomes disabled.
  44. /// </summary>
  45. private void OnDisable()
  46. {
  47. }
  48. /// <summary>
  49. /// Update is called once per frame
  50. /// </summary>
  51. private void FixedUpdate()
  52. {
  53. undoDoneThisFrame = false;
  54. UpdateTransform();
  55. }
  56. #endregion MonoBehaviour Functions
  57. #region Class Functionality
  58. private void UpdateTransform()
  59. {
  60. Vector3 direction =(m_rightHand.transform.position - m_leftHand.transform.position).normalized;
  61. Vector3 forward = Vector3.Cross(direction, m_body.forward);
  62. Quaternion rotation = Quaternion.LookRotation(forward, direction);
  63. m_oarRigidbody.MovePosition(m_rightHand.transform.position - direction * m_distanceFromRightHand);
  64. m_oarRigidbody.MoveRotation(rotation);
  65. }
  66. void OnCollisionEnter(Collision collision)
  67. {
  68. if (m_forbiddenColliders.Contains(collision.collider) && !undoDoneThisFrame)
  69. {
  70. Debug.Log($"Forbidden Collision: {collision.collider.gameObject}");
  71. undoDoneThisFrame= true;
  72. m_leftHand.UndoLastMovement();
  73. m_rightHand.UndoLastMovement();
  74. }
  75. else
  76. {
  77. Debug.Log($"Ignored Collision: {collision.collider.gameObject}");
  78. }
  79. }
  80. #endregion Class Functionality
  81. #region Editor Functions
  82. /// <summary>
  83. /// Called when the Component is created or Reset from the Inspector
  84. /// </summary>
  85. private void Reset()
  86. {
  87. m_oarRigidbody = GetComponentInChildren<Rigidbody>();
  88. }
  89. #endregion Editor Functions
  90. }