using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; using UnityEngine.XR.Interaction.Toolkit; public class Dash : MonoBehaviour { [SerializeField] private float minDashRange = 0.5f; [SerializeField] private float maxDashRange = 40f; [SerializeField] private float dashTime = 0.2f; private Transform cameraRigRoot; public XRNode dashSource; public InputHelpers.Button dashButton; private float inputThreshold = 0.1f; public float vignetteIntensity = 0.75f; public float abberationIntensity = 0.75f; public float duration = 0.5f; public Volume volume = null; private Transform rController; private ParticleSystem trail; private Vignette vignette = null; private ChromaticAberration aberration = null; public AudioClip dashFX; private bool _canDash = true; private bool _justDashed = false; private float _lastUsed; private float _dashCooldown = 3.0f; AudioSource audioPlayer; private void Start() { trail = transform.Find("Trail").GetComponent(); rController = GameObject.Find("RightHand Controller").transform; cameraRigRoot = transform; if (volume.profile.TryGet(out Vignette vignette)) { this.vignette = vignette; vignette.smoothness.Override(0.4f); } if (volume.profile.TryGet(out ChromaticAberration aberration)) { this.aberration = aberration; } } private void Update() { InputHelpers.IsPressed(InputDevices.GetDeviceAtXRNode(dashSource), dashButton, out bool isPressed, inputThreshold); if (isPressed && _canDash) { TryDash(); } if (_justDashed) { if (_lastUsed + _dashCooldown < Time.time) { _justDashed = false; _canDash = true; } } } private void TryDash() { RaycastHit hit; Ray ray = new Ray(rController.position, rController.forward); if (Physics.Raycast(ray, out hit)) { Debug.Log(hit); if (hit.distance > minDashRange && hit.distance < maxDashRange) { _canDash = false; _justDashed = true; _lastUsed = Time.time; StartCoroutine(FadeAndAbbr(0, vignetteIntensity, 0, abberationIntensity)); StartCoroutine(DoDash(hit.point)); StartCoroutine(ExecuteAfterTime(1)); } } } private IEnumerator DoDash(Vector3 endPoint) { float elapsed = 0f; AudioSource.PlayClipAtPoint(dashFX, transform.position, 1); Vector3 startPoint = cameraRigRoot.position; trail.Play(); while (elapsed < dashTime) { elapsed += Time.deltaTime; float elapsedPct = elapsed / dashTime; cameraRigRoot.position = Vector3.Lerp(startPoint, endPoint, elapsedPct); yield return null; } } IEnumerator ExecuteAfterTime(float time) { yield return new WaitForSeconds(time); // Code to execute after the delay StartCoroutine(FadeAndAbbr(vignetteIntensity, 0, abberationIntensity, 0)); } private IEnumerator FadeAndAbbr(float VstartValue, float VendValue, float CAstartValue, float CAendValue) { float elapsedTime = 0.0f; while (elapsedTime <= duration) { float blend = elapsedTime / duration; elapsedTime += Time.deltaTime; float Vintensity = Mathf.Lerp(VstartValue, VendValue, blend); float CAintensity = Mathf.Lerp(CAstartValue, CAendValue, blend); ApplyValue(Vintensity, CAintensity); } yield return null; } private void ApplyValue(float vignette, float cromabbr) { this.vignette.intensity.Override(vignette); aberration.intensity.Override(cromabbr); } }