diff --git a/Assets/Materials/BlueOutline.mat b/Assets/Materials/BlueOutline.mat
new file mode 100644
index 0000000..a0aad04
--- /dev/null
+++ b/Assets/Materials/BlueOutline.mat
@@ -0,0 +1,32 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 8
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: BlueOutline
+ m_Shader: {fileID: 4800000, guid: 8f9df7221aff6471e9c94f9880c6b198, type: 3}
+ m_Parent: {fileID: 0}
+ m_ModifiedSerializedProperties: 0
+ m_ValidKeywords: []
+ m_InvalidKeywords: []
+ m_LightmapFlags: 4
+ m_EnableInstancingVariants: 0
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: -1
+ stringTagMap: {}
+ disabledShaderPasses: []
+ m_LockedProperties:
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs: []
+ m_Ints: []
+ m_Floats:
+ - _OutlineWidth: 0.08
+ m_Colors:
+ - _MainColor: {r: 0.09999997, g: 0.29999998, b: 0.8, a: 0.3}
+ - _OutlineColor: {r: 0.19999996, g: 0.5, b: 1, a: 1}
+ m_BuildTextureStacks: []
diff --git a/Assets/Materials/BlueOutline.mat.meta b/Assets/Materials/BlueOutline.mat.meta
new file mode 100644
index 0000000..6e5c713
--- /dev/null
+++ b/Assets/Materials/BlueOutline.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ffca8dfc24bad4047b97aff00ba3497c
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scenes/main.unity b/Assets/Scenes/main.unity
index 4eabb0d..7b15858 100644
--- a/Assets/Scenes/main.unity
+++ b/Assets/Scenes/main.unity
@@ -1210,7 +1210,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
- m_IsActive: 1
+ m_IsActive: 0
--- !u!4 &30774413
Transform:
m_ObjectHideFlags: 0
diff --git a/Assets/Scripts/Interaction/TouchPositionHandler.cs b/Assets/Scripts/Interaction/TouchPositionHandler.cs
index 7fa046d..04d860e 100644
--- a/Assets/Scripts/Interaction/TouchPositionHandler.cs
+++ b/Assets/Scripts/Interaction/TouchPositionHandler.cs
@@ -1,8 +1,8 @@
using UnityEngine;
///
-/// 挂在 touchArray 的每个子球体上,点击时把 woman 移动到 womanPointArray 对应位置。
-/// 两个交叉圆环形成球形轮廓闪烁提示。
+/// 挂在 touchArray 子球体上。球体用双Pass膨胀描边shader(Custom/OutlineUnlit),
+/// 闪烁提示用户点击。点击后移动到对应位置并顺序显示下一个。
///
public class TouchPositionHandler : MonoBehaviour
{
@@ -10,73 +10,20 @@ public class TouchPositionHandler : MonoBehaviour
public GameObject womanObject;
public GameObject nextTouchObject;
- private LineRenderer _ringH; // 水平环
- private LineRenderer _ringV; // 垂直环
+ private MeshRenderer _meshRenderer;
private void Start()
{
- var mr = GetComponent();
- if (mr != null) mr.enabled = false;
-
- CreateCrossRings();
- StartCoroutine(BlinkRings());
+ _meshRenderer = GetComponent();
+ StartCoroutine(BlinkMesh());
}
- private void CreateCrossRings()
- {
- float r = 0.15f;
- int segs = 32;
- float yOff = 0.05f;
- Color blue = new Color(0.2f, 0.5f, 1f);
-
- // 水平环 —— 世界空间 XZ 平面
- var hGo = new GameObject("RingH");
- hGo.transform.SetParent(transform, false);
- _ringH = hGo.AddComponent();
- SetupRing(_ringH, blue);
- _ringH.useWorldSpace = true;
- _ringH.positionCount = segs;
- Vector3 center = transform.position + Vector3.up * yOff;
- for (int i = 0; i < segs; i++)
- {
- float a = i * 2f * Mathf.PI / segs;
- _ringH.SetPosition(i, center + new Vector3(Mathf.Cos(a) * r, 0, Mathf.Sin(a) * r));
- }
-
- // 垂直环 —— 世界空间 XY 平面(竖起来)
- var vGo = new GameObject("RingV");
- vGo.transform.SetParent(transform, false);
- _ringV = vGo.AddComponent();
- SetupRing(_ringV, blue);
- _ringV.useWorldSpace = true;
- _ringV.positionCount = segs;
- for (int i = 0; i < segs; i++)
- {
- float a = i * 2f * Mathf.PI / segs;
- _ringV.SetPosition(i, center + new Vector3(Mathf.Cos(a) * r, Mathf.Sin(a) * r, 0));
- }
-
- Debug.Log($"[TouchPosition] {name}: 交叉蓝环已创建 (r={r})");
- }
-
- private void SetupRing(LineRenderer lr, Color c)
- {
- lr.loop = true;
- lr.startWidth = 0.06f;
- lr.endWidth = 0.06f;
- lr.material = new Material(Shader.Find("Unlit/Color"));
- lr.material.color = c;
- lr.startColor = c;
- lr.endColor = c;
- }
-
- private System.Collections.IEnumerator BlinkRings()
+ private System.Collections.IEnumerator BlinkMesh()
{
while (true)
{
- bool on = !_ringH.enabled;
- if (_ringH != null) _ringH.enabled = on;
- if (_ringV != null) _ringV.enabled = on;
+ if (_meshRenderer != null)
+ _meshRenderer.enabled = !_meshRenderer.enabled;
yield return new WaitForSeconds(0.4f);
}
}
@@ -91,14 +38,9 @@ public class TouchPositionHandler : MonoBehaviour
womanObject.transform.rotation = targetPosition.rotation;
Debug.Log($"[TouchPosition] woman 移动到 {targetPosition.name}");
}
- else
- {
- Debug.LogWarning($"[TouchPosition] {name}: 引用为空");
- }
StopAllCoroutines();
- if (_ringH != null) _ringH.enabled = false;
- if (_ringV != null) _ringV.enabled = false;
+ if (_meshRenderer != null) _meshRenderer.enabled = false;
gameObject.SetActive(false);
if (nextTouchObject != null)
diff --git a/Assets/Shaders.meta b/Assets/Shaders.meta
new file mode 100644
index 0000000..3407f81
--- /dev/null
+++ b/Assets/Shaders.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3341ac3659c134c929e8f36c5268188d
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Shaders/OutlineUnlit.shader b/Assets/Shaders/OutlineUnlit.shader
new file mode 100644
index 0000000..9083775
--- /dev/null
+++ b/Assets/Shaders/OutlineUnlit.shader
@@ -0,0 +1,64 @@
+Shader "Custom/OutlineUnlit"
+{
+ Properties
+ {
+ _MainColor ("Main Color", Color) = (0.1, 0.3, 0.8, 0.3)
+ _OutlineColor ("Outline Color", Color) = (0.2, 0.5, 1, 1)
+ _OutlineWidth ("Outline Width", Range(0, 0.3)) = 0.08
+ }
+ SubShader
+ {
+ Tags { "RenderType"="Transparent" "Queue"="Transparent" }
+ Blend SrcAlpha OneMinusSrcAlpha
+ ZWrite Off
+
+ // Pass 1: 膨胀描边
+ Pass
+ {
+ Name "OUTLINE"
+ Cull Front
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+ #include "UnityCG.cginc"
+
+ float _OutlineWidth;
+ float4 _OutlineColor;
+
+ struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; };
+ struct v2f { float4 pos : SV_POSITION; };
+
+ v2f vert(appdata v)
+ {
+ v2f o;
+ float3 n = normalize(v.normal);
+ v.vertex.xyz += n * _OutlineWidth;
+ o.pos = UnityObjectToClipPos(v.vertex);
+ return o;
+ }
+
+ fixed4 frag(v2f i) : SV_Target { return _OutlineColor; }
+ ENDCG
+ }
+
+ // Pass 2: 内芯填充
+ Pass
+ {
+ Name "FILL"
+ Cull Back
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+ #include "UnityCG.cginc"
+
+ float4 _MainColor;
+
+ struct appdata { float4 vertex : POSITION; };
+ struct v2f { float4 pos : SV_POSITION; };
+
+ v2f vert(appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); return o; }
+ fixed4 frag(v2f i) : SV_Target { return _MainColor; }
+ ENDCG
+ }
+ }
+}
diff --git a/Assets/Shaders/OutlineUnlit.shader.meta b/Assets/Shaders/OutlineUnlit.shader.meta
new file mode 100644
index 0000000..8aff024
--- /dev/null
+++ b/Assets/Shaders/OutlineUnlit.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 8f9df7221aff6471e9c94f9880c6b198
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ nonModifiableTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant: