Chocolade19721309

Untitled

May 1st, 2024
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.50 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using Unity.VisualScripting;
  3. using UnityEngine;
  4. using UnityEngine.Animations.Rigging;
  5.  
  6. public class LookAtTarget : MonoBehaviour
  7. {
  8. public List<Transform> lookObjects = new List<Transform>();
  9. public float weightDamping = 1.5f;
  10. public float rotationSpeed = 5f;
  11. public bool fingerPointing = true;
  12.  
  13. private InteractableItem interactableItem;
  14. private Animator animator;
  15. private Transform lastPrimaryTarget;
  16. private float finalLookWeight = 0;
  17. private bool transitionToNextTarget = false;
  18. private Quaternion restRotation;
  19.  
  20. public Transform eyeLeft; // Assign rig_eye.L in the inspector
  21. public Transform eyeRight; // Assign rig_eye.R in the inspector
  22. public Transform finger; // Assign the finger bone in the inspector
  23.  
  24. private LineRenderer leftEyeLineRenderer;
  25. private LineRenderer rightEyeLineRenderer;
  26. private LineRenderer fingerLineRenderer;
  27. private float LayerWeightTarget = 0;
  28. private float CurrentLayerWeight = 0;
  29. private int layerIndex = 0;
  30.  
  31. void Start()
  32. {
  33. animator = GetComponent<Animator>();
  34. restRotation = transform.rotation;
  35. lastPrimaryTarget = null;
  36.  
  37. // Initialize and set up the LineRenderers for the eyes and finger
  38. leftEyeLineRenderer = eyeLeft.gameObject.AddComponent<LineRenderer>();
  39. rightEyeLineRenderer = eyeRight.gameObject.AddComponent<LineRenderer>();
  40. fingerLineRenderer = finger.gameObject.AddComponent<LineRenderer>();
  41.  
  42. SetUpLineRenderer(leftEyeLineRenderer, Color.yellow);
  43. SetUpLineRenderer(rightEyeLineRenderer, Color.yellow);
  44. SetUpLineRenderer(fingerLineRenderer, Color.blue);
  45.  
  46. // Initially disable the LineRenderers
  47. leftEyeLineRenderer.enabled = false;
  48. rightEyeLineRenderer.enabled = false;
  49. fingerLineRenderer.enabled = false;
  50. }
  51.  
  52. private void Update()
  53. {
  54. // Determine if the character should be pointing
  55. bool shouldPoint = lastPrimaryTarget != null && fingerPointing;
  56. LayerWeightTarget = shouldPoint ? 1.0f : 0.0f;
  57.  
  58. // Update the current layer weight towards the target weight
  59. if (Mathf.Abs(CurrentLayerWeight - LayerWeightTarget) > 0.01f) // Adding a threshold to prevent continuous updates
  60. {
  61. CurrentLayerWeight += (LayerWeightTarget - CurrentLayerWeight) * 0.125f; // Smoothing the transition
  62. animator.SetLayerWeight(layerIndex, CurrentLayerWeight);
  63. }
  64. }
  65.  
  66. private void SetUpLineRenderer(LineRenderer lineRenderer, Color color)
  67. {
  68. // Create a simple unlit material that supports vertex colors
  69. Material lineMaterial = new Material(Shader.Find("Sprites/Default"));
  70. lineRenderer.material = lineMaterial;
  71.  
  72. lineRenderer.startColor = color;
  73. lineRenderer.endColor = color;
  74. lineRenderer.startWidth = 0.01f;
  75. lineRenderer.endWidth = 0.01f;
  76. }
  77.  
  78. void OnAnimatorIK()
  79. {
  80. Transform primaryTarget = null;
  81. float closestDistance = float.MaxValue;
  82.  
  83. foreach (Transform target in lookObjects)
  84. {
  85. Vector3 toTarget = target.position - transform.position;
  86. float distance = toTarget.sqrMagnitude;
  87. if (distance < closestDistance && IsTargetVisible(target))
  88. {
  89. closestDistance = distance;
  90. primaryTarget = target;
  91. interactableItem = target.GetComponent<InteractableItem>();
  92. }
  93. }
  94.  
  95. animator.SetBool("Pointing", true);
  96. ManageLookTransition(primaryTarget);
  97.  
  98.  
  99. if (!fingerPointing && animator.GetBool("Pointing"))
  100. {
  101. animator.SetBool("Pointing", false);
  102. }
  103. }
  104.  
  105. private bool IsTargetVisible(Transform target)
  106. {
  107. Vector3 toTarget = (target.position - transform.position).normalized;
  108. float dotProduct = Vector3.Dot(transform.forward, toTarget);
  109. return dotProduct > 0;
  110. }
  111.  
  112. private void ManageLookTransition(Transform primaryTarget)
  113. {
  114. // If we have a primary target...
  115. if (primaryTarget != null)
  116. {
  117. // Enable the LineRenderers for the eyes
  118. leftEyeLineRenderer.enabled = true;
  119. rightEyeLineRenderer.enabled = true;
  120.  
  121. // Draw lines from the eyes to the target
  122. leftEyeLineRenderer.SetPosition(0, eyeLeft.position);
  123. leftEyeLineRenderer.SetPosition(1, primaryTarget.position);
  124. rightEyeLineRenderer.SetPosition(0, eyeRight.position);
  125. rightEyeLineRenderer.SetPosition(1, primaryTarget.position);
  126.  
  127. // Manage pointing state and animation
  128. if (fingerPointing)
  129. {
  130. // Ensure the Pointing layer is fully influencing the character's animation
  131. animator.SetLayerWeight(1, 1.0f); // Assuming layer 1 is the Pointing layer
  132. animator.SetBool("Pointing", true);
  133.  
  134. // Enable and draw the line from the finger to the target
  135. fingerLineRenderer.enabled = true;
  136. fingerLineRenderer.SetPosition(0, finger.position);
  137. fingerLineRenderer.SetPosition(1, primaryTarget.position);
  138. }
  139.  
  140. // Update and display text from the new target
  141. UpdateInteractableDisplay(primaryTarget);
  142.  
  143. // Update the last primary target
  144. lastPrimaryTarget = primaryTarget;
  145.  
  146. // Smoothly blend the look at weight.
  147. finalLookWeight = Mathf.Lerp(finalLookWeight, 1f, Time.deltaTime * weightDamping);
  148. animator.SetLookAtWeight(finalLookWeight, finalLookWeight * .75f, 1f);
  149. animator.SetLookAtPosition(primaryTarget.position);
  150. }
  151. else
  152. {
  153. // Disable LineRenderers and pointing animation
  154. DisablePointingState();
  155.  
  156. // If we don't have a primary target, disable the LineRenderers
  157. leftEyeLineRenderer.enabled = false;
  158. rightEyeLineRenderer.enabled = false;
  159. fingerLineRenderer.enabled = false;
  160.  
  161. // If we don't have a primary target and we were pointing...
  162. if (animator.GetBool("Pointing"))
  163. {
  164. // ... then stop pointing and hide the text.
  165. animator.SetBool("Pointing", false);
  166. UIManager.Instance.HideInteractableText();
  167. }
  168.  
  169. // If the look weight is greater than 0, or we are transitioning to the next target...
  170. if (finalLookWeight > 0f || transitionToNextTarget)
  171. {
  172. // ... then blend the look weight back to 0.
  173. finalLookWeight = Mathf.Lerp(finalLookWeight, 0f, Time.deltaTime * weightDamping);
  174. animator.SetLookAtWeight(finalLookWeight, finalLookWeight * .75f, 1f);
  175.  
  176. // If the last primary target is still set, update the look at position.
  177. if (lastPrimaryTarget != null)
  178. {
  179. animator.SetLookAtPosition(lastPrimaryTarget.position);
  180. }
  181. }
  182.  
  183. // If we are in the middle of a transition...
  184. if (transitionToNextTarget)
  185. {
  186. // ... then slerp back to the rest rotation.
  187. transform.rotation = Quaternion.Slerp(transform.rotation, restRotation, rotationSpeed * Time.deltaTime);
  188.  
  189. // If we're close to the rest rotation...
  190. if (Quaternion.Angle(transform.rotation, restRotation) < 1f)
  191. {
  192. // ... end the transition and clear the last primary target.
  193. transitionToNextTarget = false;
  194. lastPrimaryTarget = null;
  195. }
  196. }
  197. }
  198. }
  199.  
  200. private void UpdateInteractableDisplay(Transform target)
  201. {
  202. InteractableItem interactable = target.GetComponent<InteractableItem>();
  203. if (interactable != null)
  204. {
  205. UIManager.Instance.ShowInteractableText(interactable.displayText);
  206. }
  207. }
  208.  
  209. private void DisablePointingState()
  210. {
  211. leftEyeLineRenderer.enabled = false;
  212. rightEyeLineRenderer.enabled = false;
  213. fingerLineRenderer.enabled = false;
  214. UIManager.Instance.HideInteractableText();
  215.  
  216. // Turn off the pointing animations
  217. animator.SetBool("Pointing", false);
  218. animator.SetLayerWeight(1, 0.0f); // Reduce the Pointing layer's influence
  219. }
  220. }
Advertisement
Add Comment
Please, Sign In to add comment