前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TimeLine⭐️四、利用TimeLine来做一个对话框

TimeLine⭐️四、利用TimeLine来做一个对话框

作者头像
星河造梦坊官方
发布2024-08-15 17:23:30
1020
发布2024-08-15 17:23:30
举报
文章被收录于专栏:星河造梦坊专栏

🟥 目标展示

利用TimeLine,实现对话框效果。

当按下空格键/(你希望的触发操作)时,继续往下进行

🟧 实现步骤

代码逻辑:

时间轴上代码clip决定显示的UI,决定是否运行完本clip暂停TimeLine,

那暂停后如何继续播放该TimeLine?场景中代码得到允许继续播放的输入命令时,让该TimeLine继续播放即可。

1、给某物体建立TimeLine

选中某物体,Windows-Sequencing-TimeLine,给该物体创建TimeLine属性。

2、创建 Skode_DialogueClip 脚本

该脚本需要被拖到TimeLine上,用以执行下方的 Skode_DialogueBehaviour 。

代码语言:javascript
复制
using System;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

[Serializable]
public class Skode_DialogueClip : PlayableAsset, ITimelineClipAsset
{
    public Skode_DialogueBehaviour template = new Skode_DialogueBehaviour();

    public ClipCaps clipCaps
    {
        get { return ClipCaps.None; }
    }

    public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    {
        var playable =ScriptPlayable<Skode_DialogueBehaviour>.Create(graph, template);

        return playable;
    }
}

3、创建 Skode_DialogueBehaviour 脚本

该脚本被 Skode_DialogueClip 实例化执行,有自己的生命周期,执行你想要的程序。

该脚本放在Assets中即可,不用往其他地方挂。

代码语言:javascript
复制
using System;
using UnityEngine;
using UnityEngine.Playables;

[Serializable]
public class Skode_DialogueBehaviour : PlayableBehaviour
{
    //播放到该clip时,UI要显示的文字
    public string dialogueLine;

    [Tooltip("播放完该clip后,是否需要暂停TimeLine")]
    public bool hasToPause = false;

    /// <summary>
    /// 未播放该clip?  false为未播放
    /// </summary>
    bool clipPlayed = false;

    /// <summary>
    /// 播放完该clip后是否需要暂停。false为不需要。
    /// 缓存的bool变量,会在时间轴运行到该clip时,根据 hasToPause 值赋值。
    /// </summary>
    bool pauseScheduled = false;

    /// <summary>
    /// 得到当前 PlayableDirector
    /// </summary>
    PlayableDirector director;

    public override void OnPlayableCreate(Playable playable)
    {
        Debug.Log("OnPlayableCreate");
        director = playable.GetGraph().GetResolver() as PlayableDirector;
    }

    public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
        Debug.Log("ProcessFrame");

        //若还未播放该clip,当前clip的权重>0
        //效果是:时间轴刚进入该clip时执行一次
        if (!clipPlayed && info.weight > 0f)
        {
            Debug.Log("ProcessFrame true");
            Skode_GameManager.ins.SetDialogue(dialogueLine);

            //检测播放完该clip后是否需要暂停,并赋值
            if (Application.isPlaying && hasToPause)
            {
                pauseScheduled = true;
            }

            clipPlayed = true;
        }
    }

    public override void OnBehaviourPause(Playable playable, FrameData info)
    {
        //因为该回调会在刚运行TimeLine、执行完clip时都会执行一次。
        //因此不能直接判断 hasToPause ,否则刚运行TimeLine就给暂停了。

        if (pauseScheduled)
        {
            pauseScheduled = false;
            Skode_GameManager.ins.PauseTimeline(director);
        }
    }
}

4、创建 Skode_GameManager 脚本

该脚本内有暂停、恢复Timeline、设置UI文字的方法,并能检测输入,恢复TimeLine的执行。

该脚本挂在场景中。

代码语言:javascript
复制
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.UI;

public class Skode_GameManager : MonoBehaviour
{
    public static Skode_GameManager ins;

    public Text dialogueLineText;

    PlayableDirector activeDirector;

    private void Awake()
    {
        ins = this;
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            ResumeTimeline();
        }
    }

    //设置UI文字
    public void SetDialogue(string lineOfDialogue)
    {
        dialogueLineText.text = lineOfDialogue;

        dialogueLineText.gameObject.SetActive(true);
    }

    //暂停TimeLine
    public void PauseTimeline(PlayableDirector whichOne)
    {
        activeDirector = whichOne;

        activeDirector.Pause();
    }

    //恢复播放TimeLine
    public void ResumeTimeline()
    {
        activeDirector.Resume();
    }
}

现在,我们再来说一遍这三个脚本怎么用:

  • Skode_DialogueClip:放在TimeLine上。
  • Skode_DialogueBehaviour:放在Assets中即可。
  • Skode_GameManager:挂在场景中。

大家还有什么问题,欢迎在下方留言!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🟥 目标展示
  • 🟧 实现步骤
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档