Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using VRTK;
- public class Gun : VRTK_InteractableObject
- {
- [Header("Game Objects")]
- public GameObject gun;
- public GameObject leftController;
- public GameObject rightController;
- public GameObject magazine;
- public Slide slide;
- public GameObject trigger;
- public Transform shell;
- [Header("Animation")]
- public Animation firingAnimation;
- public float animationSpeed;
- [Header("Sound Effect")]
- public AudioClip gunShotSound;
- public float gunShotVolume;
- [Header("Weapon Recoil")]
- public float kickup;
- public float kickback;
- private float minTriggerSqueeze = -10f;
- private float maxTriggerSqueeze = 45f;
- private AudioSource source;
- private Collider slideCollider;
- private VRTK_ControllerEvents controllerEvents;
- public override void StartUsing(VRTK_InteractUse currentUsingObject)
- {
- base.StartUsing(currentUsingObject);
- if (!slide.lockBack)
- {
- if (GetAmmo() > 0)
- {
- shoot();
- slide.Fire();
- }
- else
- {
- slide.Fire();
- slide.lockBack = true;
- }
- }
- StopUsing();
- }
- private void ToggleCollision(Rigidbody objRB, Collider objCol, bool state)
- {
- objRB.isKinematic = !state;
- objCol.isTrigger = !state;
- }
- private void ToggleSlide(bool state)
- {
- if (!state)
- {
- slide.ForceStopInteracting();
- }
- slide.enabled = state;
- slide.isGrabbable = state;
- slideCollider.isTrigger = state;
- }
- public override void StopUsing(VRTK_InteractUse previousUsingObject = null, bool resetUsingObjectState = true)
- {
- base.StopUsing(previousUsingObject, resetUsingObjectState);
- }
- private void Awake()
- {
- source = gun.GetComponent<AudioSource>();
- slideCollider = slide.GetComponent<Collider>();
- IgnoreColliders(magazine.GetComponents<Collider>());
- IgnoreColliders(slide.GetComponents<Collider>());
- IgnoreColliders(slide.GetComponents<Collider>(), magazine.GetComponents<Collider>());
- }
- public new void Update()
- {
- gun.transform.localRotation = Quaternion.Slerp(gun.transform.localRotation, Quaternion.identity, Time.deltaTime * 5);
- gun.transform.localPosition = Vector3.Lerp(gun.transform.localPosition, Vector3.zero, Time.deltaTime * 5);
- if (controllerEvents)
- {
- var pressure = (maxTriggerSqueeze * controllerEvents.GetTriggerAxis()) - minTriggerSqueeze;
- trigger.transform.localEulerAngles = new Vector3(0f, -pressure, 0f);
- }
- else
- {
- trigger.transform.localEulerAngles = new Vector3(0f, minTriggerSqueeze, 0f);
- }
- }
- private void shoot()
- {
- Transform shellTransform = Instantiate(shell, transform.position, transform.rotation);
- shellTransform.Translate(new Vector3(0.03f, 0.05f, 0), Space.Self);
- IgnoreSlideColliders(shellTransform.GetComponents<Collider>());
- shellTransform.GetComponent<Rigidbody>().AddRelativeForce(new Vector3(20f, 150f, 100f));
- source.PlayOneShot(gunShotSound, gunShotVolume);
- foreach (AnimationState state in firingAnimation)
- {
- state.speed = animationSpeed;
- }
- firingAnimation.Play();
- AddRecoil();
- DecreaseAmmo(1);
- }
- public override void Grabbed(VRTK_InteractGrab currentGrabbingObject)
- {
- base.Grabbed(currentGrabbingObject);
- controllerEvents = currentGrabbingObject.GetComponent<VRTK_ControllerEvents>();
- controllerEvents.TouchpadPressed += dropMag;
- ToggleSlide(true);
- ToggleCollision(GetComponent<Rigidbody>(), GetComponent<Collider>(), false);
- //Limit hands grabbing when picked up
- if (VRTK_DeviceFinder.GetControllerHand(currentGrabbingObject.controllerEvents.gameObject) == SDK_BaseController.ControllerHand.Left)
- {
- allowedTouchControllers = AllowedController.LeftOnly;
- allowedUseControllers = AllowedController.LeftOnly;
- slide.allowedGrabControllers = AllowedController.RightOnly;
- }
- else if (VRTK_DeviceFinder.GetControllerHand(currentGrabbingObject.controllerEvents.gameObject) == SDK_BaseController.ControllerHand.Right)
- {
- allowedTouchControllers = AllowedController.RightOnly;
- allowedUseControllers = AllowedController.RightOnly;
- slide.allowedGrabControllers = AllowedController.LeftOnly;
- }
- }
- public override void Ungrabbed(VRTK_InteractGrab previousGrabbingObject)
- {
- base.Ungrabbed(previousGrabbingObject);
- controllerEvents.TouchpadPressed -= dropMag;
- ToggleCollision(GetComponent<Rigidbody>(), GetComponent<Collider>(), true);
- ToggleSlide(false);
- //Unlimit hands
- allowedTouchControllers = AllowedController.Both;
- allowedUseControllers = AllowedController.Both;
- slide.allowedGrabControllers = AllowedController.Both;
- controllerEvents = null;
- }
- private void AddRecoil()
- {
- gun.transform.RotateAround(GetGrabbingObject().transform.position, transform.forward, -kickup);
- Vector3 localPos = gun.transform.localPosition;
- localPos.x -= kickback;
- gun.transform.localPosition = localPos;
- }
- public void dropMag(object sender, ControllerInteractionEventArgs e)
- {
- Debug.Log("Drop Mag");
- Rigidbody rb = magazine.GetComponent<Rigidbody>();
- magazine.transform.parent = null;
- rb.isKinematic = false;
- rb.AddRelativeForce(new Vector3(0f, -200f, 0f));
- magazine.GetComponent<Collider>().enabled = true;
- magazine.GetComponent<Magazine>().enabled = false;
- magazine = null;
- }
- public void DecreaseAmmo(int amount)
- {
- if (magazine == null) return;
- Magazine magazineScript = magazine.GetComponent<Magazine>();
- magazineScript.DecreaseAmmo(amount);
- }
- public int GetAmmo()
- {
- if (magazine == null) return 0;
- Magazine magazineScript = magazine.GetComponent<Magazine>();
- return magazineScript.GetAmmo();
- }
- public void IgnoreColliders(Collider[] colliders)
- {
- Collider[] thisColliders = GetComponents<Collider>();
- foreach (Collider collider in colliders)
- {
- foreach (Collider thisCollider in thisColliders)
- {
- Physics.IgnoreCollision(collider, thisCollider, true);
- }
- }
- }
- public void IgnoreColliders(Collider[] colliders, Collider[] thisColliders)
- {
- foreach (Collider collider in colliders)
- {
- foreach (Collider thisCollider in thisColliders)
- {
- Physics.IgnoreCollision(collider, thisCollider, true);
- }
- }
- }
- public void IgnoreSlideColliders(Collider[] colliders)
- {
- Collider[] thisColliders = slide.GetComponents<Collider>();
- foreach (Collider collider in colliders)
- {
- foreach (Collider thisCollider in thisColliders)
- {
- Physics.IgnoreCollision(collider, thisCollider, true);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement