using HighlightPlus; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class RawImageScript_SC : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerMoveHandler { //正常植株和病株对比面板 public UI_PlantComparisonPanel rextualPanel; public RawImage targetRawImage; HighlightEffect _highlight = null; public void OnPointerEnter(PointerEventData eventData) { } public void OnPointerMove(PointerEventData eventData) { GameObject hoveredObject = eventData.pointerEnter; RawImage rawImage = this.GetComponent(); // 步骤1:转换为RawImage局部坐标 RectTransformUtility.ScreenPointToLocalPointInRectangle( targetRawImage.rectTransform, Input.mousePosition, null, out Vector2 localPos); Vector2 uv = CalculateUV(localPos); if (uv.x < 0 || uv.x > 1 || uv.y < 0 || uv.y > 1) return; Camera renderCamera = null; int layerMask = 0; if (hoveredObject.name == "高粱RawImage") { Debug.Log("我进高粱了"); renderCamera = GameObject.Find("Camera_Normal").GetComponent(); layerMask = 1 << LayerMask.NameToLayer("Split_Normal"); // 步骤3:生成射线 } else if (hoveredObject.name == "玉米RawImage") { Debug.Log("我进玉米了"); renderCamera = GameObject.Find("Camera_Disease").GetComponent(); layerMask = 1 << LayerMask.NameToLayer("Split_Disease"); } else { renderCamera = Camera.main; layerMask = 1 << LayerMask.NameToLayer("Default"); } Ray ray = renderCamera.ViewportPointToRay(uv); if (Physics.Raycast(ray, out RaycastHit hit, renderCamera.farClipPlane, layerMask)) { Debug.Log($"选中物体:{hit.collider.name}", hit.collider.gameObject); if (_highlight != null) { _highlight.SetHighlighted(false); _highlight = null; } _highlight = hit.collider.gameObject.GetComponent(); if (_highlight != null) { _highlight.SetHighlighted(true); rextualPanel.showPlantPartOnRawImage(hit.collider.gameObject); } } else { if (_highlight != null) { _highlight.SetHighlighted(false); _highlight = null; } } } public void OnPointerExit(PointerEventData eventData) { GameObject hoveredObject = eventData.pointerEnter; if (hoveredObject.name == "正常高粱") { Debug.Log("我退出正常了"); } else if (hoveredObject.name == "病株") { Debug.Log("我退出病株了"); } } private Vector2 CalculateUV(Vector2 localPos) { Rect rect = targetRawImage.rectTransform.rect; // 处理不同锚点模式 Vector2 pivot = targetRawImage.rectTransform.pivot; Vector2 offset = new Vector2( localPos.x + rect.width * pivot.x, localPos.y + rect.height * pivot.y ); return new Vector2( offset.x / rect.width, offset.y / rect.height ); } }