Files
aibis-dream/Assets/Scripts/MiniGame/Peipei/CutLine/LineInteraction.cs
T

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();
}
}