diff --git a/Assets/Scripts/Interaction/ChanraoTuibuHandler.cs b/Assets/Scripts/Interaction/ChanraoTuibuHandler.cs
index 6fbff55..f69baa0 100644
--- a/Assets/Scripts/Interaction/ChanraoTuibuHandler.cs
+++ b/Assets/Scripts/Interaction/ChanraoTuibuHandler.cs
@@ -1,73 +1,45 @@
using UnityEngine;
-///
-/// 挂在 chanraotuibu 对象上。蓝色矩形闪烁描边,点击显示模型并激活下个对象(ping.004)。
-///
public class ChanraoTuibuHandler : MonoBehaviour
{
public GameObject nextObject;
-
- private MeshRenderer _meshRenderer;
- private LineRenderer _outlineRenderer;
+ private MeshRenderer _modelRenderer, _outlineMesh;
void OnEnable()
{
- _meshRenderer = GetComponent();
- if (_meshRenderer == null) _meshRenderer = GetComponentInChildren();
- // 隐藏所有子级 Renderer(包括 inactive 子级,确保模型不可见)
- var allRends = GetComponentsInChildren(true);
- foreach (var r in allRends) r.enabled = false;
- // 确保有大号可点击 collider
- var col = GetComponent();
- if (col == null) { var sc = gameObject.AddComponent(); sc.radius = 0.5f; }
- CreateBlueOutline();
+ _modelRenderer = GetComponent();
+ if (_modelRenderer == null) _modelRenderer = GetComponentInChildren();
+ foreach (var r in GetComponentsInChildren(true)) r.enabled = false;
+ if (GetComponent() == null) gameObject.AddComponent().radius = 0.5f;
+ CreateOutlineMesh();
StopAllCoroutines();
StartCoroutine(BlinkOutline());
}
- void CreateBlueOutline()
+ void CreateOutlineMesh()
{
- if (_outlineRenderer != null) return;
- var ringGo = new GameObject("BlueRing");
- ringGo.transform.SetParent(transform, false);
- _outlineRenderer = ringGo.AddComponent();
- _outlineRenderer.useWorldSpace = true;
- _outlineRenderer.loop = true;
- _outlineRenderer.startWidth = 0.015f;
- _outlineRenderer.endWidth = 0.015f;
- _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);
-
- // 基于模型 Bounds 画矩形
- Renderer rend = _meshRenderer;
- if (rend == null) rend = GetComponentInChildren();
- Bounds b;
- if (rend != null) b = rend.bounds;
- else b = new Bounds(transform.position, new Vector3(0.3f, 0.01f, 0.3f));
- // 扩展 20% 让边框包住模型
- Vector3 ctr = b.center;
- Vector3 ext = b.extents * 1.2f;
- float y = b.max.y + 0.08f;
- Vector3 p0 = new Vector3(ctr.x - ext.x, y, ctr.z - ext.z);
- Vector3 p1 = new Vector3(ctr.x - ext.x, y, ctr.z + ext.z);
- Vector3 p2 = new Vector3(ctr.x + ext.x, y, ctr.z + ext.z);
- Vector3 p3 = new Vector3(ctr.x + ext.x, y, ctr.z - ext.z);
- Debug.Log($"[{name}] 边框 bounds: center={ctr} extents={ext} y={y}");
- _outlineRenderer.positionCount = 5;
- _outlineRenderer.SetPosition(0, p0);
- _outlineRenderer.SetPosition(1, p1);
- _outlineRenderer.SetPosition(2, p2);
- _outlineRenderer.SetPosition(3, p3);
- _outlineRenderer.SetPosition(4, p0);
+ if (_outlineMesh != null) return;
+ var mf = GetComponent();
+ if (mf == null) mf = GetComponentInChildren();
+ if (mf == null || mf.sharedMesh == null) return;
+ var mat = new Material(Shader.Find("Custom/OutlineUnlit"));
+ mat.SetColor("_OutlineColor", new Color(0.2f, 0.5f, 1f, 1f));
+ mat.SetColor("_MainColor", new Color(0, 0, 0, 0));
+ mat.SetFloat("_OutlineWidth", 0.03f);
+ var go = new GameObject("Outline");
+ go.transform.SetParent(transform, false);
+ go.AddComponent().sharedMesh = mf.sharedMesh;
+ _outlineMesh = go.AddComponent();
+ _outlineMesh.material = mat;
}
System.Collections.IEnumerator BlinkOutline()
{
+ if (_outlineMesh != null) _outlineMesh.enabled = true;
+ yield return new WaitForSeconds(0.4f);
while (true)
{
- if (_outlineRenderer != null) _outlineRenderer.enabled = !_outlineRenderer.enabled;
+ if (_outlineMesh != null) _outlineMesh.enabled = !_outlineMesh.enabled;
yield return new WaitForSeconds(0.4f);
}
}
@@ -76,10 +48,23 @@ public class ChanraoTuibuHandler : MonoBehaviour
{
Debug.Log($"[ChanraoTuibu] {name} 被点击");
StopAllCoroutines();
- if (_meshRenderer != null) _meshRenderer.enabled = true;
- var allRends2 = GetComponentsInChildren();
- foreach (var r in allRends2) r.enabled = true;
- if (_outlineRenderer != null) _outlineRenderer.enabled = false;
- if (nextObject != null) { nextObject.SetActive(true); Debug.Log($"[ChanraoTuibu] → {nextObject.name} 已激活"); }
+ if (_modelRenderer != null) _modelRenderer.enabled = true;
+ if (_outlineMesh != null) _outlineMesh.enabled = false;
+
+ // 亮起所有 ping 的边框进入第二轮
+ var mi = GameObject.Find("manInjury");
+ if (mi != null)
+ {
+ for (int i = 4; i >= 1; i--)
+ {
+ var pt = mi.transform.Find("ping." + i.ToString("D3"));
+ if (pt != null && pt.gameObject.activeSelf)
+ {
+ var h = pt.gameObject.GetComponent();
+ if (h != null) h.ReEnableBorder();
+ }
+ }
+ Debug.Log("[ChanraoTuibu] ping边框第二轮已亮起");
+ }
}
}
diff --git a/Assets/Scripts/Interaction/PingClickHandler.cs b/Assets/Scripts/Interaction/PingClickHandler.cs
index 16c80d3..73eb5f8 100644
--- a/Assets/Scripts/Interaction/PingClickHandler.cs
+++ b/Assets/Scripts/Interaction/PingClickHandler.cs
@@ -1,183 +1,94 @@
using UnityEngine;
-///
-/// 挂在每个 ping 对象上。蓝色圆环闪烁描边,两阶段点击:
-/// 阶段0: 依次首次点击4个ping显示模型(全部显示后才进入阶段1)
-/// 阶段1: 点击ping显示对应chanrao并隐藏自己
-/// touchArray 点击优先级更高。
-///
public class PingClickHandler : MonoBehaviour
{
- public GameObject chanraoObject;
- public GameObject nextPing;
+ public GameObject chanraoObject, nextPing;
public int pingIndex;
- private MeshRenderer _meshRenderer;
- private LineRenderer _outlineRenderer;
+ private MeshRenderer _modelRenderer, _outlineMesh;
private bool _clickedOnce;
- private static int _firstClickCount = 0;
-
- void Start()
- {
- _meshRenderer = GetComponent();
- if (_meshRenderer == null) _meshRenderer = GetComponentInChildren();
- CreateBlueOutline();
- StartCoroutine(BlinkOutline());
- }
+ private static int _firstClickCount;
void OnEnable()
{
- _meshRenderer = GetComponent();
- if (_meshRenderer == null) _meshRenderer = GetComponentInChildren();
- // 隐藏所有子级 Renderer(包括 inactive 子级)
- var allRends = GetComponentsInChildren(true);
- foreach (var r in allRends) r.enabled = false;
- // 确保有大号可点击 collider
- var col = GetComponent();
- if (col == null) { var sc = gameObject.AddComponent(); sc.radius = 0.5f; }
- CreateBlueOutline();
+ _modelRenderer = GetComponent();
+ if (_modelRenderer == null) _modelRenderer = GetComponentInChildren();
+ if (_modelRenderer != null) _modelRenderer.enabled = false;
+ foreach (var r in GetComponentsInChildren(true)) r.enabled = false;
+ if (GetComponent() == null) gameObject.AddComponent().radius = 0.5f;
+ CreateOutlineMesh();
_clickedOnce = false;
StopAllCoroutines();
StartCoroutine(BlinkOutline());
}
- void CreateBlueOutline()
+ void CreateOutlineMesh()
{
- if (_outlineRenderer != null) return;
- var ringGo = new GameObject("BlueRing");
- ringGo.transform.SetParent(transform, false);
-
- _outlineRenderer = ringGo.AddComponent();
- _outlineRenderer.useWorldSpace = true;
- _outlineRenderer.loop = true;
- _outlineRenderer.startWidth = 0.015f;
- _outlineRenderer.endWidth = 0.015f;
- _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);
-
- // 基于模型 Bounds 画矩形描边
- Bounds b;
- if (_meshRenderer != null) b = _meshRenderer.bounds;
- else b = new Bounds(transform.position, new Vector3(0.3f, 0.01f, 0.3f));
- float y = _meshRenderer != null ? _meshRenderer.bounds.max.y + 0.05f : transform.position.y + 0.1f;
- Vector3 p0 = new Vector3(b.min.x, y, b.min.z);
- Vector3 p1 = new Vector3(b.min.x, y, b.max.z);
- Vector3 p2 = new Vector3(b.max.x, y, b.max.z);
- Vector3 p3 = new Vector3(b.max.x, y, b.min.z);
- _outlineRenderer.positionCount = 5;
- _outlineRenderer.SetPosition(0, p0);
- _outlineRenderer.SetPosition(1, p1);
- _outlineRenderer.SetPosition(2, p2);
- _outlineRenderer.SetPosition(3, p3);
- _outlineRenderer.SetPosition(4, p0);
+ if (_outlineMesh != null) return;
+ var mf = GetComponent();
+ if (mf == null) mf = GetComponentInChildren();
+ if (mf == null || mf.sharedMesh == null) return;
+ var mat = new Material(Shader.Find("Custom/OutlineUnlit"));
+ mat.SetColor("_OutlineColor", new Color(0.2f, 0.5f, 1f, 1f));
+ mat.SetColor("_MainColor", new Color(0, 0, 0, 0));
+ mat.SetFloat("_OutlineWidth", 0.03f);
+ var go = new GameObject("Outline");
+ go.transform.SetParent(transform, false);
+ go.AddComponent().sharedMesh = mf.sharedMesh;
+ _outlineMesh = go.AddComponent();
+ _outlineMesh.material = mat;
}
System.Collections.IEnumerator BlinkOutline()
{
- if (_outlineRenderer != null) _outlineRenderer.enabled = true;
+ if (_outlineMesh != null) _outlineMesh.enabled = true;
yield return new WaitForSeconds(0.4f);
while (true)
{
- if (_outlineRenderer != null)
- _outlineRenderer.enabled = !_outlineRenderer.enabled;
+ if (_outlineMesh != null) _outlineMesh.enabled = !_outlineMesh.enabled;
yield return new WaitForSeconds(0.4f);
}
}
void OnMouseDown()
{
- // touchArray 优先:如果同时命中 touchArray point,跳过
- bool blocked = false;
- var allCams = Object.FindObjectsOfType();
- foreach (var c in allCams)
+ foreach (var c in Object.FindObjectsOfType())
{
if (!c.enabled) continue;
- var r = c.ScreenPointToRay(Input.mousePosition);
- foreach (var h in Physics.RaycastAll(r))
- {
- if (h.collider != null && h.collider.transform.parent != null
- && h.collider.transform.parent.name == "touchArray")
- { blocked = true; break; }
- }
- if (blocked) break;
+ foreach (var h in Physics.RaycastAll(c.ScreenPointToRay(Input.mousePosition)))
+ if (h.collider != null && h.collider.transform.parent != null && h.collider.transform.parent.name == "touchArray") return;
}
- if (blocked) return;
- // 阶段0: 依次首次点击4个ping
if (_firstClickCount < 4)
{
if (_clickedOnce) return;
- _clickedOnce = true;
- _firstClickCount++;
+ _clickedOnce = true; _firstClickCount++;
StopAllCoroutines();
- if (_meshRenderer != null) _meshRenderer.enabled = true;
- var allRends2 = GetComponentsInChildren();
- foreach (var r in allRends2) r.enabled = true;
- if (_outlineRenderer != null) _outlineRenderer.enabled = false;
- if (nextPing != null) { nextPing.SetActive(true); Debug.Log($"[PingClick] {name} → {nextPing.name} 激活"); }
- Debug.Log($"[PingClick] {name} 第1击 (model显示, {_firstClickCount}/4)");
- var sm = FindObjectOfType();
- if (sm != null) sm.RecordPingStep(pingIndex, false);
+ if (_modelRenderer != null) _modelRenderer.enabled = true;
+ if (_outlineMesh != null) _outlineMesh.enabled = false;
+ if (nextPing != null) nextPing.SetActive(true);
+ Debug.Log($"[PingClick] {name} 第1击 ({_firstClickCount}/4)");
+ if (_firstClickCount >= 4)
+ {
+ var mi = GameObject.Find("manInjury");
+ if (mi != null) { var ct = mi.transform.Find("chanraotuibu"); if (ct != null) { ct.gameObject.SetActive(true); Debug.Log("[PingClick] chanraotuibu 激活"); } }
+ }
+ var sm = FindObjectOfType(); if (sm != null) sm.RecordPingStep(pingIndex, false);
}
- // 阶段1: 全部显示后第二击显示chanrao
else
{
if (!_clickedOnce) return;
- if (chanraoObject != null) { chanraoObject.SetActive(true); Debug.Log($"[PingClick] {chanraoObject.name} 已显示"); }
+ if (chanraoObject != null) chanraoObject.SetActive(true);
StopAllCoroutines();
- if (_meshRenderer != null) _meshRenderer.enabled = false;
- // 隐藏所有子级 Renderer(确保模型不可见)
- var allRends = GetComponentsInChildren();
- foreach (var r in allRends) r.enabled = false;
- if (_outlineRenderer != null) _outlineRenderer.enabled = false;
+ if (_modelRenderer != null) _modelRenderer.enabled = false;
+ if (_outlineMesh != null) _outlineMesh.enabled = false;
gameObject.SetActive(false);
- Debug.Log($"[PingClick] {name} 第2击 (chanrao显示)");
- var sm = FindObjectOfType();
- if (sm != null) sm.RecordPingStep(pingIndex, true);
+ Debug.Log($"[PingClick] {name} 第2击");
+ var sm = FindObjectOfType(); if (sm != null) sm.RecordPingStep(pingIndex, true);
}
}
- public void UndoSecondClick()
- {
- if (!_clickedOnce) return;
- _clickedOnce = false;
- _firstClickCount--;
- gameObject.SetActive(true);
- if (_meshRenderer != null) _meshRenderer.enabled = false;
- // 隐藏所有子级 Renderer(确保模型不可见)
- var allRends = GetComponentsInChildren();
- foreach (var r in allRends) r.enabled = false;
- StopAllCoroutines();
- StartCoroutine(BlinkOutline());
- }
-
- public void ReEnableBorder()
- {
- if (_outlineRenderer != null)
- {
- _outlineRenderer.enabled = true;
- StopAllCoroutines();
- StartCoroutine(BlinkOutline());
- }
- }
-
- void ReEnableBordersOnAll()
- {
- var mi = GameObject.Find("manInjury");
- if (mi == null) return;
- for (int i = 4; i >= 1; i--)
- {
- var pt = mi.transform.Find("ping." + i.ToString("D3"));
- if (pt != null && pt.gameObject.activeSelf)
- {
- var h = pt.gameObject.GetComponent();
- if (h != null) h.ReEnableBorder();
- }
- }
- Debug.Log("[PingClick] 全部首次点击完成,边框已重新亮起");
- }
-
+ public void ReEnableBorder() { if (_outlineMesh != null) { _outlineMesh.enabled = true; StopAllCoroutines(); StartCoroutine(BlinkOutline()); } }
+ public void UndoSecondClick() { if (!_clickedOnce) return; _clickedOnce = false; _firstClickCount--; gameObject.SetActive(true); if (_modelRenderer != null) _modelRenderer.enabled = false; StopAllCoroutines(); StartCoroutine(BlinkOutline()); }
public void UndoShow() { gameObject.SetActive(false); }
}
diff --git a/Assets/Scripts/Interaction/ShoseClickHandler.cs b/Assets/Scripts/Interaction/ShoseClickHandler.cs
new file mode 100644
index 0000000..2812982
--- /dev/null
+++ b/Assets/Scripts/Interaction/ShoseClickHandler.cs
@@ -0,0 +1,69 @@
+using UnityEngine;
+
+///
+/// Shose 鞋子交互:shader 模型描边闪烁,点击后显示模型+移动到ShosePoint
+///
+public class ShoseClickHandler : MonoBehaviour
+{
+ public GameObject nextObject;
+ public Transform targetPoint;
+
+ private MeshRenderer _modelRenderer;
+ private MeshRenderer _outlineMesh;
+
+ void OnEnable()
+ {
+ _modelRenderer = GetComponent();
+ if (_modelRenderer != null) _modelRenderer.enabled = false;
+
+ CreateOutlineMesh();
+ StopAllCoroutines();
+ StartCoroutine(BlinkOutline());
+ }
+
+ void CreateOutlineMesh()
+ {
+ if (_outlineMesh != null) return;
+ var mf = GetComponent();
+ if (mf == null || mf.sharedMesh == null) return;
+
+ var mat = new Material(Shader.Find("Custom/OutlineUnlit"));
+ mat.SetColor("_OutlineColor", new Color(0.2f, 0.5f, 1f, 1f));
+ mat.SetColor("_MainColor", new Color(0, 0, 0, 0));
+ mat.SetFloat("_OutlineWidth", 0.03f);
+
+ var go = new GameObject("Outline");
+ go.transform.SetParent(transform, false);
+ var omf = go.AddComponent();
+ omf.sharedMesh = mf.sharedMesh;
+ _outlineMesh = go.AddComponent();
+ _outlineMesh.material = mat;
+ }
+
+ System.Collections.IEnumerator BlinkOutline()
+ {
+ if (_outlineMesh != null) _outlineMesh.enabled = true;
+ yield return new WaitForSeconds(0.4f);
+ while (true)
+ {
+ if (_outlineMesh != null) _outlineMesh.enabled = !_outlineMesh.enabled;
+ yield return new WaitForSeconds(0.4f);
+ }
+ }
+
+ void OnMouseDown()
+ {
+ StopAllCoroutines();
+ if (_modelRenderer != null) _modelRenderer.enabled = true;
+ if (_outlineMesh != null) _outlineMesh.enabled = false;
+
+ if (targetPoint != null)
+ {
+ transform.position = targetPoint.position;
+ transform.rotation = targetPoint.rotation;
+ }
+
+ if (nextObject != null) nextObject.SetActive(true);
+ Debug.Log($"[ShoseClick] 已移动到{targetPoint?.name}, {nextObject?.name} 已激活");
+ }
+}
diff --git a/Assets/Scripts/Interaction/ShoseClickHandler.cs.meta b/Assets/Scripts/Interaction/ShoseClickHandler.cs.meta
new file mode 100644
index 0000000..af1d3a0
--- /dev/null
+++ b/Assets/Scripts/Interaction/ShoseClickHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ef881c013fff04bd5be5dd4483bc762d
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: