using UnityEngine; /// /// 挂在每个 ping 对象上。蓝色圆环闪烁描边,两步点击: /// 1. 第一次点击 → 停止闪烁,显示 ping 模型 /// 2. 第二次点击 → 显示对应 chanrao,隐藏自己,激活下个 ping /// 点击通知 StepManager 记录步骤。 /// public class PingClickHandler : MonoBehaviour { public GameObject chanraoObject; public GameObject nextPing; public int pingIndex; // ping.004=0, ping.003=1, ping.002=2, ping.001=3 private MeshRenderer _meshRenderer; private LineRenderer _outlineRenderer; private bool _clickedOnce; void Start() { _meshRenderer = GetComponent(); if (_meshRenderer == null) _meshRenderer = GetComponentInChildren(); CreateBlueOutline(); StartCoroutine(BlinkOutline()); } void OnEnable() { _meshRenderer = GetComponent(); if (_meshRenderer == null) _meshRenderer = GetComponentInChildren(); if (_meshRenderer != null) _meshRenderer.enabled = false; // 初始隐藏模型,只留描边 CreateBlueOutline(); _clickedOnce = false; StopAllCoroutines(); StartCoroutine(BlinkOutline()); } void CreateBlueOutline() { if (_outlineRenderer != null) return; var ringGo = new GameObject("BlueRing"); ringGo.transform.SetParent(transform, false); ringGo.transform.localPosition = Vector3.zero; ringGo.transform.localRotation = Quaternion.Euler(90f, 0, 0); _outlineRenderer = ringGo.AddComponent(); _outlineRenderer.useWorldSpace = false; _outlineRenderer.loop = true; _outlineRenderer.startWidth = 0.04f; _outlineRenderer.endWidth = 0.04f; _outlineRenderer.material = new Material(Shader.Find("Unlit/Color")); _outlineRenderer.material.color = new Color(0.2f, 0.5f, 1f); _outlineRenderer.startColor = new Color(0.2f, 0.5f, 1f); _outlineRenderer.endColor = new Color(0.2f, 0.5f, 1f); float r = 0.25f; int segs = 32; _outlineRenderer.positionCount = segs; for (int i = 0; i < segs; i++) { float a = i * 2f * Mathf.PI / segs; _outlineRenderer.SetPosition(i, new Vector3(Mathf.Cos(a) * r, Mathf.Sin(a) * r, 0)); } } System.Collections.IEnumerator BlinkOutline() { while (true) { if (_outlineRenderer != null) _outlineRenderer.enabled = !_outlineRenderer.enabled; yield return new WaitForSeconds(0.4f); } } void OnMouseDown() { if (!_clickedOnce) { // 第一次点击:停止闪烁,显示模型 _clickedOnce = true; StopAllCoroutines(); if (_meshRenderer != null) _meshRenderer.enabled = true; if (_outlineRenderer != null) _outlineRenderer.enabled = true; Debug.Log($"[PingClick] {name} 第一次点击,模型显示"); } else { // 第二次点击:显示 chanrao,隐藏自己,激活下个 ping if (chanraoObject != null) { chanraoObject.SetActive(true); Debug.Log($"[PingClick] {chanraoObject.name} 已显示"); } StopAllCoroutines(); if (_meshRenderer != null) _meshRenderer.enabled = false; if (_outlineRenderer != null) _outlineRenderer.enabled = false; gameObject.SetActive(false); if (nextPing != null) { nextPing.SetActive(true); Debug.Log($"[PingClick] {name} → {nextPing.name} 已激活"); } } // 通知 StepManager var sm = FindObjectOfType(); if (sm != null) sm.RecordPingStep(pingIndex, _clickedOnce); } /// 上一步撤销:恢复到first-click状态 public void UndoSecondClick() { if (!_clickedOnce) return; _clickedOnce = false; gameObject.SetActive(true); if (_meshRenderer != null) _meshRenderer.enabled = false; StopAllCoroutines(); StartCoroutine(BlinkOutline()); } /// 上一步撤销:隐藏自己,恢复前一个ping public void UndoShow() { gameObject.SetActive(false); } }