2026-06-30 02:19:13 +08:00
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-06-30 03:02:12 +08:00
|
|
|
|
/// 挂在 touchArray 子球体上。球体用双Pass膨胀描边shader(Custom/OutlineUnlit),
|
|
|
|
|
|
/// 闪烁提示用户点击。点击后移动到对应位置并顺序显示下一个。
|
2026-06-30 02:19:13 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class TouchPositionHandler : MonoBehaviour
|
|
|
|
|
|
{
|
|
|
|
|
|
public Transform targetPosition;
|
|
|
|
|
|
public GameObject womanObject;
|
2026-06-30 02:24:54 +08:00
|
|
|
|
public GameObject nextTouchObject;
|
2026-07-01 19:51:41 +08:00
|
|
|
|
public AudioClip voiceClip;
|
2026-07-09 03:51:55 +08:00
|
|
|
|
private float _lastClickTime;
|
2026-06-30 02:24:54 +08:00
|
|
|
|
|
2026-06-30 03:02:12 +08:00
|
|
|
|
private MeshRenderer _meshRenderer;
|
2026-06-30 02:32:27 +08:00
|
|
|
|
|
2026-06-30 02:24:54 +08:00
|
|
|
|
private void Start()
|
|
|
|
|
|
{
|
2026-06-30 03:02:12 +08:00
|
|
|
|
_meshRenderer = GetComponent<MeshRenderer>();
|
2026-06-30 02:32:27 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-01 21:07:01 +08:00
|
|
|
|
private void OnEnable()
|
|
|
|
|
|
{
|
|
|
|
|
|
_meshRenderer = GetComponent<MeshRenderer>();
|
2026-07-03 01:06:54 +08:00
|
|
|
|
if (_meshRenderer != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
_meshRenderer.enabled = true;
|
2026-07-03 01:08:14 +08:00
|
|
|
|
var col = GetComponent<Collider>(); if (col == null) { var sc = gameObject.AddComponent<SphereCollider>(); sc.radius = 0.3f; } // 只显示描边,填充透明
|
2026-07-03 01:06:54 +08:00
|
|
|
|
var mat = _meshRenderer.material;
|
|
|
|
|
|
if (mat != null && mat.HasProperty("_MainColor"))
|
|
|
|
|
|
{
|
|
|
|
|
|
var c = mat.GetColor("_MainColor");
|
|
|
|
|
|
c.a = 0f;
|
|
|
|
|
|
mat.SetColor("_MainColor", c);
|
2026-07-08 09:38:42 +08:00
|
|
|
|
|
|
|
|
|
|
// 同步赋值统一的描边宽度,否则可能会太细导致看不见闪动
|
|
|
|
|
|
if (mat.HasProperty("_OutlineWidth"))
|
|
|
|
|
|
{
|
|
|
|
|
|
mat.SetFloat("_OutlineWidth", OutlineConfig.Width);
|
|
|
|
|
|
}
|
2026-07-03 01:06:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-07-01 21:07:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-30 03:02:12 +08:00
|
|
|
|
private System.Collections.IEnumerator BlinkMesh()
|
2026-06-30 02:32:27 +08:00
|
|
|
|
{
|
2026-07-08 09:38:42 +08:00
|
|
|
|
yield break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool CanBeClicked()
|
|
|
|
|
|
{
|
|
|
|
|
|
return gameObject.activeInHierarchy && _meshRenderer != null && _meshRenderer.enabled;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void PerformClick()
|
|
|
|
|
|
{
|
|
|
|
|
|
OnMouseDown();
|
2026-06-30 02:24:54 +08:00
|
|
|
|
}
|
2026-06-30 02:19:13 +08:00
|
|
|
|
|
|
|
|
|
|
private void OnMouseDown()
|
|
|
|
|
|
{
|
2026-07-09 03:41:50 +08:00
|
|
|
|
if (_meshRenderer == null || !_meshRenderer.enabled) return; // 防止重复点击
|
2026-07-09 03:51:55 +08:00
|
|
|
|
if (Time.time - _lastClickTime < 0.3f) return;
|
|
|
|
|
|
_lastClickTime = Time.time;
|
2026-07-17 05:42:52 +08:00
|
|
|
|
InteractionClickGuard.MarkHandled();
|
2026-07-09 03:51:55 +08:00
|
|
|
|
|
2026-06-30 02:24:54 +08:00
|
|
|
|
Debug.Log($"[TouchPosition] {name}: 被点击");
|
|
|
|
|
|
|
2026-06-30 02:19:13 +08:00
|
|
|
|
if (womanObject != null && targetPosition != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
womanObject.transform.position = targetPosition.position;
|
|
|
|
|
|
womanObject.transform.rotation = targetPosition.rotation;
|
2026-06-30 02:48:13 +08:00
|
|
|
|
Debug.Log($"[TouchPosition] woman 移动到 {targetPosition.name}");
|
2026-07-01 21:07:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (voiceClip != null)
|
|
|
|
|
|
{
|
2026-07-01 21:18:34 +08:00
|
|
|
|
PlaySharedVoice();
|
2026-07-01 21:07:01 +08:00
|
|
|
|
Debug.Log($"[TouchPosition] 播放语音: {voiceClip.name}");
|
|
|
|
|
|
}
|
2026-06-30 02:24:54 +08:00
|
|
|
|
|
2026-07-02 16:07:02 +08:00
|
|
|
|
// 点击point1时平滑切换到camera3
|
|
|
|
|
|
if (transform.GetSiblingIndex() == 0)
|
2026-07-03 14:21:48 +08:00
|
|
|
|
{
|
|
|
|
|
|
var amCam = FindObjectOfType<AudioManager>();
|
2026-07-03 14:30:10 +08:00
|
|
|
|
if (amCam != null) amCam.SwitchToCamera3();
|
2026-07-03 14:21:48 +08:00
|
|
|
|
}
|
2026-07-02 16:07:02 +08:00
|
|
|
|
|
2026-06-30 14:32:30 +08:00
|
|
|
|
int stepIndex = transform.GetSiblingIndex() + 1;
|
|
|
|
|
|
var sm = FindObjectOfType<StepManager>();
|
|
|
|
|
|
if (sm != null) sm.RecordWomanStep(stepIndex);
|
2026-07-09 03:16:00 +08:00
|
|
|
|
ActionHistory.Push(ActionHistory.ActionType.Woman, this);
|
2026-06-30 14:32:30 +08:00
|
|
|
|
|
2026-07-05 22:22:03 +08:00
|
|
|
|
// point1 点击后先激活 Shose
|
2026-07-03 14:08:08 +08:00
|
|
|
|
if (stepIndex == 1)
|
|
|
|
|
|
{
|
2026-07-05 22:22:03 +08:00
|
|
|
|
var shose = GameObject.Find("Shose");
|
|
|
|
|
|
if (shose != null)
|
2026-07-03 14:08:08 +08:00
|
|
|
|
{
|
2026-07-05 22:22:03 +08:00
|
|
|
|
var h = shose.GetComponent<ShoseClickHandler>();
|
|
|
|
|
|
if (h == null) h = shose.AddComponent<ShoseClickHandler>();
|
|
|
|
|
|
h.targetPoint = GameObject.Find("ShosePoint")?.transform;
|
|
|
|
|
|
if (h.nextObject == null)
|
|
|
|
|
|
h.nextObject = GameObject.Find("manInjury")?.transform.Find("ping.004")?.gameObject;
|
|
|
|
|
|
shose.SetActive(false);
|
|
|
|
|
|
shose.SetActive(true);
|
|
|
|
|
|
Debug.Log("[TouchPosition] Shose 已激活");
|
2026-07-03 14:08:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-30 03:02:12 +08:00
|
|
|
|
if (_meshRenderer != null) _meshRenderer.enabled = false;
|
2026-06-30 02:32:27 +08:00
|
|
|
|
|
2026-06-30 02:24:54 +08:00
|
|
|
|
gameObject.SetActive(false);
|
|
|
|
|
|
if (nextTouchObject != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
nextTouchObject.SetActive(true);
|
2026-06-30 02:48:13 +08:00
|
|
|
|
Debug.Log($"[TouchPosition] {name} → {nextTouchObject.name} 显示");
|
2026-06-30 02:24:54 +08:00
|
|
|
|
}
|
2026-06-30 02:19:13 +08:00
|
|
|
|
}
|
2026-07-01 21:18:34 +08:00
|
|
|
|
|
|
|
|
|
|
private static AudioSource _sharedVoice;
|
|
|
|
|
|
|
|
|
|
|
|
private void PlaySharedVoice()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (voiceClip == null) return;
|
|
|
|
|
|
if (_sharedVoice == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var go = GameObject.Find("[Managers]");
|
|
|
|
|
|
if (go != null) _sharedVoice = go.AddComponent<AudioSource>();
|
|
|
|
|
|
else { var g = new GameObject("SharedVoice"); _sharedVoice = g.AddComponent<AudioSource>(); }
|
|
|
|
|
|
}
|
|
|
|
|
|
_sharedVoice.Stop();
|
|
|
|
|
|
_sharedVoice.clip = voiceClip;
|
|
|
|
|
|
_sharedVoice.Play();
|
|
|
|
|
|
}
|
2026-06-30 02:19:13 +08:00
|
|
|
|
}
|