112 lines
3.4 KiB
C#
112 lines
3.4 KiB
C#
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<RawImage>();
|
||
// 步骤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<Camera>();
|
||
layerMask = 1 << LayerMask.NameToLayer("Split_Normal");
|
||
// 步骤3:生成射线
|
||
}
|
||
else if (hoveredObject.name == "玉米RawImage")
|
||
{
|
||
Debug.Log("我进玉米了");
|
||
renderCamera = GameObject.Find("Camera_Disease").GetComponent<Camera>();
|
||
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<HighlightEffect>();
|
||
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
|
||
);
|
||
}
|
||
}
|