147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace HighlightPlus {
 | |
| 
 | |
| 	public enum TriggerMode {
 | |
| 		ColliderEventsOnlyOnThisObject = 0,
 | |
| 		RaycastOnThisObjectAndChildren = 1
 | |
| 	}
 | |
| 
 | |
| 	public enum RayCastSource {
 | |
| 		MousePosition = 0,
 | |
| 		CameraDirection = 1
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	[RequireComponent (typeof(HighlightEffect))]
 | |
| 	[HelpURL ("https://kronnect.freshdesk.com/support/solutions/42000065090")]
 | |
| 	[ExecuteInEditMode]
 | |
| 	public class HighlightTrigger : MonoBehaviour {
 | |
| 
 | |
| 		[Tooltip ("Used to trigger automatic highlighting including children objects.")]
 | |
| 		public TriggerMode triggerMode = TriggerMode.ColliderEventsOnlyOnThisObject;
 | |
| 		public Camera raycastCamera;
 | |
| 		public RayCastSource raycastSource = RayCastSource.MousePosition;
 | |
| 
 | |
| 		const int MAX_RAYCAST_HITS = 100;
 | |
| 
 | |
| 		[NonSerialized]
 | |
| 		public Collider[] colliders;
 | |
| 		Collider currentCollider;
 | |
| 		static RaycastHit[] hits;
 | |
| 
 | |
| 		void OnEnable () {
 | |
| 			Init ();
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		void Start () {
 | |
| 			if (triggerMode == TriggerMode.RaycastOnThisObjectAndChildren) {
 | |
| 				if (raycastCamera == null) {
 | |
| 					raycastCamera = HighlightManager.GetCamera ();
 | |
| 					if (raycastCamera == null) {
 | |
| 						Debug.LogError ("Highlight Trigger on " + gameObject.name + ": no camera found!");
 | |
| 					}
 | |
| 				}
 | |
| 				if (colliders != null && colliders.Length > 0) {
 | |
| 					hits = new RaycastHit[MAX_RAYCAST_HITS];
 | |
| 					StartCoroutine (DoRayCast ());
 | |
| 				}
 | |
| 			} else {
 | |
| 				Collider collider = GetComponent<Collider> ();
 | |
| 				if (collider == null) {
 | |
| 					if (GetComponent<MeshFilter> () != null) {
 | |
| 						gameObject.AddComponent<MeshCollider> ();
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		IEnumerator DoRayCast () {
 | |
| 			while (triggerMode == TriggerMode.RaycastOnThisObjectAndChildren) {
 | |
| 				if (raycastCamera != null) {
 | |
| 					Ray ray;
 | |
| 					if (raycastSource == RayCastSource.MousePosition) {
 | |
| 						ray = raycastCamera.ScreenPointToRay (Input.mousePosition);
 | |
| 					} else {
 | |
| 						ray = new Ray (raycastCamera.transform.position, raycastCamera.transform.forward);
 | |
| 					}
 | |
| 					int hitCount = Physics.RaycastNonAlloc (ray, hits);
 | |
| 					bool hit = false;
 | |
| 					for (int k = 0; k < hitCount; k++) {
 | |
| 						Collider theCollider = hits [k].collider;
 | |
| 						for (int c = 0; c < colliders.Length; c++) {
 | |
| 							if (colliders [c] == theCollider) {
 | |
| 								hit = true;
 | |
| 								if (theCollider != currentCollider) {
 | |
| 									SwitchCollider (theCollider);
 | |
| 									k = hitCount;
 | |
| 									break;
 | |
| 								}
 | |
| 							}
 | |
| 						}
 | |
| 					}
 | |
| 					if (!hit && currentCollider != null) {
 | |
| 						SwitchCollider (null);
 | |
| 					}
 | |
| 				}
 | |
| 				yield return null;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		void SwitchCollider (Collider newCollider) {
 | |
| 			currentCollider = newCollider;
 | |
| 			if (currentCollider != null) {
 | |
| 				Highlight (true);
 | |
| 			} else {
 | |
| 				Highlight (false);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		void OnMouseDown () {
 | |
|             if (isActiveAndEnabled && triggerMode == TriggerMode.ColliderEventsOnlyOnThisObject) {
 | |
| 				Highlight (true);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		void OnMouseEnter () {
 | |
|             if (isActiveAndEnabled && triggerMode == TriggerMode.ColliderEventsOnlyOnThisObject) {
 | |
| 				Highlight (true);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		void OnMouseExit () {
 | |
|             if (isActiveAndEnabled && triggerMode == TriggerMode.ColliderEventsOnlyOnThisObject) {
 | |
| 				Highlight (false);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		void Highlight (bool state) {
 | |
| 			HighlightEffect hb = transform.GetComponent<HighlightEffect> ();
 | |
| 			if (hb == null && state) {
 | |
| 				hb = gameObject.AddComponent<HighlightEffect> ();
 | |
| 			}
 | |
| 			if (hb != null) {
 | |
| 				hb.SetHighlighted (state);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public void Init() {
 | |
| 			if (raycastCamera == null) {
 | |
| 				raycastCamera = HighlightManager.GetCamera ();
 | |
| 			}
 | |
| 			if (triggerMode == TriggerMode.RaycastOnThisObjectAndChildren) {
 | |
| 				colliders = GetComponentsInChildren<Collider> ();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 	}
 | |
| 
 | |
| } |