XRPokeFollowTransform.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // /******************************************************************************
  2. // * File: XRPokeFollowTransform.cs
  3. // * Copyright (c) 2023 Qualcomm Technologies, Inc. and/or its subsidiaries. All rights reserved.
  4. // *
  5. // *
  6. // ******************************************************************************/
  7. using UnityEngine.XR.Interaction.Toolkit.AffordanceSystem.State;
  8. using UnityEngine.XR.Interaction.Toolkit.Filtering;
  9. using UnityEngine;
  10. namespace QCHT.Samples.XRKeyboard
  11. {
  12. public class XRPokeFollowTransform : MonoBehaviour
  13. {
  14. [SerializeField] private Transform _followTransform;
  15. [SerializeField] private float _smoothSpeed = 9f;
  16. [SerializeField] private float _maxDistance = 20f;
  17. private Vector3 _initPos;
  18. private Vector3 _targetPos;
  19. private IPokeStateDataProvider _pokeStateDataProvider;
  20. private void Awake() => _pokeStateDataProvider = GetComponentInParent<IPokeStateDataProvider>();
  21. private void Start()
  22. {
  23. if (_followTransform == null)
  24. return;
  25. _initPos = _followTransform.localPosition;
  26. _pokeStateDataProvider.pokeStateData.SubscribeAndUpdate(OnPokeDataUpdated);
  27. }
  28. private void LateUpdate()
  29. {
  30. UpdateTransformPosition();
  31. }
  32. private void UpdateTransformPosition()
  33. {
  34. _followTransform.localPosition =
  35. SmoothPosition(_followTransform.localPosition, _targetPos);
  36. }
  37. private Vector3 SmoothPosition(Vector3 initPos, Vector3 targetPos)
  38. {
  39. var interpolateTime = Time.deltaTime * _smoothSpeed;
  40. return Vector3.Lerp(initPos, targetPos, interpolateTime);
  41. }
  42. private void OnPokeDataUpdated(PokeStateData data)
  43. {
  44. var pokeTransform = data.target;
  45. var hasToFollowPoke = pokeTransform != null && pokeTransform.IsChildOf(transform);
  46. if (hasToFollowPoke)
  47. {
  48. var position = pokeTransform.InverseTransformPoint(data.axisAlignedPokeInteractionPoint);
  49. var maxDistanceReached = position.sqrMagnitude > Mathf.Sqrt(_maxDistance);
  50. if (maxDistanceReached)
  51. position = Vector3.ClampMagnitude(position, _maxDistance);
  52. _targetPos = position;
  53. }
  54. else
  55. _targetPos = _initPos;
  56. }
  57. }
  58. }