using UnityEngine; // 引入 UnityEngine 命名空间,提供组件、物理、渲染等 API public class SelectEdgeGlow : MonoBehaviour // 声明一个挂在场景物体上的组件类 { public LayerMask pickLayers = ~0; // 可被射线点击的图层集合;~0 表示所有位为 1,等价允许所有图层 public string highlightLayerName = "Highlight"; // 用于高亮渲染的专用图层名,需在 Project Settings → Tags and Layers 里创建 int hlLayer = 6; // 运行时把图层名转换成的图层索引 //Renderer last; // 上一次被选中的 Renderer,用于单选时取消上一个 public GameObject lastObj; public GameObject currentObj; void Start() // Unity 生命周期函数,组件启用的第一帧调用 { } void Update() // 每帧调用,用于处理输入与选择 { if (!Input.GetMouseButtonDown(0)) // 若这一帧没有按下鼠标左键 return; // 直接结束本帧逻辑 var ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 从主相机通过鼠标位置发出一条射线 if (Physics.Raycast(ray, out var hit, 2000f, pickLayers) && hit.collider.CompareTag("Target")) // 做物理射线检测:最大 500 单位,只检测 pickLayers { //var r = hit.collider.GetComponentInParent(); // 从命中的 Collider 向上查找 Renderer,兼容 Collider 在子节点 //if (r != null) // 命中并找到渲染器 //{ // if (last != null && last != r) // 如果之前有选中且不是同一个对象 // SetHighlight(last, false); // 先取消上一个,避免还原用错图层 // SetHighlight(r, true); // 再对当前命中的对象打开高亮 // last = r; // 记录当前为“上一个” //} if (lastObj = null) { currentObj = hit.collider.GetComponent().gameObject; currentObj.layer = 6; } if(lastObj != null) { currentObj = hit.collider.GetComponent().gameObject; currentObj.layer = 6; lastObj.layer = 0; } lastObj = currentObj; } //else // 射线没有命中任何可选对象 //{ // if (last != null) // 若此前有选中 // SetHighlight(last, false); // 关闭它的高亮并还原图层 // last = null; // 清空记录 //} } }