Unity 实现Timeline的进度条显示

一、普通进度条

1.创建进度条UI

2.写脚本控制进度条与Timeline

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Timeline;
using UnityEngine.Playables;
using UnityEngine.UI;

public class SliderControl : MonoBehaviour
{
	public PlayableDirector timeLinePlayer;
	public Slider slider;
	public bool isPlay;
	public Text currentTime;
	public Text durationTime;
	public Sprite play;
	public Sprite pause;
	public Button playButton;
	private void Start()
	{
		//var timelineAsset = Resources.Load<RecordingBase>("New Recording");
		playButton.GetComponent<Button>().onClick.AddListener(StartPlay);
		slider.maxValue= (float)timeLinePlayer.duration;
		durationTime.text="/ "+ slider.maxValue.ToString("f2");
		if (isPlay)
		{
			timeLinePlayer.Play();
		}
		else
		{
			timeLinePlayer.Stop();
		}
	}

	private void Update()
	{
		if (isPlay) 
		{
			slider.value = (float)timeLinePlayer.time;
		}
		currentTime.text = slider.value.ToString("f2");
	}

	//滑动条拖动时触发的函数
	public void ValueChangeCheck()
	{
		timeLinePlayer.time = slider.value;
	}

	public void StartPlay()
	{
		if (!isPlay)
		{
			timeLinePlayer.Play();
			playButton.GetComponent<Image>().sprite = pause;
			isPlay = true;
		}
		else
		{
			timeLinePlayer.Pause();
			playButton.GetComponent<Image>().sprite = play;
			isPlay = false;
		}
	}

}

3.创建空物体添加脚本与组件

二、进度条优化 

1.优化UI界面

2.编写脚本,新增倍速功能、暂停功能、退出功能

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Timeline;
using UnityEngine.Playables;
using UnityEngine.UI;

public class SliderControl : MonoBehaviour
{
	public PlayableDirector timeLinePlayer;
	public Slider slider;
	public Text currentTime;
	public Text durationTime;
	public Text speedText;
	public Text speedx2;
	public Sprite play;
	public Sprite pause;
	public Button playButton;
	public Button speedx2Button;
	private float speed = 1.0f;
	private bool isPlay;

	private void Start()
	{
		//var timelineAsset = Resources.Load<RecordingBase>("New Recording");
		playButton.GetComponent<Button>().onClick.AddListener(StartPlay);
		speedx2Button.GetComponent<Button>().onClick.AddListener(ChangeSpeed);
		speedx2Button.gameObject.SetActive(false);
		slider.gameObject.SetActive(false);
	}

	private void Update()
	{
		if (isPlay) 
		{
			slider.value = (float)timeLinePlayer.time;
		}
		currentTime.text = slider.value.ToString("00.00");
	}

	//滑动条拖动时触发的函数
	public void ValueChangeCheck()
	{
		timeLinePlayer.time = slider.value;
	}
	/// <summary>
	/// 开始暂停按钮
	/// </summary>
	public void StartPlay()
	{
		if (!isPlay)
		{
			timeLinePlayer.Play();
			playButton.GetComponent<Image>().sprite = pause;
			isPlay = true;
			Time.timeScale = speed;
		}
		else
		{
			timeLinePlayer.Pause();
			playButton.GetComponent<Image>().sprite = play;
			isPlay = false;
			Time.timeScale = 0f;
		}
	}
	/// <summary>
	/// 显示进度条并初始化
	/// </summary>
	public void ShowSlider()
	{
		slider.gameObject.SetActive(true);

		slider.maxValue = (float)timeLinePlayer.duration;

		durationTime.text = slider.maxValue.ToString("00.00");

		speedText.text = "x1";

		speedx2.text = "x2";

		speed = 1.0f;

		StartPlay();
	}
	/// <summary>
	/// 结束并隐藏
	/// </summary>
	public void HiddenSlider()
	{
		isPlay = false;

		timeLinePlayer.Stop();

		slider.gameObject.SetActive(false);

		Time.timeScale = 1.0f;
	}
	/// <summary>
	/// 点击一次显示,再次点击隐藏
	/// </summary>
	public void ShowSpeed()
	{
		if (speedx2Button.gameObject.activeSelf)
		{
			speedx2Button.gameObject.SetActive(false);
		}
		else
		{
			speedx2Button.gameObject.SetActive(true);
		}
		
	}

	public void ChangeSpeed()
	{
		if(speedText.text=="x1")
		{
			speedText.text = "x2";
			speedx2.text = "x1";
			speed = 2.0f;
		}
		else
		{
			speedText.text = "x1";
			speedx2.text = "x2";
			speed = 1.0f;
		}
		Time.timeScale = speed;
		speedx2Button.gameObject.SetActive(false);
	}

}

3.脚本赋值和绑定相关事件

 

 

4.关于进度条无法铺满问题,可以修改以下部分解决

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中可以使用uGUI系统轻松地制作进度条。下面是一些简单的步骤: 1. 创建一个新的Canvas对象,它将包含进度条的所有元素。 2. 在Canvas上创建一个新的Image对象,用于表示进度条的填充。 3. 通过调整Image的宽度或高度属性设置进度条的初始值(例如,如果您希望进度条在50%处开始填充,则将其宽度设置为Canvas宽度的一半)。 4. 在Canvas上创建一个新的Text对象,用于显示进度条的百分比。 5. 创建一个C#脚本来控制进度条的行为。这个脚本应该包含一个公共方法,当进度条需要更新时调用。 6. 将脚本附加到Canvas对象上。 7. 在脚本的Update方法中更新进度条显示,并更新Text对象以显示进度的百分比。 以下是一个简单的C#脚本示例,用于控制进度条的行为: ```csharp using UnityEngine; using UnityEngine.UI; public class ProgressBar : MonoBehaviour { public Image barFill; public Text percentageText; private float currentValue = 0f; private float targetValue = 1f; private float fillSpeed = 0.5f; void Update () { if (currentValue < targetValue) { currentValue += fillSpeed * Time.deltaTime; barFill.fillAmount = currentValue; percentageText.text = Mathf.RoundToInt(currentValue * 100) + "%"; } } public void SetTargetValue(float value) { targetValue = value; } } ``` 在这个示例中,我们使用Image对象控制进度条的填充,并使用Text对象显示进度的百分比。我们还定义了一个公共方法SetTargetValue,用于在外部控制进度条的目标值。在Update方法中,我们使用当前值和目标值之间的线性插值来更新进度条显示,同时更新Text对象以显示当前进度的百分比。 您可以使用此脚本的示例代码在您的Unity项目中创建进度条
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值