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.
 
 
 
 

183 lines
4.4 KiB

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, BoxGroup("References")]
private OarController m_oar;
[SerializeField,BoxGroup("settings")]
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("Settings")]
private Vector2 m_startInput = new Vector2(0, 1);
[SerializeField]
private Vector3 m_IKOffset = new Vector3(0, 0, 0.05f);
[SerializeField]
private Quaternion m_IKRotationOffset;
[SerializeField, BoxGroup("Input")]
private InputActionProperty m_inputAxis;
[SerializeField, BoxGroup("Input")]
private InputActionProperty m_row;
#endregion Inspector Fields
#region Private Fields
//Last input of player
public Vector2 m_desiredInput;
private Vector3 m_startPosition;
private Vector3 m_lastPosition;
private bool m_doUndo;
#endregion Private Fields
#region Getters
public new Transform transform => m_handTransform;
#endregion Getters
#region MonoBehaviour Functions
private void Start()
{
m_startPosition = transform.localPosition;
UpdateHand(m_startInput);
}
/// <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);
}
public Vector3 GetIKPosition()
{
return transform.position + transform.TransformDirection(m_IKOffset);
}
public Quaternion GetIKRotation()
{
return m_oar.transform.rotation * m_IKRotationOffset;
}
#endregion MonoBehaviour Functions
#region Class Functionality
/// <summary>
/// Called every fixed update to move the arms
/// </summary>
/// <param name="input"></param>
public void UpdateHand(Vector2 input, bool registerUndo = true)
{
m_lastPosition = transform.localPosition;
Quaternion rotation = Quaternion.LookRotation(m_axisForward.normalized, m_axisNormal.normalized);
Vector3 axisInput = 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()
{
Vector3 direction = m_lastPosition - transform.localPosition;
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
}