namespace VRTK.Examples
|
|
{
|
|
using UnityEngine;
|
|
|
|
public class RealGun : VRTK_InteractableObject
|
|
{
|
|
public float bulletSpeed = 200f;
|
|
public float bulletLife = 5f;
|
|
|
|
private GameObject bullet;
|
|
private GameObject trigger;
|
|
private RealGun_Slide slide;
|
|
private RealGun_SafetySwitch safetySwitch;
|
|
|
|
private Rigidbody slideRigidbody;
|
|
private Collider slideCollider;
|
|
private Rigidbody safetySwitchRigidbody;
|
|
private Collider safetySwitchCollider;
|
|
|
|
private VRTK_ControllerEvents controllerEvents;
|
|
|
|
private float minTriggerRotation = -10f;
|
|
private float maxTriggerRotation = 45f;
|
|
|
|
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;
|
|
ToggleCollision(slideRigidbody, slideCollider, state);
|
|
}
|
|
|
|
private void ToggleSafetySwitch(bool state)
|
|
{
|
|
if (!state)
|
|
{
|
|
safetySwitch.ForceStopInteracting();
|
|
}
|
|
ToggleCollision(safetySwitchRigidbody, safetySwitchCollider, state);
|
|
}
|
|
|
|
public override void Grabbed(VRTK_InteractGrab currentGrabbingObject)
|
|
{
|
|
base.Grabbed(currentGrabbingObject);
|
|
|
|
controllerEvents = currentGrabbingObject.GetComponent<VRTK_ControllerEvents>();
|
|
|
|
ToggleSlide(true);
|
|
ToggleSafetySwitch(true);
|
|
|
|
//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;
|
|
safetySwitch.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;
|
|
safetySwitch.allowedGrabControllers = AllowedController.LeftOnly;
|
|
}
|
|
}
|
|
|
|
public override void Ungrabbed(VRTK_InteractGrab previousGrabbingObject)
|
|
{
|
|
base.Ungrabbed(previousGrabbingObject);
|
|
|
|
ToggleSlide(false);
|
|
ToggleSafetySwitch(false);
|
|
|
|
//Unlimit hands
|
|
allowedTouchControllers = AllowedController.Both;
|
|
allowedUseControllers = AllowedController.Both;
|
|
slide.allowedGrabControllers = AllowedController.Both;
|
|
safetySwitch.allowedGrabControllers = AllowedController.Both;
|
|
|
|
controllerEvents = null;
|
|
}
|
|
|
|
public override void StartUsing(VRTK_InteractUse currentUsingObject)
|
|
{
|
|
base.StartUsing(currentUsingObject);
|
|
if (safetySwitch.safetyOff)
|
|
{
|
|
slide.Fire();
|
|
FireBullet();
|
|
VRTK_ControllerHaptics.TriggerHapticPulse(VRTK_ControllerReference.GetControllerReference(controllerEvents.gameObject), 0.63f, 0.2f, 0.01f);
|
|
}
|
|
else
|
|
{
|
|
VRTK_ControllerHaptics.TriggerHapticPulse(VRTK_ControllerReference.GetControllerReference(controllerEvents.gameObject), 0.08f, 0.1f, 0.01f);
|
|
}
|
|
}
|
|
|
|
protected override void Awake()
|
|
{
|
|
base.Awake();
|
|
bullet = transform.Find("Bullet").gameObject;
|
|
bullet.SetActive(false);
|
|
|
|
trigger = transform.Find("TriggerHolder").gameObject;
|
|
|
|
slide = transform.Find("Slide").GetComponent<RealGun_Slide>();
|
|
slideRigidbody = slide.GetComponent<Rigidbody>();
|
|
slideCollider = slide.GetComponent<Collider>();
|
|
|
|
safetySwitch = transform.Find("SafetySwitch").GetComponent<RealGun_SafetySwitch>();
|
|
safetySwitchRigidbody = safetySwitch.GetComponent<Rigidbody>();
|
|
safetySwitchCollider = safetySwitch.GetComponent<Collider>();
|
|
}
|
|
|
|
protected override void Update()
|
|
{
|
|
base.Update();
|
|
if (controllerEvents)
|
|
{
|
|
var pressure = (maxTriggerRotation * controllerEvents.GetTriggerAxis()) - minTriggerRotation;
|
|
trigger.transform.localEulerAngles = new Vector3(0f, pressure, 0f);
|
|
}
|
|
else
|
|
{
|
|
trigger.transform.localEulerAngles = new Vector3(0f, minTriggerRotation, 0f);
|
|
}
|
|
}
|
|
|
|
private void FireBullet()
|
|
{
|
|
GameObject bulletClone = Instantiate(bullet, bullet.transform.position, bullet.transform.rotation) as GameObject;
|
|
bulletClone.SetActive(true);
|
|
Rigidbody rb = bulletClone.GetComponent<Rigidbody>();
|
|
rb.AddForce(bullet.transform.forward * bulletSpeed);
|
|
Destroy(bulletClone, bulletLife);
|
|
}
|
|
}
|
|
}
|