feat: Wall run

This commit is contained in:
2026-06-08 01:09:28 +02:00
parent 6a26357204
commit 5f6edb910f
113 changed files with 68759 additions and 37 deletions

View File

@@ -0,0 +1,126 @@
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>();
}
}
}