Unity 待机视频图片轮播功能

原先写过一次这个功能,后来因为有点bug就删除了,现在补回来,虽然重新写了一次吧,但是还是感觉代码有点多=。=,如果大佬们有优化的方法希望能告诉我下Thanks♪(・ω・)ノ

 

先说明下,视频是通过AVProVideo插件加载的,所以你们可能需要个这个插件(*^▽^*),图片就是通过WWW加载赋值在RawImage上的,这个比较简单。总体功能呢,就是当你的程序无人操作多长时间后开始图片和视频的循环播放(PC版),代码如下:

这个一开始StandVideoCanvas和RawImage是隐藏的

就是名字旁边的那个勾是不勾上的

using RenderHeads.Media.AVProVideo;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class Loading : MonoBehaviour 
	{

		public GameObject StandByVideoCanvas;//待机界面,加载vedio和rawimage的父物体
		public GameObject Video;//加载Vedio的界面
		public GameObject RawImage;//加载图片的界面
		public MediaPlayer MP;
		private DirectoryInfo dir;
		public float CountTimer = 0f;//计时时间,时间到了就开始播放
		private string path;
		private FileInfo[] videoFile;
		private int VideoIndex = 0;
		private FileInfo[] ImageFile;
		private int ImageIndex = 0;
		public float PictureTimer = 0;//图片播放时间
		private bool isPlayedVideo = false;
		private bool isStartPlay = false;
		private void Start()
		{
			MP.Events.AddListener(OnMediaPlayerEvent);
			path = "E:/TeaTable/图片视频轮播";
			dir = new DirectoryInfo(path);
			//加载文件并存储
			videoFile = dir.GetFiles("*.mp4", SearchOption.TopDirectoryOnly);
			ImageFile = dir.GetFiles("*.jpg", SearchOption.TopDirectoryOnly);
			if (ImageFile.Length != 0)
			{
				RawImage.GetComponent<RawImage>().texture = LoadPicture(0);
			}
			


		}

		/// <summary>
		/// AVProVideo自带回调
		/// </summary>
		/// <param name="arg0"></param>
		/// <param name="arg1"></param>
		/// <param name="arg2"></param>
		private void OnMediaPlayerEvent(MediaPlayer arg0, MediaPlayerEvent.EventType arg1, ErrorCode arg2)
		{
			switch (arg1)
			{
				case MediaPlayerEvent.EventType.FinishedPlaying:
					VideoIndex++;
					if (VideoIndex > videoFile.Length - 1)
					{
						VideoIndex = 0;
						if (ImageFile.Length != 0)
						{
							Video.SetActive(false);
							MP.gameObject.SetActive(false);
							RawImage.SetActive(true);
							isPlayedVideo = true;
							Debug.Log(123);
						}
					}
					MP.OpenVideoFromFile(MediaPlayer.FileLocation.AbsolutePathOrURL, path+"/"+videoFile[VideoIndex].Name);
					break;
				default:
					break;
			}
		}
		private Vector3 Pos1;//判断是否有用户操作的一个存储位置
		private void Update()
		{

			#region 视频图片轮播
			Vector3 Pos2 = Input.mousePosition;
			//判断鼠标是否在移动
			if (Pos1 != Pos2)
			{
				CountTimer = 0;
				if(StandByVideoCanvas.activeInHierarchy == true)
				{
					CloseStandByVideoCanvas();
				}
			}
			//待机计时
			if (!isStartPlay)
			{
				CountTimer += Time.deltaTime;
				if (CountTimer > 20f)
				{
					CountTimer = 0;
					isStartPlay = true;
					InitStandByVideoCanvas();
				}
				
			}
			//循环图片
			if (isPlayedVideo||(isStartPlay&& videoFile.Length == 0))
			{
				PictureTimer += Time.deltaTime;
				if (PictureTimer > 3f)
				{
					PictureTimer = 0;
					ImageIndex++;
					if (ImageIndex > ImageFile.Length - 1)
					{
						if(videoFile.Length != 0)
						{
							isPlayedVideo = false;
							InitStandByVideoCanvas();
						}
						else
						{
							ImageIndex = 0;
						}
						
					}
					RawImage.GetComponent<RawImage>().texture = LoadPicture(ImageIndex);

				}
			}
			Pos1 = Input.mousePosition;
			#endregion


		}
		
		
		public void InitStandByVideoCanvas()
		{
			VideoIndex = 0;
			ImageIndex = 0;
			StandByVideoCanvas.SetActive(true);
			if (videoFile.Length != 0)
			{
				MP.OpenVideoFromFile(MediaPlayer.FileLocation.AbsolutePathOrURL, path + "/" + videoFile[VideoIndex].Name);
				MP.gameObject.SetActive(true);
				Video.SetActive(true);
				RawImage.SetActive(false);
				isPlayedVideo = false;
			}
			else
			{
				MP.gameObject.SetActive(false);
				Video.SetActive(false);
				RawImage.SetActive(true);
				isPlayedVideo = true;
			}
			
		}
		/// <summary>
		/// 加载图片
		/// </summary>
		/// <param name="index"></param>
		/// <returns></returns>
		public Texture LoadPicture(int index)
		{
			WWW www = new WWW("file:///" + path + "/" + ImageFile[index].FullName);
			return www.texture;
		}
		/// <summary>
		/// 关闭
		/// </summary>
		public void CloseStandByVideoCanvas()
		{
			VideoIndex = 0;
			ImageIndex = 0;
			StandByVideoCanvas.SetActive(false);
			MP.gameObject.SetActive(true);
			MP.Stop();
			Video.SetActive(true);
			RawImage.SetActive(false);
			isPlayedVideo = false;
		    isStartPlay = false;
	}
	}

 

