121 lines
3.8 KiB
C#
121 lines
3.8 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Playables;
|
|
using DG.Tweening; // 引入 DoTween 命名空间
|
|
using Yarn.Unity;
|
|
using AibisDream;
|
|
using AibisDream.Kit;
|
|
|
|
public class LineInteraction : MonoBehaviour
|
|
{
|
|
public GameObject actorGroup; // 关联的Playable Director
|
|
public PlayableDirector timelineDirector; // 关联的Playable Director
|
|
public SpriteRenderer scissorSpriteRenderer; // 剪刀的SpriteRenderer
|
|
public SpriteRenderer cutLineSpriteRenderer; // 剪刀的SpriteRenderer
|
|
public Sprite closedScissorSprite; // 剪刀合上的Sprite
|
|
public Sprite openScissorSprite; // 剪刀张开的Sprite
|
|
public float openYMin; // Y轴范围的最小值
|
|
public float openYMax; // Y轴范围的最大值
|
|
public float fadeDuration = 0.5f; // 淡入淡出持续时间
|
|
|
|
private bool isActive = false;
|
|
|
|
// Start is called before the first frame update
|
|
void Start()
|
|
{
|
|
// 初始状态不激活
|
|
actorGroup.SetActive(false);
|
|
scissorSpriteRenderer.transform.localPosition =
|
|
new Vector3(12f, openYMin - 3, scissorSpriteRenderer.transform.position.z);
|
|
cutLineSpriteRenderer.enabled = false;
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
if (!isActive) return;
|
|
|
|
// 获取鼠标在世界坐标中的位置
|
|
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y,
|
|
Camera.main.nearClipPlane));
|
|
|
|
// 更新剪刀的Y轴位置以跟随鼠标
|
|
scissorSpriteRenderer.transform.localPosition = new Vector3(scissorSpriteRenderer.transform.localPosition.x,
|
|
mousePosition.y, scissorSpriteRenderer.transform.localPosition.z);
|
|
|
|
// 检查Y轴位置并更换Sprite
|
|
if (mousePosition.y >= openYMin && mousePosition.y <= openYMax)
|
|
{
|
|
scissorSpriteRenderer.sprite = openScissorSprite;
|
|
cutLineSpriteRenderer.enabled = true;
|
|
// 检查玩家交互(例如按下鼠标左键)
|
|
if (Input.GetMouseButtonDown(0))
|
|
{
|
|
ContinueTimeline();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
scissorSpriteRenderer.sprite = closedScissorSprite;
|
|
cutLineSpriteRenderer.enabled = false;
|
|
}
|
|
}
|
|
|
|
[YarnCommand("play_timeline_cutline")]
|
|
public void PlayTimeline()
|
|
{
|
|
timelineDirector.Play();
|
|
}
|
|
|
|
public void FinishCutLine()
|
|
{
|
|
StartCoroutine(FinishSequence());
|
|
}
|
|
|
|
private IEnumerator FinishSequence()
|
|
{
|
|
// 淡出剪刀和切割线
|
|
scissorSpriteRenderer.DOFade(0f, fadeDuration);
|
|
cutLineSpriteRenderer.DOFade(0f, fadeDuration);
|
|
yield return new WaitForSeconds(fadeDuration * 4);
|
|
foreach (SpriteRenderer child in actorGroup.GetComponentsInChildren<SpriteRenderer>())
|
|
{
|
|
child.DOFade(0f, fadeDuration * 2);
|
|
}
|
|
|
|
yield return new WaitForSeconds(fadeDuration * 2);
|
|
|
|
// 销毁GameObject
|
|
Destroy(gameObject);
|
|
|
|
// 调用对话控制器
|
|
DialogController.Instance.StartDialogNode("CutLine");
|
|
}
|
|
|
|
public void ActivateInteraction()
|
|
{
|
|
StartCoroutine(InteractionSequence());
|
|
}
|
|
|
|
private IEnumerator InteractionSequence()
|
|
{
|
|
// 开始阶段:淡入
|
|
scissorSpriteRenderer.transform.DOLocalMoveX(7.39f, fadeDuration);
|
|
cutLineSpriteRenderer.DOFade(1f, fadeDuration);
|
|
AudioManager.Instance.PlaySfx("event:/Scriptal/scissor_in");
|
|
yield return new WaitForSeconds(fadeDuration);
|
|
|
|
// 执行阶段:激活交互逻辑
|
|
isActive = true;
|
|
|
|
// 等待交互完成
|
|
yield return null;
|
|
}
|
|
|
|
void ContinueTimeline()
|
|
{
|
|
AudioManager.Instance.PlaySfx("event:/ActionFB/wire_cut");
|
|
timelineDirector.Play();
|
|
}
|
|
} |