8 using System.Collections;
9 using System.Collections.Generic;
10 using System.Collections.ObjectModel;
11 using UnityEngine.Events;
16 namespace Valve.VR.InteractionSystem
19 [RequireComponent( typeof( Interactable ) )]
30 CreatePreviewObject();
36 private bool useItemPackagePreview =
true;
37 private bool useFadedPreview =
false;
38 private GameObject previewObject;
40 public bool requireTriggerPressToTake =
false;
41 public bool requireTriggerPressToReturn =
false;
42 public bool showTriggerHint =
false;
45 public Hand.AttachmentFlags attachmentFlags = Hand.defaultAttachmentFlags;
46 public string attachmentPoint;
48 public bool takeBackItem =
false;
50 public bool acceptDifferentItems =
false;
52 private GameObject spawnedItem;
53 private bool itemIsSpawned =
false;
55 public UnityEvent pickupEvent;
56 public UnityEvent dropEvent;
58 public bool justPickedUpItem =
false;
62 private void CreatePreviewObject()
64 if ( !useItemPackagePreview )
71 if ( useItemPackagePreview )
73 if ( itemPackage == null )
78 if ( useFadedPreview ==
false )
80 if ( itemPackage.previewPrefab != null )
82 previewObject = Instantiate( itemPackage.previewPrefab, transform.position, Quaternion.identity ) as GameObject;
83 previewObject.transform.parent = transform;
84 previewObject.transform.localRotation = Quaternion.identity;
89 if ( itemPackage.fadedPreviewPrefab != null )
91 previewObject = Instantiate( itemPackage.fadedPreviewPrefab, transform.position, Quaternion.identity ) as GameObject;
92 previewObject.transform.parent = transform;
93 previewObject.transform.localRotation = Quaternion.identity;
108 private void VerifyItemPackage()
110 if ( itemPackage == null )
112 ItemPackageNotValid();
115 if ( itemPackage.itemPrefab == null )
117 ItemPackageNotValid();
123 private void ItemPackageNotValid()
125 Debug.LogError(
"ItemPackage assigned to " + gameObject.name +
" is not valid. Destroying this game object." );
126 Destroy( gameObject );
131 private void ClearPreview()
133 foreach ( Transform child
in transform )
137 GameObject.Destroy( child.gameObject );
141 GameObject.DestroyImmediate( child.gameObject );
150 if ( ( itemIsSpawned ==
true ) && ( spawnedItem == null ) )
152 itemIsSpawned =
false;
153 useFadedPreview =
false;
155 CreatePreviewObject();
161 private void OnHandHoverBegin(
Hand hand )
163 ItemPackage currentAttachedItemPackage = GetAttachedItemPackage( hand );
165 if ( currentAttachedItemPackage == itemPackage )
167 if ( takeBackItem && !requireTriggerPressToReturn )
169 TakeBackItem( hand );
173 if ( !requireTriggerPressToTake )
175 SpawnAndAttachObject( hand );
178 if ( requireTriggerPressToTake && showTriggerHint )
180 ControllerButtonHints.ShowTextHint( hand, Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger,
"PickUp" );
186 private void TakeBackItem(
Hand hand )
188 RemoveMatchingItemsFromHandStack( itemPackage, hand );
190 if ( itemPackage.packageType ==
ItemPackage.ItemPackageType.TwoHanded )
192 RemoveMatchingItemsFromHandStack( itemPackage, hand.otherHand );
200 GameObject currentAttachedObject = hand.currentAttachedObject;
202 if ( currentAttachedObject == null )
208 if ( packageReference == null )
213 ItemPackage attachedItemPackage = packageReference.itemPackage;
215 return attachedItemPackage;
220 private void HandHoverUpdate(
Hand hand )
222 if ( takeBackItem && requireTriggerPressToReturn )
224 if ( hand.controller != null && hand.controller.GetHairTriggerDown() )
226 ItemPackage currentAttachedItemPackage = GetAttachedItemPackage( hand );
227 if ( currentAttachedItemPackage == itemPackage )
229 TakeBackItem( hand );
235 if ( requireTriggerPressToTake )
237 if ( hand.controller != null && hand.controller.GetHairTriggerDown() )
239 SpawnAndAttachObject( hand );
246 private void OnHandHoverEnd(
Hand hand )
248 if ( !justPickedUpItem && requireTriggerPressToTake && showTriggerHint )
250 ControllerButtonHints.HideTextHint( hand, Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger );
253 justPickedUpItem =
false;
258 private void RemoveMatchingItemsFromHandStack(
ItemPackage package,
Hand hand )
260 for (
int i = 0; i < hand.AttachedObjects.Count; i++ )
263 if ( packageReference != null )
265 ItemPackage attachedObjectItemPackage = packageReference.itemPackage;
266 if ( ( attachedObjectItemPackage != null ) && ( attachedObjectItemPackage == package ) )
268 GameObject detachedItem = hand.AttachedObjects[i].attachedObject;
269 hand.DetachObject( detachedItem );
277 private void RemoveMatchingItemTypesFromHand(
ItemPackage.ItemPackageType packageType,
Hand hand )
279 for (
int i = 0; i < hand.AttachedObjects.Count; i++ )
282 if ( packageReference != null )
284 if ( packageReference.itemPackage.packageType == packageType )
286 GameObject detachedItem = hand.AttachedObjects[i].attachedObject;
287 hand.DetachObject( detachedItem );
295 private void SpawnAndAttachObject(
Hand hand )
297 if ( hand.otherHand != null )
300 ItemPackage otherHandItemPackage = GetAttachedItemPackage( hand.otherHand );
301 if ( otherHandItemPackage == itemPackage )
303 TakeBackItem( hand.otherHand );
307 if ( showTriggerHint )
309 ControllerButtonHints.HideTextHint( hand, Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger );
312 if ( itemPackage.otherHandItemPrefab != null )
314 if ( hand.otherHand.hoverLocked )
322 if ( itemPackage.packageType ==
ItemPackage.ItemPackageType.OneHanded )
324 RemoveMatchingItemTypesFromHand(
ItemPackage.ItemPackageType.OneHanded, hand );
325 RemoveMatchingItemTypesFromHand(
ItemPackage.ItemPackageType.TwoHanded, hand );
326 RemoveMatchingItemTypesFromHand(
ItemPackage.ItemPackageType.TwoHanded, hand.otherHand );
330 if ( itemPackage.packageType ==
ItemPackage.ItemPackageType.TwoHanded )
332 RemoveMatchingItemTypesFromHand(
ItemPackage.ItemPackageType.OneHanded, hand );
333 RemoveMatchingItemTypesFromHand(
ItemPackage.ItemPackageType.OneHanded, hand.otherHand );
334 RemoveMatchingItemTypesFromHand(
ItemPackage.ItemPackageType.TwoHanded, hand );
335 RemoveMatchingItemTypesFromHand(
ItemPackage.ItemPackageType.TwoHanded, hand.otherHand );
338 spawnedItem = GameObject.Instantiate( itemPackage.itemPrefab );
339 spawnedItem.SetActive( true );
340 hand.AttachObject( spawnedItem, attachmentFlags, attachmentPoint );
342 if ( ( itemPackage.otherHandItemPrefab != null ) && ( hand.otherHand.controller != null ) )
344 GameObject otherHandObjectToAttach = GameObject.Instantiate( itemPackage.otherHandItemPrefab );
345 otherHandObjectToAttach.SetActive( true );
346 hand.otherHand.AttachObject( otherHandObjectToAttach, attachmentFlags );
349 itemIsSpawned =
true;
351 justPickedUpItem =
true;
355 useFadedPreview =
true;
356 pickupEvent.Invoke();
357 CreatePreviewObject();