### 实现视频作为待机动画 在 Unity 中使用视频文件作为角色或界面的待机动画可以通过 Video Player 组件来完成。这不仅适用于 Spine 骨骼动画,也适合其他类型的 UI 或 3D 对象。 #### 准备工作 为了使视频能够像常规动画一样被控制,首先需要准备一段合适的视频资源并将其导入项目中。确保该视频支持循环播放特性以便适合作为 Idle 动作[^1]。 #### 设置 VideoPlayer 组件 对于想要应用视频待机效果的对象(无论是UI还是3D模型),添加 `VideoPlayer` 组件: ```csharp using UnityEngine; using UnityEngine.Video; public class VideoIdleController : MonoBehaviour { public VideoClip idleVideoClip; // 视频剪辑引用 private void Start() { var videoPlayer = gameObject.AddComponent<VideoPlayer>(); // 基础配置 videoPlayer.playOnAwake = true; videoPlayer.isLooping = true; // 循环播放 // 将视频映射到材质上 Renderer rendererComponent = GetComponent<Renderer>(); Material material = new Material(Shader.Find("Unlit/Texture")); rendererComponent.material = material; videoPlayer.targetTexture = new RenderTexture(Screen.width, Screen.height, 24); videoPlayer.renderMode = VideoRenderMode.RenderTexture; material.mainTexture = videoPlayer.targetTexture as Texture; // 加载指定的视频片段 videoPlayer.clip = idleVideoClip; } } ``` 这段脚本实现了将选定的视频文件设置为目标对象的纹理输入源,并启用了自动播放和循环功能[^2]。 #### 整合至状态机 如果希望进一步利用 Animator 控制不同状态下切换不同的视频内容,则可以在上述基础上做如下调整:创建多个带有各自专属视频素材的状态节点;通过编程方式改变当前激活状态从而触发相应视频的加载与播放。 例如,在原有代码的基础上扩展一个方法用于动态更改播放中的视频: ```csharp private void ChangeToAnotherState(string stateName){ Animator animatorCtrl = GetComponent<Animator>(); if(animatorCtrl.GetCurrentAnimatorStateInfo(0).IsName(stateName)){ return; } switch (stateName) { case "Walking": LoadAndPlaySpecificVideo(walkingVideoClip); break; default: LoadAndPlaySpecificVideo(idleVideoClip); break; } } void LoadAndPlaySpecificVideo(VideoClip clip){ var vp = GetComponent<VideoPlayer>(); vp.Stop(); vp.clip = clip; vp.Play(); } ``` 这样就可以根据实际需求灵活地管理多种基于视频的表现形式了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值