我学院:unity中movieTexture实现视频播放的方法
- 格式:docx
- 大小:102.21 KB
- 文档页数:3
Unity的动画重新播放暂停继续播放(AnimationAnimator)解决动画像播电影。
⼀. 重新播放Animator.Play(state, layer, normalizedTime)normalizedTime值得范围是0-1,当normalizedTime为0时就可以做到重播的效果通过设置normalizedTime的值可以做到让动画从某⼀个位置播放(解决动画上⼀步下⼀步的播放问题)layer是从0开始的⽐如有⼀个叫“hit”的动画,在layer 0层中则animator.Play("hit", 0, 0f);⼆. 暂停和继续播放1. Animotor// 播放animator.Play("ani_name");//animator.SetBool(isPlay,true)//切换动画状态机,的⽅式播放动画// 暂停animator.speed = 0;// 继续播放animator.speed = 1;2. Animation// 播放animition.Play("ani_name");// 暂停animition["ani_name"].speed = 0;// 继续播放animition["ani_name"].speed = 1;三、从动画某⼀帧开始播放//当前动画机播放时长currentTime = anim.GetCurrentAnimatorStateInfo(0).normalizedTime;//动画⽚段长度float length = anim.GetCurrentAnimatorClipInfo(0)[0].clip.length;//获取动画⽚段帧频float frameRate = anim.GetCurrentAnimatorClipInfo(0)[0].clip.frameRate;//计算动画⽚段总帧数float totalFrame = length / (1 / frameRate);//计算当前播放的动画⽚段运⾏⾄哪⼀帧int currentFrame = (int)(Mathf.Floor(totalFrame * clipTime) % totalFrame);(clipTime改为currentTime) Debug.Log(" Frame: " + currentFrame + “/” + totalFrame);///从某⼀帧开始播放动画public void OnPlayAnimatorFromFrame(string stateName,float frame){anim.Play(stateName,0,frame);playSpeed=1;}void OnClick(){ if(!animInfo.IsName("idel")) { var frame=frameTemp/TotleFrame;//frameTemp为当前位置的帧值,在配置表中获取;TotleFrame为当前动画总帧数 if(frame>=0&&frame<1) { OnPlayAnimatorFromFrame(anim.GetCurrentAnimatorClipInfo(0)[0],frame); } }}四、进度条控制动画播放public Slider AnimatorSlider;void Start(){AnimatorSlider.onValueChanged.AddListener(OnSliderController);}void OnSliderController(float value){ if(anim!=null&&!animInfo.IsName("idel")) { OnAnimatorPlay(anim.GetCurrentAnimatorClipInfo(0)[0],value); }}public void OnAnimatorPlay(string stateName,float frame){ anim.Play(stateName,0,frame); }。
Unity3d动画脚本Animation Scripting使用方法Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理)也许这一篇文章的内容有点枯燥,但我要说的是如果你想深入的了解游戏引擎是如何处理动画片断或者素材并让玩家操控的角色动起来栩栩如生,那么这真是一篇好文章(当然我仅仅是翻译了一下)动画脚本 Animation ScriptingUnity's 动画系统允许你创建一个漂亮的动画蒙皮角色. 动画系统支持动画融合,混合,添加动画,步调周期时间同步.动画层.控制动画回放的所有方面(时间,速度,混合权重) 每个顶点有1.2.4个骨骼影响的mesh,基于物理系统的布娃娃系统,另外还有程序动画.为了获得最佳效果推荐您在制作模型和动画绑定前阅读一下 Modeling Optimized Characters 章节.制作一个动画角色主要包括两个方面; 在世界中移动和由此产生的动画. 如果你想了解角色移动相关的更多内容, 请参阅 Character Controller page. 实际上角色动画是由Unity's 脚本界面完成的 .你可以下载 example demos 中预设置好的动画角色. 当你学完本页的基础部分你还可以看一看 animation script interface.如果需要你可以点击并快速转到以下主题:· Animation Blending 动画融合· Animation Layers 动画层· Animation Mixing 动画混合· Additive Animation 附加动画· Procedural Animation 程序动画· Animation Playback 和 Sampling 动画重放和取样Animation Blending 动画融合在现今的游戏中Animation Blending是一项保证游戏动画顺畅过渡的基本的特性.动画师创建的动画例如: walk 循环, run 循环, idle原地空闲动画或射击动画.在游戏的任何时间点你都有可能从空闲站立转换到走动,反之亦然. 当然你不希望两个不同的动作之间突然跳转, 你需要动画平滑过渡.而这个问题的解决就依赖动画融合技术. 在Unity中你可以让同一个角色拥有任意数量的动画.所有这些动画融合添加成为一个总的动画.首先我们来为一个角色添加两个动画原地空闲站立和走动并平滑的使这两个动画过渡. 为了使我们在写脚本时简单些, 首先我们设置动画的 Wrap Mode为 Loop. 然后关闭 Play Automatically来让我们的脚本来独占动画的播放.我们第一个动画脚本很简单; 我们需要一些方法来探查角色移动的有多快, 然后在走和站立之间淡入淡出. 在这个简单的测试中我们使用 pre-setup input axes.function Update () {if (Input.GetAxis("Vertical") > 0.2)animation.CrossFade ("walk");elseanimation.CrossFade ("idle");}下面我们来让这个脚本运行:1. 创建一个js脚本 Assets->Create Other->Javascript.2. 把代码拷贝进去3. 把脚本拖拽给角色 character (It needs to be the same GameObject as the animation)点击Play 按钮, 当你按上下键时角色会走动,松开上下键时角色站立不动.动画层Animation Layers层是一个非常有用的概念它可以让你将动画片段任意成组并且区分优先顺序.在Unity's动画系统中, 你可以混合任意数量的动画片段. 你可以手工分配权重或者直接使用animation.CrossFade(),来自动分配权重.混合权重混合权重总是在应用前被规格化 normalized比如说我们现在有一个 walk cycle 和一个run cycle, 权重都是1 (100%).当unity计算最终动画时会规格化权重, 这意味着 walk占50% 权重, run cycle占50% 权重.这在大多数情况下都是不错的, 但当两个动画片段同时运行而其中一个权重明显大于另外一个. 那么你需要手动调整权重值,但如果你使用动画层来解决这个问题过程会容易得多.制作动画层的范例Layering Example例如现在你有一个射击动画, 一个空闲站立,一个走动循环. 你需要在走和站两个动作间持续的淡入淡出(在玩家走动速度的基础上) 但当玩家射击时我们只想展示射击动画. 因而射击动画此时的优先度最高.为了达到这一目的最简单的方法是在射击时简单的保持 walk 和 idle动画. 接下来需要确定shoot animation在一个比idle 和 walk更高的层. 这意味着shoot animation 将首先收到混合权重. walk 和idle 只有在 shoot animation不使用 100% 混合权重的情况下接收权重. 所以当 CrossFading the shoot animation in, 权重将从0开始很短时间内到达 100%. 在开始阶段 walk 和 idle 层将依然可以收到混合权重但当 shoot animation 完全切入时, 他们就收不到权重了. 这才是我们需要的!function Start () {// Set all animations to loop 设置所有动画为循环animation.wrapMode = WrapMode.Loop;// except shooting 除了射击(不循环)animation["shoot"].wrapMode = WrapMode.Once;//放置idle 和 walk 进低一级别的 layers (默认 layer 总是 0)// This will do two things这将作两件事情// - 当 calling CrossFade时,由于shoot 和 idle/walk 在不同的layers 中// 它们将不会影响互相之间的重放.// - 由于 shoot 在高一级的 layer, 当faded in 时shoot动画将替换// idle/walk 动画 .animation["shoot"].layer = 1;// Stop animations that are already playing停止已经播放的动画//(万一 user 忘记的话,自动disable播放)animation.Stop();}function Update () {// Based on the key that is pressed,基于按下的键// play the walk animation or the idle animation播放走,站动画if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1)animation.CrossFade("walk");elseanimation.CrossFade("idle");// Shoot射击if (Input.GetButtonDown ("Fire1"))animation.CrossFade("shoot");}默认情况下 animation.Play() 和 animation.CrossFade() 将停止或淡出在同一层里面的动画. 这是我们在绝大多数情况下需要的. 在我们shoot, idle, run 范例中, 播放 idle 和 run 将不会影响到 shoot动画反之亦然 (you can change this behavior(行为) with an optional parameter(任意参数) to animation.CrossFade if you like).动画混合Animation Mixing动画混合可以让你缩减你必须为游戏制作的动画片断数量,方法是制作只对身体某个部分起作用的动画. 这意味着这些动画可以和其他动画合并起来一起使用.如果你想给一个动画添加 animation mixing transform to an animation by calling AddMixingTransform() on the given AnimationState.混合范例Mixing Example例如你可能有一个挥手(hand-waving)动画. 你可能需要让一个空闲站立(idle)角色或者一个走动(walking)角色来挥手. 如果没有动画混合你可能需要制作两个挥手hand-waving 动画 : 一个给 idle, 一个给walking. 可是, 如果你将挥手(hand-waving)动画作为一个mixing transform 添加到shoulder transform,挥手动画将只控制肩膀. 身体余下部位不受其影响, 下半身会继续播放idle 或者walk 动画. 因而你只需要一个挥手(hand-waving)动画./// Adds a mixing transform using a Transform variablevar shoulder : Transform;animation["wave_hand"].AddMixingTransform(shoulder);Another example using a path.function Start () {// Adds a mixing transform using a path insteadvar mixTransform : Transform = transform.Find("root/upper_body/left_shoulder");animation["wave_h和"].AddMixingTransform(mixTransform);}附加动画 Additive Animations附加动画和动画混合可以让你缩减为游戏制作的动画片断的数量,并且对面部动画(facial animations)来说非常重要.让我们来看看如果创建一个在跑和转身时身体可以自动倾斜的角色.你已经制作好了一个 walk 和 run循环, 现在你还要制作一个走动左倾( walk-lean-left), 走动右倾(walk-lean-right), 跑左倾(run-lean-left), 跑右倾(run-lean-right)动画.这意味着你需要多做4个动画片断! 制作这么多数量的动画会累死人的. 而附加动画(Additive animations) 和混合(Mixing) 可以大大减少这些工作量!附加动画范例 Additive Animation Example附加动画允许你在顶层覆盖其他所有可能播放的动画的效果( allow you to overlay the effects of animation on top of any others that may be playing). 当你制作一个附加动画时, Unity将计算动画片断里的第一帧 (first frame)和当前帧(current frame)的差异. 然后它将在所有其他播放的动画之上应用这个差异(Then it will apply this difference on top of all other playing animations).现在你只需要制作一个左倾( lean-left) 和右倾( lean-right)动画. Unity将为此倾斜动画新建一个层并置于walk, idle 或 run循环的层级之上.下面是代码Here is the code to make that happen:private var leanLeft : AnimationState;private var leanRight : AnimationState;function Start () {leanLeft = animation["leanLeft"];leanRight = animation["leanRight"];// Put the leaning animation in a separate layer// So that other calls to CrossFade won't affect it. yer = 10;yer = 10;// Set the lean animation to be additive 混合模式为附加leanLeft.blendMode = AnimationBlendMode.Additive; leanRight.blendMode = AnimationBlendMode.Additive;// Set the lean animation ClampForever// With ClampForever animations will not stop// automatically when reaching the end of the clipleanLeft.wrapMode = WrapMode.ClampForever;leanRight.wrapMode = WrapMode.ClampForever;// Enable the animation 和 fade it in completely// We don't use animation.Play here because we manually adjust the time // in the Update function.// Instead we just enable the animation 和 set it to full weight leanRight.enabled = true;leanLeft.enabled = true;leanRight.weight = 1.0;leanLeft.weight = 1.0;// For testing just play "walk" animation 和 loop itanimation["walk"].wrapMode = WrapMode.Loop;animation.Play("walk");}// Every frame just set the normalized time// based on how much lean we want to applyfunction Update () {var lean = Input.GetAxis("Horizontal");// normalizedTime is 0 at the first frame 和 1 at the last frame in the clip leanLeft.normalizedTime = -lean;leanRight.normalizedTime = lean;}提示Tip:当使用附加动画时它会判断你同时也在播放一些其他的使用了附加动画的非附加动画(it is critical that you are also playing some other non-additive animation on every transform that is also used in the additive animation), 否则动画将添加到最后一帧结果的顶部(animations will add on top of the last frame's result). 这通常不是你所需要的 (This is most certainly not what you want).程序动画角色Procedurally Animating Characters有时你需要程序化的驱动你的角色骨骼. 例如你可能需要你的角色的头注视3d空间的某个点. 这个活最好让脚本来干. 幸运的是, Unity做这个很容易. 在Unity 中所有骨骼来驱动蒙皮网格(skinned mesh)的变换(Transforms). 因而你可以给角色的骨骼写脚本,就和其他GameObject一样.很重要的一点是动画系统updates the Transforms 是在Update() function调用之后,LateUpdate() function 调用之前. 因而如果你要调用 LookAt() function 你应该do that in LateUpdate() to make sure that you are really overriding the animation.布娃娃系统Ragdolls 也是用同样的方法制作出来的. 你可以简单的把刚性物体(Rigidbodies), 角色关节(Character Joints) 和胶囊碰撞体(Capsule Colliders)连接给不同的骨骼. 这样物理系统就可以作用于蒙皮角色(skinned character). (什么是布娃娃系统,当你在射击类游戏中打死对手时可以注意到当角色快接近地面时,他的四肢开始瘫软在地面上,这个不是动画师调出来的,而是布娃娃系统自动计算出来的。
今天我们来做一个在Unity3D中实现视频播放的实例。
该文章出自【狗刨学习网】首先,Unity支持的播放视频格式有.mov、.mpg、.mpeg、.mp4、.avi和.asf。
我们只需要将这些文件放在项目文件夹里就可实现视频文件的导入。
在Window系统下,我们需要在苹果公司的QuickTime软件下才能顺利地将视频文件导入Unity。
如果视频文件含有音频文件,那么在导入Unity后会生成相应的音频文件。
在Unity3D中实现视频播放的方法有两种:基于纹理贴图、基于GUI。
我们下面分别来讲解:1、基于纹理贴图ing UnityEngine;ing System.Collections;3.4.public class MovieByTexture : MonoBehaviour {5.6. //电影纹理贴图7. public MovieTexture mMovie;8. //电影音频源9. private AudioSource mAudio;10.11. //媒体信息定义12. private string mediaName;//媒体名称13. private string mediaLength;//媒体长度14.15. void Start ()16. {17. mAudio=GetComponent();18. //设置当前对象的主纹理为电影纹理贴图19. renderer.material.mainTexture=mMovie;20. //设置电影纹理播放模式为循环21. mMovie.loop=true;22. //开始播放电影23. mMovie.Play();24. //开始播放音乐25. mAudio.Play();26. }27.28. void Update ()29. {30. //在这里更新媒体信息31. mediaName=;32. mediaLength=mMovie.duration.ToString();33. }34.35. void OnGUI()36. {37. //播放控制38. if(GUILayout.Button("播放",GUILayout.Height(30)))39. {40. mMovie.Play();41. mAudio.Play();42. }43. //暂停控制44. if(GUILayout.Button("暂停",GUILayout.Height(30)))45. {46. mMovie.Pause();47. mAudio.Pause();48. }49. //停止控制50. if(GUILayout.Button("停止",GUILayout.Height(30)))51. {52. mMovie.Stop();53. mAudio.Stop();54. }55.56. //绘制文本信息57. bel("媒体名称:"+mediaName,GUILayout.Height(30));58. bel("媒体长度:"+mediaLength,GUILayout.Height(30)); ;59. }60.}复制代码2、基于GUIing UnityEngine;ing System.Collections;3.4.public class MovieByGUI : MonoBehaviour {5.6. //电影纹理贴图7. public MovieTexture mMovie;8. //电影音频源9. private AudioSource mAudio;10.11. //媒体信息定义12. private string mediaName;//媒体名称13. private string mediaLength;//媒体长度14.15. void Start ()16. {17. mAudio=GetComponent();18. //设置当前对象的主纹理为电影纹理贴图19. renderer.material.mainTexture=mMovie;20. //设置电影纹理播放模式为循环21. mMovie.loop=true;22. //开始播放电影23. mMovie.Play();24. //开始播放音乐25. mAudio.Play();26. }27.28. void Update ()29. {30. //在这里更新媒体信息31. mediaName=;32. mediaLength=mMovie.duration.ToString();33. }34.35. void OnGUI()36. {37. //绘制电影纹理贴图38. GUI.DrawTexture(newRect(0,0,Screen.width,Screen.height),mMovie);39. //播放控制40. if(GUILayout.Button("播放",GUILayout.Height(30)))41. {42. mMovie.Play();43. mAudio.Play();44. }45. //暂停控制46. if(GUILayout.Button("暂停",GUILayout.Height(30)))47. {48. mMovie.Pause();49. mAudio.Pause();50. }51. //停止控制52. if(GUILayout.Button("停止",GUILayout.Height(30)))53. {54. mMovie.Stop();55. mAudio.Stop();56. }57.58. //绘制文本信息59. bel("媒体名称:"+mediaName,GUILayout.Height(30));60. bel("媒体长度:"+mediaLength,GUILayout.Height(30)); ;61. }62.}63.复制代码代码十分简单,这里不再赘述了。
unity中使⽤VideoPalyer播放本地视频using System;using UnityEngine;using System.Collections;using System.Collections.Generic;using System.IO;using UnityEngine.Video;using UnityEngine.UI;using TMPro;using UIWidgets;public class VideoPlayerControl : MonoBehaviour{//public static VideoPlayerControl Instance;//图像public RawImage m_image;//播放器public VideoPlayer m_vPlayer;//播放public Button m_btnPlay;//暂停public Button m_btnPause;public Button m_btnVolumnOn;public Button m_btnVolumnOff;//视频控制器public Slider m_sliderVideo;//⾳量控制器public Slider m_sliderSource;//当前视频时间public Text m_textTime;public TextMeshProUGUI m_videoName;//视频总时长public Text m_textCount;//⾳频组件public AudioSource m_source;//需要添加播放器的物体public GameObject m_obj;//是否拿到视频总时长public bool m_isShow;//前进后退的⼤⼩public float m_numBer = 20f;//时分的转换private int hour, mint;private float m_time;private float m_timeCount;private float m_timeCurrent;//视频是否播放完成private bool m_isVideo;bool isFullScreen = false;//隐藏视频控制按钮区域public GameObject m_videoControlArea;protected bool m_isShowUI;//树状图[SerializeField]public TreeView m_Tree;protected Vector2 m_videoAreaSize;protected Vector3 m_videoAreaAnchor;public GameObject m_fullScreenBtn;public GameObject m_unFullScreenBtn;void Awake(){//Instance = this;GetVideoName();}void Start(){m_image = m_obj.GetComponent<RawImage>();//⼀定要动态添加这两个组件,要不然会没声⾳m_vPlayer = m_obj.AddComponent<VideoPlayer>();m_source = m_obj.AddComponent<AudioSource>();//这3个参数不设置也会没声⾳唤醒时就播放关闭m_vPlayer.playOnAwake = false;m_source.playOnAwake = false;m_source.Pause();m_videoControlArea.SetActive(false);//初始化//Init(urlNetWork);m_btnPlay.onClick.AddListener(delegate { OnClick(0); });m_btnPause.onClick.AddListener(delegate { OnClick(1); });m_btnVolumnOn.onClick.AddListener(delegate { OnClick(2); });m_btnVolumnOff.onClick.AddListener(delegate { OnClick(3); });m_sliderSource.value = m_source.volume;//text.text = string.Format("{0:0}%", source.volume * 100);m_sliderSource.onValueChanged.AddListener(delegate { ChangeSource(m_sliderSource.value); });//全屏的默认值m_videoAreaSize = m_obj.GetComponent<RectTransform>().sizeDelta;m_videoAreaAnchor = m_obj.GetComponent<RectTransform>().anchoredPosition3D;}void Update(){if (m_vPlayer.isPlaying && m_isShow){//把图像赋给RawImagem_image.texture = m_vPlayer.texture;//帧数/帧速率=总时长如果是本地直接赋值的视频,我们可以通过VideoClip.length获取总时长m_sliderVideo.maxValue = (m_vPlayer.frameCount / m_vPlayer.frameRate);m_time = m_sliderVideo.maxValue;hour = (int)m_time / 60;mint = (int)m_time % 60;m_textCount.text = string.Format("{0:D2}:{1:D2}", hour.ToString(), mint.ToString());m_isShow = !m_isShow;}if (Mathf.Abs((int)m_vPlayer.time - (int)m_sliderVideo.maxValue) == 0){m_vPlayer.frame = (long)m_vPlayer.frameCount;m_vPlayer.Pause();m_isVideo = false;return;}else if (m_isVideo && m_vPlayer.isPlaying){m_time = (float)m_vPlayer.time;hour = (int)m_time / 60;mint = (int)m_time % 60;m_textTime.text = string.Format("{0:D2}:{1:D2}", hour.ToString(), mint.ToString());m_sliderVideo.value = m_time;}}///<summary>///获取⽂件夹下的⽂件列表///</summary>///<param name="path"></param>private void GetVideoName(){string path;Configuration cfg = ConfigManager.GetConfig("AppConfig.xml");cfg.Get("VideoPath", out path);if (!Directory.Exists(path)){Debug.LogError("教学视频路径不存在!");return;}DirectoryInfo dir = new DirectoryInfo(path);m_Tree.Nodes = InitTreeList(dir);m_Tree.gameObject.transform.Find("ScrollRect").GetComponent<ScrollRect>().horizontal = true;}///<summary>///初始化视频⽂件列表///</summary>private ObservableList<TreeNode<TreeViewItem>> InitTreeList(DirectoryInfo dir){ObservableList<TreeNode<TreeViewItem>> nodes = new ObservableList<TreeNode<TreeViewItem>>(); FileInfo[] files = dir.GetFiles();for (int i = 0; i < files.Length; i++){FileInfo file = files[i];TreeViewItem item = new CustomTreeViewItem(, null,file.FullName);TreeNode<TreeViewItem> node = new TreeNode<TreeViewItem>(item, null);nodes.Add(node);}DirectoryInfo[] childDirList = dir.GetDirectories();for (int i = 0; i < childDirList.Length; i++){DirectoryInfo childDir = childDirList[i];ObservableList<TreeNode<TreeViewItem>> childDirNodes = InitTreeList(childDir);TreeViewItem item = new CustomTreeViewItem(, null, null);TreeNode<TreeViewItem> childNode = new TreeNode<TreeViewItem>(item, childDirNodes);nodes.Add(childNode);}return nodes;}///<summary>///播放视频///</summary>///<param name="id"></param>public void PlayVideo(string fullName){Init(fullName);//@"E:\互动教学视频" +@"\"}public void OnSelect(int index, ListViewItem item){TreeViewComponent componentItem = item as TreeViewComponent;CustomTreeViewItem customItem = componentItem.Item as CustomTreeViewItem;//Debug.Log("Selected: " + index + "; name: " + + "; value: " + customItem.Value + "; data: " + customItem.Data);if (customItem.Data != null){Init(customItem.Data);m_videoName.text = ;}}///<summary>///初始化VideoPlayer///</summary>///<param name="url"></param>private void Init(string url){m_isVideo = true;m_isShow = true;m_timeCount = 0;m_timeCurrent = 0;m_sliderVideo.value = 0;//设置为URL模式m_vPlayer.source = VideoSource.Url;//设置播放路径m_vPlayer.url = url;//在视频中嵌⼊的⾳频类型m_vPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;//把声⾳组件赋值给VideoPlayerm_vPlayer.SetTargetAudioSource(0, m_source);m_vPlayer.controlledAudioTrackCount = 1;m_vPlayer.IsAudioTrackEnabled(0);//当VideoPlayer全部设置好的时候调⽤m_vPlayer.prepareCompleted += Prepared;//启动播放器m_vPlayer.Prepare();// player.Play();}///<summary>///改变⾳量⼤⼩///</summary>///<param name="value"></param>public void ChangeSource(float value){m_source.volume = value;// text.text = string.Format("{0:0}%", value * 100);}///<summary>///改变视频进度///</summary>///<param name="value"></param>public void ChangeVideo(){if (m_vPlayer.isPrepared){m_vPlayer.time = (long)m_sliderVideo.value;//Debug.Log((long)value);//Debug.Log("VideoPlayer Time:" + m_vPlayer.time);m_time = (float)m_vPlayer.time;hour = (int)m_time / 60;mint = (int)m_time % 60;m_textTime.text = string.Format("{0:D2}:{1:D2}", hour.ToString(), mint.ToString());}{m_isVideo = true;}m_vPlayer.Play();}private void OnClick(int num){switch (num){case0:m_vPlayer.Play();m_btnPlay.gameObject.SetActive(false);m_btnPause.gameObject.SetActive(true);Time.timeScale = 1;break;case1:m_vPlayer.Pause();m_btnPlay.gameObject.SetActive(true);m_btnPause.gameObject.SetActive(false);Time.timeScale = 0;break;case2:m_source.volume = 0;m_btnVolumnOn.gameObject.SetActive(false);m_btnVolumnOff.gameObject.SetActive(true);break;case3:m_source.volume = m_sliderSource.value;m_btnVolumnOn.gameObject.SetActive(true);m_btnVolumnOff.gameObject.SetActive(false);break;default:break;}}void Prepared(VideoPlayer player){player.Play();}///<summary>///当⿏标进⼊到下⽅进度条区域时显⽰进度条///</summary>public void OnControllAreaPointEnter(){if (!m_isShowUI){m_videoControlArea.SetActive(true);m_isShowUI = true;}}///<summary>///当⿏标离开下⽅进度条区域时隐藏进度条///</summary>public void OnControllAreaPointExit(){if (m_isShowUI){m_videoControlArea.SetActive(false);m_isShowUI = false;}}public void OnFullScreenBtnClick(){if (!isFullScreen && m_vPlayer.isPrepared){var rt = m_image.GetComponent<RectTransform>();RectTransform fullScreen = GameObject.Find("MainUI").GetComponent<RectTransform>();//m_image.GetComponent<RectTransform>().sizeDelta = new Vector2(Screen.width, Screen.height); rt.localScale = new Vector3(fullScreen.rect.width / rt.rect.width, fullScreen.rect.height / rt.rect.height, 0); rt.position = fullScreen.position;isFullScreen = true;m_fullScreenBtn.SetActive(false);m_unFullScreenBtn.SetActive(true);}else{m_image.GetComponent<RectTransform>().localScale = Vector3.one;m_image.GetComponent<RectTransform>().anchoredPosition3D = m_videoAreaAnchor;m_fullScreenBtn.SetActive(true);m_unFullScreenBtn.SetActive(false);}}public void OnSelectTab(int id){if (id == 4){//m_tree.SelectNode(m_tree.DataSource[0].Node);if (m_Tree.SelectedNode != null){m_Tree.DeselectNode(m_Tree.SelectedNode); }}}}。
unity3d中文教程之制作视频播放画面在Unity3D中,制作视频播放画面可以通过几个步骤实现。
下面将详细介绍如何使用Unity3D制作视频播放画面。
第一步,准备视频素材。
首先需要准备一个视频文件,可以是mp4、avi、mov等常见的视频格式。
确保视频文件的路径正确,并将视频文件拖入Unity3D项目的Assets文件夹中。
第二步,创建一个新的场景。
在Unity的Hierarchy面板中,右键点击空白处,选择Create Empty创建一个新的空物体。
将其命名为VideoPlayer,并将其位置设置为(0, 0, 0)。
第四步,设置视频播放画面。
在VideoPlayer组件的Inspector面板中,可以设置视频的播放模式、音频输出、循环播放等参数。
可以根据需要进行调整。
第五步,创建一个新的游戏对象。
在Hierarchy面板中,右键点击VideoPlayer物体,选择Create Empty创建一个新的空物体。
将其命名为VideoScreen,并将其位置设置为(0, 0, 0)。
第七步,设置VideoPlayer为RawImage的Texture。
在Inspector 面板中,将VideoPlayer拖拽到RawImage组件的Texture属性上,即可将视频播放画面显示在RawImage上。
第八步,编写脚本控制视频的播放。
创建一个新的C#脚本,命名为VideoController,并将其挂载到VideoPlayer物体上。
在脚本中编写相应的代码,可以使用VideoPlayer组件提供的方法和属性来控制视频的播放、暂停、停止等操作。
Unity通过按钮控制视频播放与停⽌1. 创建Canvas--RawImage。
2. 导⼊视频资源(在Assets⽬录下新建Video⽂件夹),直接将视频拖⼊Video⽂件夹。
3. 将导⼊的视频拖⼊第1步新建的RawImage,RawImage右边的Inspector栏将⾃动出现Video Player。
将导⼊的视频拖⼊Video Clip。
4. 创建按钮Button,text改成暂停。
5. 创建C#脚本Movie,控制视频播放与暂停。
脚本如下:using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.Video;using UnityEngine.UI;public class Movie : MonoBehaviour{public Text text_PlayOrPause;public Button button_PlayOrPause;private VideoPlayer videoPlayer;private RawImage rawImage;private int flag = 0;//private AudioSource audioSource;// Start is called before the first frame updatevoid Start(){videoPlayer = this.GetComponent<VideoPlayer>();//audioSource = this.GetComponent<AudioSource>();rawImage = this.GetComponent<RawImage>();button_PlayOrPause.onClick.AddListener(PlayorPause);}void Update(){//判断视频播放情况,播放则按钮显⽰暂停,暂停就显⽰播放,并更新相关⽂本//没有视频则返回,不播放if (flag == 0){if (videoPlayer.texture == null){return;}//渲染视频到UGUIelse{rawImage.texture = videoPlayer.texture;flag++;}}}void PlayorPause(){if (videoPlayer.isPlaying == true){videoPlayer.Pause();//audioSource.Pause();text_PlayOrPause.text = "播放";}else{videoPlayer.Play();//audioSource.Play();text_PlayOrPause.text = "暂停";}}}6. 将脚本挂载到Canvas--RawImage并设置相关参数,将第4步创建的Button拖⼊Button_Play Or Pause,Button下的Text拖⼊Text_Play Or Pause,如下图。
unity movietexture播放原理Unity中的MovieTexture是用于在Unity中播放视频的一种资源类型。
它允许你在Unity场景中引入视频内容,将其作为纹理映射到物体表面。
以下是MovieTexture播放视频的基本原理:1. 导入视频:-首先,你需要将视频文件导入到Unity项目中。
这通常是通过将视频文件拖拽到Unity的Project窗口中完成的。
-导入后,Unity会自动将其转换为MovieTexture。
2. 创建MovieTexture:-在导入视频后,Unity会生成一个MovieTexture。
你可以在Inspector窗口中查看和设置这个纹理。
- MovieTexture提供了播放、暂停、停止和调整播放进度等基本控制功能。
3. 应用MovieTexture:-将MovieTexture拖拽到场景中的一个物体的纹理槽中,即可将视频播放作为该物体的表面。
-你可以在材质的Shader中设置MovieTexture,使得视频能够在物体表面实时播放。
4. 播放控制:-你可以通过编写脚本控制MovieTexture的播放。
例如,通过绑定按钮点击事件来控制播放和暂停。
- Unity提供了MovieTexture的相关方法和属性,如`Play()`、`Pause()`和`Stop()`,可以被脚本调用。
5. 视频同步和播放状态:- MovieTexture播放视频时,会自动处理视频的同步问题,确保视频播放与音频同步。
-你可以通过监听MovieTexture的事件来获取播放状态,如`OnPlaybackComplete`事件,表示视频播放完成。
6. 性能考虑:-由于视频文件通常较大,使用MovieTexture时要注意内存和性能消耗。
-确保在适当的时机释放不再需要的MovieTexture,以避免不必要的资源占用。
Unity的MovieTexture提供了一个简单而强大的方式来在游戏中嵌入视频内容,使得开发者可以更容易地实现丰富的视觉体验。
UnityShader实现序列帧动画效果本⽂实例为⼤家分享了Unity Shader序列帧动画效果的具体代码,供⼤家参考,具体内容如下实现原理主要的思想是设置显⽰UV纹理的⼤⼩,并逐帧修改图⽚的UV坐标。
(可分为以下四步)1、我们⾸先把 _Time.y 和速度属性_Speed 相乘来得到模拟的时间,并使⽤CG 的floor 函数对结果值取整来得到整数时间time2、然后,我们使⽤time 除以_HorizontalAmount 的结果值的商来作为当前对应的⾏索引,除法结果的余数则是列索引。
3、接下来,我们需要使⽤⾏列索引值来构建真正的采样坐标。
由于序列帧图像包含了许多关键帧图像,这意味着采样坐标需要映射到每个关键帧图像的坐标范围内。
我们可以⾸先把原纹理坐标i.uv 按⾏数和列数进⾏等分,得到每个⼦图像的纹理坐标范围。
4、然后,我们需要使⽤当前的⾏列数对上⾯的结果进⾏偏移,得到当前⼦图像的纹理坐标。
需要注意的是,对竖直⽅向的坐标偏移需要使⽤减法,这是因为在Unity 中纹理坐标竖直⽅向的顺序(从下到上逐渐增⼤)和序列帧纹理中的顺序(播放顺序是从上到下〉是相反的。
这样,我们就得到了真正的纹理采样坐标。
Unity Shader实现序列帧动画的代码:Shader "Unlit/Demo-SequenceAnimation"{Properties{_MainTex ("Sequence Frame Image", 2D) = "white" {} // 序列帧动画纹理_Color("Color Tint", Color) = (1, 1, 1, 1) // 颜⾊_HorizontalAmount("Horizontal Amount", float) = 4 // ⾏数_VerticalAmount("Vertical Amount", float) = 4 // 列数_Speed("Speed", Range(1, 100)) = 30 // 播放速度}SubShader{// 由于序列帧图像通常包含了透明通道,因此可以被当成是⼀个半透明对象。
Unity VideoPlayer 的使用案例1. 引言在现代的游戏开发中,视频播放已经成为游戏中不可或缺的一部分。
而 Unity 提供的 VideoPlayer 组件可以方便地实现视频播放功能。
在本文中,我们将探讨 Unity VideoPlayer 的使用案例,以便更好地理解如何在游戏中使用这一功能。
2. VideoPlayer 的基本介绍Unity 的 VideoPlayer 组件可以让我们在游戏中播放视频,支持多种视频格式,并且可以以纹理形式展示在游戏场景中。
这为游戏开发者提供了更多的可能性,可以在游戏中加入更多的剧情、故事情节或者广告内容。
3. 视频背景动画一种常见的使用案例是将视频作为游戏的背景动画。
通过VideoPlayer 组件,我们可以在游戏开始页面或者选关页面播放一个精美的视频,来吸引玩家的注意,为游戏增加更多的视觉效果。
4. 游戏剧情展示在游戏中加入视频可以更好地讲述游戏的剧情。
通过视频,我们可以展现更加丰富的故事情节,增加玩家的代入感和沉浸感。
在一些冒险类游戏或者解谜类游戏中,加入视频可以为游戏增加更多的趣味性。
5. 游戏广告内容在一些免费游戏中,开发者需要通过游戏中的广告来获得收益。
而VideoPlayer 组件可以很方便地实现在游戏中播放广告视频的功能。
通过精心设计的广告内容,可以为游戏增加更多的盈利机会。
6. 个人观点和理解对于我个人来说,我认为 Unity VideoPlayer 的使用案例是非常丰富多样的。
通过VideoPlayer,我们可以在游戏中呈现更多的内容形式,为游戏增加更多的亮点。
但在使用的过程中,我们也需要注意视频格式的兼容性、视频文件大小对游戏性能的影响等问题。
7. 总结与回顾通过本文的探讨,我们更深入地了解了 Unity VideoPlayer 的使用案例。
从背景动画到游戏剧情展示,再到游戏广告内容,VideoPlayer的应用范围非常广泛。
在游戏开发中,我们可以根据游戏的需求,灵活地运用 VideoPlayer 组件,为游戏增添更多的精彩内容。
Unity Animation的常见属性及使用方法function Play (mode : PlayMode = PlayMode.StopSameLayer) : boolfunction Play (animation : string, mode : PlayMode = PlayMode.StopSameLayer) : boolPlay()将开始播放名称为animation的动画,或者播放默认动画。
动画会突然开始播放而没有任何混合。
如果模式是PlayMode.StopSameLayer,那么所有在同一个层的动画将停止播放。
如果模式是PlayMode.StopAll,那么所有当前在播放的动画将停止播放。
如果动画已经在播放过程中,别的动画将停止但是动画不会回退到开始位置。
如果动画没有被设置成循环模式,它将停止并且回退到开始位置。
如果动画不能被播放(没有动画剪辑或者没有默认动画),Play()将返回false。
// 播放默认动画。
animation.Play();// Plays the walk animation - stops all other animations in the same layer// 播放walk动画- 停止同一层的其他动画。
animation.Play("walk");// Plays the walk animation - stops all other animations// 播放walk动画- 停止其他动画。
animation.Play("walk", PlayMode.StopAll);Animation.CrossFade淡入淡出:function CrossFade (animation : string, fadeLength : float = 0.3F, mode : PlayMode = PlayMode.StopSameLayer) : void在一定时间内淡入名称为name的动画并且淡出其他动画。
unity中movieTexture实现视频播放的方法
可以直接将ogg格式的材质赋给物体,这样需要加代码让这个这个视频播放起来。
function Update () {
renderer.material.mainTexture.Play();
}
这里的代码,实现播放暂停以及切换视频。
不过这个代码要赋给摄像机,如果赋给物体的话在编辑器里好用,但是发布出来的时候就不好用了。
public var bofang:boolean = false;
public var movieTexture:MovieTexture;
function Start(){
movieTexture.Stop();
}
private var flag01:boolean = true;
function Update(){
if(!bofang){
return;
}
// 赋值剪辑到音频源
// 与音频同步播放
audio.clip = movieTexture.audioClip;
// 播放视频和音频
movieTexture.loop = true;
//renderer.material.mainTexture.wrapMode = TextureWrapMode.Clamp;
if(flag01){
movieTexture.Play();
audio.Play();
}else{
movieTexture.Pause();
audio.Pause();
}
}
//加上播放暂停关闭
//播放器
private var BFQWidth:float = 650;
private var BFQHeight:float = 490;
var BFQTexture:Texture;
private var BFQGBWidth:float = 16;
private var BFQGBHeight:float = 15;
var BFQGBStyle:GuiStyle;//关闭按钮
//播放器播放暂停
private var BFQPlayWidth:float = 22;
private var BFQPlayHeight:float = 22;
var BFQPlayStyle:GUIStyle;//播放按钮
var BFQPauseStyle:GUIStyle;//暂停按钮
function OnGUI(){
if(!bofang){
return;
}
GUI.DrawTexture(new Rect(187, 139, BFQWidth, BFQHeight), BFQTexture, ScaleMode.StretchToFill);
GUI.DrawTexture (Rect (192,144, 640, 480),movieTexture,ScaleMode.ScaleToFit ); movieTexture.Play();
//关闭按钮
if(GUI.Button (Rect (800, 155, BFQGBWidth, BFQGBHeight),"",BFQGBStyle)){
GameObject.Find("Data").GetComponent("Data").cameraMain.enabled = true; GameObject.Find("Data").GetComponent("Data").cameraView.enabled = false;
bofang = false;
guiTexture.texture = null;
gameObject.GetComponent("MovieControler").enabled = false;
}
//播放暂停
if(!flag01){
if(GUI.Button (Rect (800, 597, BFQPlayWidth, BFQPlayHeight),"",BFQPlayStyle)){
flag01 = true;
}
}else{
if(GUI.Button (Rect (800, 597, BFQPlayWidth, BFQPlayHeight),"",BFQPauseStyle)){
flag01 = false;
}
}
}
function GuanBi(){
GameObject.Find("Data").GetComponent("Data").cameraMain.enabled = true; GameObject.Find("Data").GetComponent("Data").cameraView.enabled = false; bofang = false;
guiTexture.texture = null;
gameObject.GetComponent("MovieControler").enabled = false;
}
// 确保我们有GUI 纹理和音频源
@script RequireComponent(GUITexture)
@script RequireComponent(AudioSource)。