size 21839 |
@ -0,0 +1,7 @@ | |||||
fileFormatVersion: 2 | |||||
guid: 72514749158858a4e8977db04e36b05a | |||||
PrefabImporter: | |||||
externalObjects: {} | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@ -0,0 +1,8 @@ | |||||
fileFormatVersion: 2 | |||||
guid: 1b8532fcb1449a640a09b4cdf120171e | |||||
folderAsset: yes | |||||
DefaultImporter: | |||||
externalObjects: {} | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
size 17564 |
@ -0,0 +1,7 @@ | |||||
fileFormatVersion: 2 | |||||
guid: 08c61a126f535e24592d442f7d72b045 | |||||
DefaultImporter: | |||||
externalObjects: {} | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@ -0,0 +1,156 @@ | |||||
using System.Collections; | |||||
using System.Collections.Generic; | |||||
using UnityEngine; | |||||
using UnityEngine.InputSystem; | |||||
using NaughtyAttributes; | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
public class HandController : MonoBehaviour | |||||
{ | |||||
#region Inspector Fields | |||||
[SerializeField, BoxGroup("References")] | |||||
private Transform m_handTransform; | |||||
[SerializeField] | |||||
private Transform m_otherHand; | |||||
[SerializeField, BoxGroup("Settings")] | |||||
private Vector3 m_axisNormal = Vector3.forward; | |||||
[SerializeField, BoxGroup("Settings")] | |||||
private Vector3 m_axisForward = Vector3.up; | |||||
[SerializeField, BoxGroup("Settings")] | |||||
private float m_armRange = 1; | |||||
[SerializeField, BoxGroup("Settings"),Range(0.0f,1.0f)] | |||||
private float m_armSpeed = 0.5f; | |||||
[SerializeField, BoxGroup("Input")] | |||||
private InputActionProperty m_inputAxis; | |||||
[SerializeField, BoxGroup("Input")] | |||||
private InputActionProperty m_row; | |||||
#endregion Inspector Fields | |||||
#region Private Fields | |||||
//Last input of player | |||||
private Vector2 m_desiredInput; | |||||
private Vector3 m_startPosition; | |||||
private Vector3 m_lastPosition; | |||||
#endregion Private Fields | |||||
#region Getters | |||||
public new Transform transform => m_handTransform; | |||||
#endregion Getters | |||||
#region MonoBehaviour Functions | |||||
private void Start() | |||||
{ | |||||
m_startPosition = transform.localPosition; | |||||
} | |||||
/// <summary> | |||||
/// OnEnable is called when the object becomes enabled and active. | |||||
/// </summary> | |||||
private void OnEnable() | |||||
{ | |||||
m_inputAxis.action.performed += OnInputRecieved; | |||||
m_inputAxis.action.canceled += OnInputRecieved; | |||||
m_inputAxis.action.Enable(); | |||||
m_row.action?.Enable(); | |||||
} | |||||
/// <summary> | |||||
/// OnDisable is called when the behaviour becomes disabled. | |||||
/// </summary> | |||||
private void OnDisable() | |||||
{ | |||||
m_inputAxis.action.performed -= OnInputRecieved; | |||||
m_inputAxis.action.canceled -= OnInputRecieved; | |||||
m_inputAxis.action.Disable(); | |||||
m_row.action?.Disable(); | |||||
} | |||||
/// <summary> | |||||
/// Update is called once per frame | |||||
/// </summary> | |||||
private void FixedUpdate() | |||||
{ | |||||
UpdateHand(m_desiredInput); | |||||
} | |||||
#endregion MonoBehaviour Functions | |||||
#region Class Functionality | |||||
/// <summary> | |||||
/// Called every fixed update to move the arms | |||||
/// </summary> | |||||
/// <param name="input"></param> | |||||
private void UpdateHand(Vector2 input) | |||||
{ | |||||
m_lastPosition = transform.localPosition; | |||||
Quaternion rotation = Quaternion.LookRotation(m_axisForward.normalized, m_axisNormal.normalized); | |||||
Vector3 axisInput = transform.rotation * rotation * new Vector3(input.x, 0, input.y); | |||||
Vector3 desiredPosition = m_startPosition + axisInput * m_armRange; | |||||
transform.localPosition = Vector3.Lerp(transform.localPosition, desiredPosition, m_armSpeed); | |||||
if (m_row.action != null) | |||||
{ | |||||
if (m_row.action.IsPressed()) | |||||
{ | |||||
transform.localPosition = Vector3.Lerp(transform.localPosition, m_otherHand.localPosition, 0.5f); | |||||
} | |||||
} | |||||
} | |||||
public void UndoLastMovement() | |||||
{ | |||||
transform.localPosition = m_lastPosition; | |||||
} | |||||
/// <summary> | |||||
/// Called by the input system when the input is changed | |||||
/// </summary> | |||||
/// <param name="args"></param> | |||||
private void OnInputRecieved(InputAction.CallbackContext args) | |||||
{ | |||||
m_desiredInput = args.ReadValue<Vector2>(); | |||||
} | |||||
#endregion Class Functionality | |||||
#region Editor Functions | |||||
/// <summary> | |||||
/// Called when the Component is created or Reset from the Inspector | |||||
/// </summary> | |||||
private void Reset() | |||||
{ | |||||
m_handTransform = base.transform; | |||||
} | |||||
#endregion Editor Functions | |||||
} |
@ -0,0 +1,11 @@ | |||||
fileFormatVersion: 2 | |||||
guid: 9531ea25ab68fa6428196676e0198eb6 | |||||
MonoImporter: | |||||
externalObjects: {} | |||||
serializedVersion: 2 | |||||
defaultReferences: [] | |||||
executionOrder: 0 | |||||
icon: {instanceID: 0} | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@ -1,18 +1,131 @@ | |||||
using System.Collections; | using System.Collections; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Linq; | |||||
using UnityEngine; | using UnityEngine; | ||||
using NaughtyAttributes; | |||||
/// <summary> | |||||
/// Script to control player input and oars | |||||
/// </summary> | |||||
public class OarController : MonoBehaviour | public class OarController : MonoBehaviour | ||||
{ | { | ||||
// Start is called before the first frame update | |||||
void Start() | |||||
#region Inspector Fields | |||||
[SerializeField,BoxGroup("References")] | |||||
private HandController m_leftHand; | |||||
[SerializeField, BoxGroup("References")] | |||||
private HandController m_rightHand; | |||||
[SerializeField, BoxGroup("References")] | |||||
private Rigidbody m_oarRigidbody; | |||||
[SerializeField, BoxGroup("References")] | |||||
private Transform m_body; | |||||
[SerializeField] | |||||
private List<Collider> m_forbiddenColliders; | |||||
#endregion Inspector Fields | |||||
#region Private Fields | |||||
float m_distanceFromRightHand; | |||||
bool undoDoneThisFrame = false; | |||||
#endregion Private Fields | |||||
#region Getters | |||||
public new Transform transform => m_oarRigidbody.transform; | |||||
#endregion Getters | |||||
#region MonoBehaviour Functions | |||||
private void Awake() | |||||
{ | { | ||||
m_distanceFromRightHand = Vector3.Distance(m_rightHand.transform.position, transform.position); | |||||
m_oarRigidbody = GetComponent<Rigidbody>(); | |||||
} | |||||
/// <summary> | |||||
/// OnEnable is called when the object becomes enabled and active. | |||||
/// </summary> | |||||
private void OnEnable() | |||||
{ | |||||
} | } | ||||
// Update is called once per frame | |||||
void Update() | |||||
/// <summary> | |||||
/// OnDisable is called when the behaviour becomes disabled. | |||||
/// </summary> | |||||
private void OnDisable() | |||||
{ | |||||
} | |||||
/// <summary> | |||||
/// Update is called once per frame | |||||
/// </summary> | |||||
private void FixedUpdate() | |||||
{ | |||||
undoDoneThisFrame = false; | |||||
UpdateTransform(); | |||||
} | |||||
#endregion MonoBehaviour Functions | |||||
#region Class Functionality | |||||
private void UpdateTransform() | |||||
{ | |||||
Vector3 direction =(m_rightHand.transform.position - m_leftHand.transform.position).normalized; | |||||
Vector3 forward = Vector3.Cross(direction, m_body.forward); | |||||
Quaternion rotation = Quaternion.LookRotation(forward, direction); | |||||
m_oarRigidbody.MovePosition(m_rightHand.transform.position - direction * m_distanceFromRightHand); | |||||
m_oarRigidbody.MoveRotation(rotation); | |||||
} | |||||
void OnCollisionEnter(Collision collision) | |||||
{ | { | ||||
if (m_forbiddenColliders.Contains(collision.collider) && !undoDoneThisFrame) | |||||
{ | |||||
Debug.Log($"Forbidden Collision: {collision.collider.gameObject}"); | |||||
undoDoneThisFrame= true; | |||||
m_leftHand.UndoLastMovement(); | |||||
m_rightHand.UndoLastMovement(); | |||||
} | |||||
else | |||||
{ | |||||
Debug.Log($"Ignored Collision: {collision.collider.gameObject}"); | |||||
} | |||||
} | } | ||||
} | |||||
#endregion Class Functionality | |||||
#region Editor Functions | |||||
/// <summary> | |||||
/// Called when the Component is created or Reset from the Inspector | |||||
/// </summary> | |||||
private void Reset() | |||||
{ | |||||
m_oarRigidbody = GetComponentInChildren<Rigidbody>(); | |||||
} | |||||
#endregion Editor Functions | |||||
} |
@ -0,0 +1,86 @@ | |||||
using System.Collections; | |||||
using System.Collections.Generic; | |||||
using UnityEngine; | |||||
using UnityEngine.InputSystem; | |||||
using NaughtyAttributes; | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
public class RowController : MonoBehaviour | |||||
{ | |||||
#region Inspector Fields | |||||
[SerializeField] | |||||
private Transform m_topHand; | |||||
[SerializeField] | |||||
private Transform m_bottomHand; | |||||
[SerializeField, BoxGroup("Settings"), Range(0.0f, 1.0f)] | |||||
private float m_armRange = 1; | |||||
[SerializeField, BoxGroup("Settings"), Range(0.0f, 1.0f)] | |||||
private float m_armSpeed = 0.2f; | |||||
[SerializeField, BoxGroup("Input")] | |||||
private InputActionProperty m_inputAxis; | |||||
#endregion Inspector Fields | |||||
#region Private Fields | |||||
#endregion Private Fields | |||||
#region Getters | |||||
#endregion Getters | |||||
#region MonoBehaviour Functions | |||||
/// <summary> | |||||
/// OnEnable is called when the object becomes enabled and active. | |||||
/// </summary> | |||||
private void OnEnable() | |||||
{ | |||||
} | |||||
/// <summary> | |||||
/// OnDisable is called when the behaviour becomes disabled. | |||||
/// </summary> | |||||
private void OnDisable() | |||||
{ | |||||
} | |||||
/// <summary> | |||||
/// Update is called once per frame | |||||
/// </summary> | |||||
private void Update() | |||||
{ | |||||
} | |||||
#endregion MonoBehaviour Functions | |||||
#region Class Functionality | |||||
#endregion Class Functionality | |||||
#region Editor Functions | |||||
/// <summary> | |||||
/// Called when the Component is created or Reset from the Inspector | |||||
/// </summary> | |||||
private void Reset() | |||||
{ | |||||
//useful for finding components on creation | |||||
} | |||||
#endregion Editor Functions | |||||
} |
@ -0,0 +1,11 @@ | |||||
fileFormatVersion: 2 | |||||
guid: c8c0b8a0d937577428fa6056801a716a | |||||
MonoImporter: | |||||
externalObjects: {} | |||||
serializedVersion: 2 | |||||
defaultReferences: [] | |||||
executionOrder: 0 | |||||
icon: {instanceID: 0} | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@ -0,0 +1,14 @@ | |||||
fileFormatVersion: 2 | |||||
guid: 5007e9a2e21d73f43b8fbe101756449d | |||||
ScriptedImporter: | |||||
internalIDToNameTable: [] | |||||
externalObjects: {} | |||||
serializedVersion: 2 | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: | |||||
script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} | |||||
generateWrapperCode: 0 | |||||
wrapperCodePath: | |||||
wrapperClassName: | |||||
wrapperCodeNamespace: UnityEngine.InputSystem |
size 1323 |