Files
VFSUnity/Assets/Scripts/Interaction/TouchPositionHandler.cs
T
yangbear 393e3da16f feat: ping/chanrao交互系统 + camera3平滑切换
- PingClickHandler: 蓝色闪烁描边, 点击显示chanrao并隐藏自己, 链式激活下个ping
- ping链: 004→003→002→001 (从4开始)
- TouchPositionHandler: point1点击时黑幕渐入→切camera3→渐出
- PageController: 实验启动时激活ping.004
2026-07-02 16:07:02 +08:00

131 lines
4.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEngine;
/// <summary>
/// 挂在 touchArray 子球体上。球体用双Pass膨胀描边shaderCustom/OutlineUnlit),
/// 闪烁提示用户点击。点击后移动到对应位置并顺序显示下一个。
/// </summary>
public class TouchPositionHandler : MonoBehaviour
{
public Transform targetPosition;
public GameObject womanObject;
public GameObject nextTouchObject;
public AudioClip voiceClip;
private MeshRenderer _meshRenderer;
private void Start()
{
_meshRenderer = GetComponent<MeshRenderer>();
StartCoroutine(BlinkMesh());
}
private void OnEnable()
{
_meshRenderer = GetComponent<MeshRenderer>();
if (_meshRenderer != null) _meshRenderer.enabled = true;
StopAllCoroutines();
StartCoroutine(BlinkMesh());
}
private System.Collections.IEnumerator BlinkMesh()
{
while (true)
{
if (_meshRenderer != null) _meshRenderer.enabled = !_meshRenderer.enabled;
yield return new WaitForSeconds(0.4f);
}
}
private void OnMouseDown()
{
Debug.Log($"[TouchPosition] {name}: 被点击");
if (womanObject != null && targetPosition != null)
{
womanObject.transform.position = targetPosition.position;
womanObject.transform.rotation = targetPosition.rotation;
Debug.Log($"[TouchPosition] woman 移动到 {targetPosition.name}");
}
if (voiceClip != null)
{
PlaySharedVoice();
Debug.Log($"[TouchPosition] 播放语音: {voiceClip.name}");
}
// 点击point1时平滑切换到camera3
if (transform.GetSiblingIndex() == 0)
StartCoroutine(SwitchToCamera3Smooth());
int stepIndex = transform.GetSiblingIndex() + 1;
var sm = FindObjectOfType<StepManager>();
if (sm != null) sm.RecordWomanStep(stepIndex);
StopAllCoroutines();
if (_meshRenderer != null) _meshRenderer.enabled = false;
gameObject.SetActive(false);
if (nextTouchObject != null)
{
nextTouchObject.SetActive(true);
Debug.Log($"[TouchPosition] {name} → {nextTouchObject.name} 显示");
}
}
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();
}
System.Collections.IEnumerator SwitchToCamera3Smooth()
{
var black = GameObject.Find("BlackScreenPanel");
var blackImg = black != null ? black.GetComponent<UnityEngine.UI.Image>() : null;
float duration = 0.8f;
// 渐入黑
if (black != null && blackImg != null)
{
black.SetActive(true);
for (float t = 0f; t < duration; t += Time.deltaTime)
{
blackImg.color = new Color(0, 0, 0, t / duration);
yield return null;
}
blackImg.color = Color.black;
}
// 切换摄像机
var cam2 = GameObject.Find("camera2");
var cam3 = GameObject.Find("camera3");
if (cam2 != null) { var c = cam2.GetComponent<Camera>(); if (c != null) c.enabled = false; }
if (cam3 != null) { var c = cam3.GetComponent<Camera>(); if (c != null) c.enabled = true; }
Debug.Log("[TouchPosition] camera2→camera3 平滑切换完成");
yield return new WaitForSeconds(0.2f);
// 渐出黑
if (black != null && blackImg != null)
{
for (float t = 0f; t < duration; t += Time.deltaTime)
{
blackImg.color = new Color(0, 0, 0, 1f - t / duration);
yield return null;
}
blackImg.color = new Color(0, 0, 0, 0);
black.SetActive(false);
}
}
}