127 lines
3.6 KiB
C#
127 lines
3.6 KiB
C#
using UnityEngine;
|
|
using UnityEngine.InputSystem;
|
|
using static Player;
|
|
|
|
public class PlayerRockerLauncher : MonoBehaviour
|
|
{
|
|
[System.Serializable]
|
|
public class References
|
|
{
|
|
public InputActionAsset InputActions;
|
|
public GameObject RocketPrefab;
|
|
public GameObject LauncherMesh;
|
|
public Transform HatchJoint;
|
|
public Transform RootJoint;
|
|
public Transform YawJoint;
|
|
public Transform PitchJoint;
|
|
public Transform RocketOrigin;
|
|
}
|
|
|
|
[System.Serializable]
|
|
public class Settings
|
|
{
|
|
public bool InfiniteAmo;
|
|
}
|
|
|
|
[System.Serializable]
|
|
public class StateContainer
|
|
{
|
|
public int RocketCount;
|
|
}
|
|
|
|
[SerializeField] private Settings _settings;
|
|
[SerializeField] private References _references;
|
|
[SerializeField, ReadOnly] private StateContainer _state;
|
|
|
|
private InputAction _targetAction;
|
|
private InputAction _launchAction;
|
|
private Camera _camera;
|
|
private Rocket _rocket;
|
|
private Vector3 _rootPos;
|
|
private float _targeting;
|
|
|
|
|
|
void Awake()
|
|
{
|
|
//if (!Instance)
|
|
// Instance = this;
|
|
|
|
_rootPos = _references.RootJoint.transform.localPosition;
|
|
|
|
// Inputs
|
|
_targetAction = _references.InputActions.FindActionMap("Player").FindAction("Target");
|
|
_launchAction = _references.InputActions.FindActionMap("Player").FindAction("Attack");
|
|
|
|
// Camera
|
|
_camera = Camera.main;
|
|
}
|
|
|
|
void OnEnable()
|
|
{
|
|
_targetAction?.Enable();
|
|
_launchAction?.Enable();
|
|
|
|
SetLauncher();
|
|
}
|
|
|
|
void OnDisable()
|
|
{
|
|
_targetAction?.Disable();
|
|
_launchAction?.Disable();
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
float t = Time.deltaTime;
|
|
|
|
HandleTargeting(t);
|
|
SetLauncher();
|
|
HandleLaunch();
|
|
ManageRockets();
|
|
}
|
|
|
|
private void HandleTargeting(float deltaTime)
|
|
{
|
|
bool executeTarget = _targetAction.IsPressed() && _rocket;
|
|
|
|
_targeting = Mathf.Clamp01(_targeting + deltaTime * 2 * (executeTarget ? 1 : -1));
|
|
}
|
|
|
|
private void SetLauncher()
|
|
{
|
|
_references.LauncherMesh.SetActive(_targeting > 0);
|
|
_references.RocketOrigin.gameObject.SetActive(_targeting > 0);
|
|
_references.HatchJoint.localRotation = Quaternion.Slerp(Quaternion.Euler(0, -45, 0), Quaternion.Euler(-75, -45, 0), _targeting);
|
|
_references.RootJoint.localPosition = _rootPos + Vector3.up * Mathf.Lerp(-.8f, 0, _targeting);
|
|
|
|
Quaternion yaw = Quaternion.LookRotation(Vector3.ProjectOnPlane(_camera.transform.forward, Vector3.up));
|
|
yaw = Quaternion.Slerp(_references.RootJoint.rotation, yaw, _targeting);
|
|
|
|
Quaternion pitch = Quaternion.Slerp(Quaternion.Euler(0, 0, 0), Quaternion.Euler(_camera.transform.eulerAngles.x + 45, 0, 0), Mathf.InverseLerp(.6f, 1, _targeting));
|
|
|
|
_references.YawJoint.rotation = yaw;
|
|
_references.PitchJoint.localRotation = pitch;
|
|
}
|
|
|
|
private void HandleLaunch()
|
|
{
|
|
if (_rocket && _targeting == 1 && _launchAction.triggered)
|
|
{
|
|
_rocket.Launch();
|
|
_rocket = null;
|
|
}
|
|
}
|
|
|
|
private void ManageRockets()
|
|
{
|
|
if ((_state.RocketCount > 0 || _settings.InfiniteAmo) && !_rocket && _targeting == 0)
|
|
{
|
|
GameObject obj = Instantiate(_references.RocketPrefab, _references.RocketOrigin);
|
|
obj.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.Euler(0, 0, 0));
|
|
obj.transform.localScale = Vector3.one;
|
|
|
|
_rocket = obj.GetComponent<Rocket>();
|
|
}
|
|
}
|
|
}
|