using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace BNG { /// /// Like a jetpack, but for your hands. /// public class HandJet : GrabbableEvents { [Tooltip("Movement Speed to apply if using a CharacterController, or Force to apply if using a Rigidbody controller.")] public float JetForce = 10f; [Tooltip("Enabled while jetting")] public ParticleSystem JetFX; [Tooltip("If true the player will float in the air when not jetting. (Works for Rigidbody player only)")] public bool DisableGravityWhileHeld = true; CharacterController characterController; SmoothLocomotion smoothLocomotion; PlayerGravity playerGravity; Rigidbody playerRigid; AudioSource audioSource; void Start() { GameObject player = GameObject.FindGameObjectWithTag("Player"); if(player) { characterController = player.GetComponentInChildren(); playerGravity = player.GetComponentInChildren(); smoothLocomotion = player.GetComponentInChildren(); playerRigid = player.GetComponent(); } else { Debug.Log("No player object found."); } audioSource = GetComponent(); } public override void OnTrigger(float triggerValue) { if(triggerValue > 0.25f) { doJet(triggerValue); } else { stopJet(); } base.OnTrigger(triggerValue); } // Apply force to player in Fixed Update public void FixedUpdate() { if(grab != null && grab.BeingHeld && addRigidForce != null && addRigidForce != Vector3.zero) { if(playerRigid) { playerRigid.AddForce(addRigidForce, ForceMode.Force); } } } public override void OnGrab(Grabber grabber) { // disable gravity if(DisableGravityWhileHeld) { ChangeGravity(false); } } public void ChangeGravity(bool gravityOn) { if(playerGravity) { playerGravity.ToggleGravity(gravityOn); } } public override void OnRelease() { stopJet(); // re-enforce gravity if (DisableGravityWhileHeld) { ChangeGravity(true); } } Vector3 moveDirection; Vector3 addRigidForce; void doJet(float triggerValue) { moveDirection = transform.forward * JetForce; // Use smooth loco method if available if (smoothLocomotion) { if(smoothLocomotion.ControllerType == PlayerControllerType.CharacterController) { smoothLocomotion.MoveCharacter(moveDirection * Time.deltaTime * triggerValue); } else if (smoothLocomotion.ControllerType == PlayerControllerType.Rigidbody) { //smoothLocomotion.MoveRigidPlayer(moveDirection * triggerValue); // Handle this in LFixedUpdate // Rigidbody rb = smoothLocomotion.GetComponent(); // moveDirection += new Vector3(0, smoothLocomotion.RigidBodyGravity, 0); addRigidForce = moveDirection * triggerValue; // rb.AddRelativeForce(moveDirection * triggerValue, fm); // smoothLocomotion.MoveCharacter(moveDirection * Time.deltaTime * triggerValue); } } // Fall back to character controller else if (characterController) { characterController.Move(moveDirection * Time.deltaTime * triggerValue); } // Gravity is always off while jetting ChangeGravity(false); // Sound if (!audioSource.isPlaying) { audioSource.pitch = Time.timeScale; audioSource.Play(); } // Particle FX if(JetFX != null && !JetFX.isPlaying) { JetFX.Play(); } //Haptics if(input && thisGrabber != null) { input.VibrateController(0.1f, 0.5f, 0.2f, thisGrabber.HandSide); } } void stopJet() { if (audioSource.isPlaying) { audioSource.Stop(); } if (JetFX != null && JetFX.isPlaying) { JetFX.Stop(); } if (DisableGravityWhileHeld == false) { ChangeGravity(true); } addRigidForce = Vector3.zero; } public override void OnTriggerUp() { stopJet(); base.OnTriggerUp(); } } }