9 using System.Collections;
10 using System.Collections.Generic;
12 namespace Valve.VR.InteractionSystem
20 private GameObject currentArrow;
21 public GameObject arrowPrefab;
23 public Transform arrowNockTransform;
25 public float nockDistance = 0.1f;
26 public float lerpCompleteDistance = 0.08f;
27 public float rotationLerpThreshold = 0.15f;
28 public float positionLerpThreshold = 0.15f;
30 private bool allowArrowSpawn =
true;
33 private bool inNockRange =
false;
34 private bool arrowLerpComplete =
false;
40 public int maxArrowCount = 10;
41 private List<GameObject> arrowList;
47 allowTeleport = GetComponent<AllowTeleportWhileAttachedToHand>();
48 allowTeleport.teleportAllowed =
true;
49 allowTeleport.overrideHoverLock =
false;
51 arrowList =
new List<GameObject>();
56 private void OnAttachedToHand(
Hand attachedHand )
64 private GameObject InstantiateArrow()
66 GameObject arrow = Instantiate( arrowPrefab, arrowNockTransform.position, arrowNockTransform.rotation ) as GameObject;
67 arrow.name =
"Bow Arrow";
68 arrow.transform.parent = arrowNockTransform;
69 Util.ResetTransform( arrow.transform );
71 arrowList.Add( arrow );
73 while ( arrowList.Count > maxArrowCount )
75 GameObject oldArrow = arrowList[0];
76 arrowList.RemoveAt( 0 );
88 private void HandAttachedUpdate(
Hand hand )
100 if ( allowArrowSpawn && ( currentArrow == null ) )
102 currentArrow = InstantiateArrow();
103 arrowSpawnSound.Play();
106 float distanceToNockPosition = Vector3.Distance( transform.parent.position, bow.nockTransform.position );
112 if ( distanceToNockPosition < rotationLerpThreshold )
114 float lerp = Util.RemapNumber( distanceToNockPosition, rotationLerpThreshold, lerpCompleteDistance, 0, 1 );
116 arrowNockTransform.rotation = Quaternion.Lerp( arrowNockTransform.parent.rotation, bow.nockRestTransform.rotation, lerp );
120 arrowNockTransform.localRotation = Quaternion.identity;
124 if ( distanceToNockPosition < positionLerpThreshold )
126 float posLerp = Util.RemapNumber( distanceToNockPosition, positionLerpThreshold, lerpCompleteDistance, 0, 1 );
128 posLerp = Mathf.Clamp( posLerp, 0f, 1f );
130 arrowNockTransform.position = Vector3.Lerp( arrowNockTransform.parent.position, bow.nockRestTransform.position, posLerp );
134 arrowNockTransform.position = arrowNockTransform.parent.position;
139 if ( distanceToNockPosition < lerpCompleteDistance )
141 if ( !arrowLerpComplete )
143 arrowLerpComplete =
true;
144 hand.controller.TriggerHapticPulse( 500 );
149 if ( arrowLerpComplete )
151 arrowLerpComplete =
false;
156 if ( distanceToNockPosition < nockDistance )
161 bow.ArrowInPosition();
173 if ( ( distanceToNockPosition < nockDistance ) && hand.controller.GetPress( SteamVR_Controller.ButtonMask.Trigger ) && !nocked )
175 if ( currentArrow == null )
177 currentArrow = InstantiateArrow();
181 bow.StartNock( this );
182 hand.HoverLock( GetComponent<Interactable>() );
183 allowTeleport.teleportAllowed =
false;
184 currentArrow.transform.parent = bow.nockTransform;
185 Util.ResetTransform( currentArrow.transform );
186 Util.ResetTransform( arrowNockTransform );
192 if ( nocked && ( !hand.controller.GetPress(
SteamVR_Controller.ButtonMask.Trigger ) || hand.controller.GetPressUp( SteamVR_Controller.ButtonMask.Trigger ) ) )
200 arrowNockTransform.rotation = currentArrow.transform.rotation;
201 currentArrow.transform.parent = arrowNockTransform;
202 Util.ResetTransform( currentArrow.transform );
205 hand.HoverUnlock( GetComponent<Interactable>() );
206 allowTeleport.teleportAllowed =
true;
209 bow.StartRotationLerp();
215 private void OnDetachedFromHand(
Hand hand )
217 Destroy( gameObject );
222 private void FireArrow()
224 currentArrow.transform.parent = null;
226 Arrow arrow = currentArrow.GetComponent<
Arrow>();
227 arrow.shaftRB.isKinematic =
false;
228 arrow.shaftRB.useGravity =
true;
229 arrow.shaftRB.transform.GetComponent<BoxCollider>().enabled =
true;
231 arrow.arrowHeadRB.isKinematic =
false;
232 arrow.arrowHeadRB.useGravity =
true;
233 arrow.arrowHeadRB.transform.GetComponent<BoxCollider>().enabled =
true;
235 arrow.arrowHeadRB.AddForce( currentArrow.transform.forward * bow.GetArrowVelocity(), ForceMode.VelocityChange );
236 arrow.arrowHeadRB.AddTorque( currentArrow.transform.forward * 10 );
240 currentArrow.GetComponent<
Arrow>().ArrowReleased( bow.GetArrowVelocity() );
243 allowArrowSpawn =
false;
244 Invoke(
"EnableArrowSpawn", 0.5f );
245 StartCoroutine( ArrowReleaseHaptics() );
248 allowTeleport.teleportAllowed =
true;
253 private void EnableArrowSpawn()
255 allowArrowSpawn =
true;
260 private IEnumerator ArrowReleaseHaptics()
262 yield
return new WaitForSeconds( 0.05f );
264 hand.otherHand.controller.TriggerHapticPulse( 1500 );
265 yield
return new WaitForSeconds( 0.05f );
267 hand.otherHand.controller.TriggerHapticPulse( 800 );
268 yield
return new WaitForSeconds( 0.05f );
270 hand.otherHand.controller.TriggerHapticPulse( 500 );
271 yield
return new WaitForSeconds( 0.05f );
273 hand.otherHand.controller.TriggerHapticPulse( 300 );
278 private void OnHandFocusLost(
Hand hand )
280 gameObject.SetActive( false );
285 private void OnHandFocusAcquired(
Hand hand )
287 gameObject.SetActive( true );
292 private void FindBow()
294 bow = hand.otherHand.GetComponentInChildren<
Longbow>();