feat: ping/chanrao交互系统 + camera3平滑切换

- PingClickHandler: 蓝色闪烁描边, 点击显示chanrao并隐藏自己, 链式激活下个ping
- ping链: 004→003→002→001 (从4开始)
- TouchPositionHandler: point1点击时黑幕渐入→切camera3→渐出
- PageController: 实验启动时激活ping.004
This commit is contained in:
yangbear
2026-07-02 16:07:02 +08:00
parent 2538eecb6b
commit 393e3da16f
5 changed files with 129 additions and 10 deletions
@@ -0,0 +1,60 @@
using UnityEngine;
/// <summary>
/// 挂在每个 ping 对象上。带蓝色闪烁描边,点击后显示对应 chanrao 并隐藏自己。
/// 从 ping.004 开始作为第一个(reverse order)。
/// </summary>
public class PingClickHandler : MonoBehaviour
{
public GameObject chanraoObject;
public GameObject nextPing;
private MeshRenderer _meshRenderer;
void Start()
{
_meshRenderer = GetComponent<MeshRenderer>();
if (_meshRenderer == null) _meshRenderer = GetComponentInChildren<MeshRenderer>();
StartCoroutine(BlinkOutline());
}
void OnEnable()
{
_meshRenderer = GetComponent<MeshRenderer>();
if (_meshRenderer == null) _meshRenderer = GetComponentInChildren<MeshRenderer>();
if (_meshRenderer != null) _meshRenderer.enabled = true;
StopAllCoroutines();
StartCoroutine(BlinkOutline());
}
System.Collections.IEnumerator BlinkOutline()
{
while (true)
{
if (_meshRenderer != null)
_meshRenderer.enabled = !_meshRenderer.enabled;
yield return new WaitForSeconds(0.4f);
}
}
void OnMouseDown()
{
Debug.Log($"[PingClick] {name} 被点击");
if (chanraoObject != null)
{
chanraoObject.SetActive(true);
Debug.Log($"[PingClick] {chanraoObject.name} 已显示");
}
StopAllCoroutines();
if (_meshRenderer != null) _meshRenderer.enabled = false;
gameObject.SetActive(false);
if (nextPing != null)
{
nextPing.SetActive(true);
Debug.Log($"[PingClick] {name} → {nextPing.name} 已激活");
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4f940d2edab2d44ad98aa707038ce89c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -53,6 +53,10 @@ public class TouchPositionHandler : MonoBehaviour
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);
@@ -83,4 +87,44 @@ public class TouchPositionHandler : MonoBehaviour
_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);
}
}
}
+8 -1
View File
@@ -281,7 +281,14 @@ public class PageController : MonoBehaviour
}
var touch = GameObject.Find("touchArray");
if (touch != null && touch.transform.childCount > 0) { touch.transform.GetChild(0).gameObject.SetActive(true); Debug.Log("PageController: touchArray/point1 已显示"); }
if (touch != null && touch.transform.childCount > 0) { touch.transform.GetChild(0).gameObject.SetActive(true); Debug.Log("PageController: touchArray/point1 已显示");
// 激活第一个 ping (ping.004)
var mi = GameObject.Find("manInjury");
if (mi != null) {
var ping4 = mi.transform.Find("ping.004");
if (ping4 != null) { ping4.gameObject.SetActive(true); Debug.Log("PageController: ping.004 已激活"); }
} }
var tipPanel = GameObject.Find("TipPanel");
if (tipPanel != null) tipPanel.SetActive(true);