Unity视频播放可添加控制按钮方案

一般在游戏中,经常会有一段游戏故事背景视频,而且有一个跳过的按钮,点击后会跳过视频进入游戏。经过资料搜索,一般在Unity的话,在手机终端会调用

Handheld.PlayFullScreenMovie("test.mp4",Color.black,

FullScreenMovieControlMode.CancelOnInput);

最后一个参数总共有4种:

FullScreenMovieControlMode.CancelOnInput,

FullScreenMovieControlMode.Full,

FullScreenMovieControlMode.Hidden,

FullScreenMovieControlMode.Minimal;

而且一般都会在voidStart()调用。不过该方法不可控制,播放一次后就消失了,无法满足自己的需求。

经过多次尝试,最后还是在Android中实现了该效果。具体实现代码如下:

package com.benny.test;

import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.VideoView;

import com.unity3d.player.UnityPlayerActivity;

public class MyUnityVideoTestActivity extends UnityPlayerActivity {

	private final String TAG = "My Unity Video";
	/** 当前的焦点内容 **/
	private View currView;
	/** 包含VideoView的内容 **/
	private ViewGroup newView;
	private VideoView video;
	private Handler handler = new Handler();
	private Runtime rt = Runtime.getRuntime();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        currView = getCurrentFocus();
        Log.i(TAG, currView.toString());
        /** 测试内存 **/
        Log.i(TAG, "onCreate free=" + rt.freeMemory());
    }

    public void showVideoView() {
		handler.post(new Runnable() {

			@Override
			public void run() {
				/** 隐藏当前的页面内容 必须隐藏  **/
				currView.setVisibility(View.GONE);
				newView = (ViewGroup)View.inflate(MyUnityVideoTestActivity.this, R.layout.main, null);
				/** 添加含有VideoView的页面内容 **/
			    addContentView(newView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
			    /** 测试内存 **/
			    Log.i(TAG, "addNewView free=" + rt.freeMemory());

			    video = (VideoView)newView.findViewById(R.id.video_view);
			    Button btn = (Button)newView.findViewById(R.id.skip);

			    video.setVideoURI(Uri.parse("android.resource://com.benny.test/"+R.raw.nimble_logo));
			    video.requestFocus();
			    video.start();
			    video.setOnCompletionListener(new OnCompletionListener() {

			    	@Override
					public void onCompletion(MediaPlayer mp) {
			    		removeNewView();
			    	}
			    });

				btn.setOnClickListener(new View.OnClickListener() {

					@Override
					public void onClick(View v) {
						video.stopPlayback();
						removeNewView();
					}
				});
			}
		});
    }

    private void removeNewView() {
    	if (newView != null) {
			newView.removeAllViews();
			/** 隐藏含有VideView的页面内容 只能隐藏没有办法remove  **/
			newView.setVisibility(View.GONE);
			/** 显示原来当前的页面内容  **/
			currView.setVisibility(View.VISIBLE);
			/** 测试内存 **/
			Log.i(TAG, "removeNewView free=" + rt.freeMemory());
		}
    }
}

main.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff" >

    <Button
        android:id="@+id/skip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right|top"
        android:text="跳过"/>

<VideoView
   android:id="@+id/video_view"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical" />

</FrameLayout>

视频放在res->raw文件夹中:

实现的原理,就是在UnityPlayerActivity下,通过addConentView添加我自定义的Video布局,

可以任意添加所需的控件,播放结束后需要将新添加的newView隐藏,目前没有办法将add的newView给remove掉。

至于其中的细节问题,都已经有注释了。

然后将Android项目添加到Unity项目中的Plugins文件夹中,至于如何添加,可以参考雨松MOMO的文章,见http://www.xuanyusong.com/archives/667

最后就是在Unity的脚本语言中直接调用Java代码即可

void Start () {
#if UNITY_ANDROID
// Handheld.PlayFullScreenMovie("nimble_logo.mp4", Color.black, FullScreenMovieControlMode.Hidden,
//                             FullScreenMovieScalingMode.AspectFit);
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")) {
jo.Call("showVideoView");
}
}
#endif
          ......
       }

该脚本是我一个场景中的脚本,这样的话,进入该场景直接能看到视频,即跳过按钮,视频播放完毕或者点击跳过按钮,就能进入到场景了,期间不会有任何画面上的异样,基本无缝对接。

PS:关于Unity视频播放添加可控制按钮,我在网上搜了很多资料,可惜很多都是转贴,大部分都是在脚本中调用Handheld.PlayFullScreenMovie,

根本就么找到一个可用的方案,也或许我的搜索关键字有问题吧。

后来经过多次尝试,终于找到这个比较完美的方案了,贴出来就是希望能给大家一些提示吧。

目前这个addContentView在我们公司的cocos2d-x关于EditText的使用,

我也用了类似的方法,可以使输入框将界面往上顶。

好了,大家可以按照我的方案自己进行尝试了,不发源码也是希望大家能自己动手尝试

一下并加深印象,如有问题可以留言。

时间: 2024-12-21 10:44:46

Unity视频播放可添加控制按钮方案的相关文章

Unity视频播放插件

资源名称:Unity视频播放插件下载? 资源大小:  36.2MB 资源类型: .unitypackage 安装要求:Unity 4.6.8 或更高版本 链接: https://pan.baidu.com/s/1miJr5AK 密码: v5cx 资源说明: 最近在研究Unity视频播放.虽然可以实现简单的视频播放功能,但是对于商业化或者移动端的项目来说远远不够(比如:当文件较大时,会出现明显的卡顿). 网上找了好多资料,试了好多插件,综合比较下来,AVPro Video是效果最好的.不仅可以实现

C#最良心脚本语言C#Light/Evil,Xamarin\WP8\Unity热更新最良心方案,再次进化.

C#Light的定位是嵌入式脚本语言,一段C#Light脚本是一个函数 C#Evil定位为书写项目的脚本语言,多脚本文件合作,可以完全用脚本承载项目. C#Light/Evil 使用完全C#一致性语法 目前 C#Light已经是正式版,且经商业项目检验 C#Evil是Alpha版,欢迎试用反馈. C#Evil在C#Light的基础上 从底层支持了面向对象,请注意下面是脚本代码 不同于C#Light没有函数和类的设计,(C#Light只是用C#LightFramework来模拟整个cs文件的识别,

关于Unity视频播放器插件 AVPro Video(三)360度全景视频播放

1.官网下载该插件或者我分享的链接: 链接:https://pan.baidu.com/s/1boGeJ8r 密码:mvbf 2.拖入官方做好的预制体"360SphereVideo"或者"360CubeVideo"(两种不同的360度全景)到场景中,并将场景中的摄像机拖动到"Sphere"下方并Resert 3.设置"AVPro Video Media Player"上的Media Player 控制组件即可(具体操作参考&q

Unity 视频播放杂谈

http://www.cnblogs.com/zsb517/p/4060814.html 背景: 游戏机中想加入舞蹈元素,最先的想法是开发舞蹈游戏,然后通过动画来表现舞蹈,给用户提供舞蹈教学方面的体验,但是舞蹈游戏本身的开发就需要很长的时间(就人太少),不用谈后续的舞蹈和音乐的版权啦,所以现在想走另外一条途径,在unity中播放舞蹈教学视频,加上UI和一些检测来实现舞蹈教学,而且这套框架写完之后,内容很容易扩展,毕竟不需要针对每个舞蹈设计动画.但是Unity中视频播放就是各种蛋疼,尤其是在and

关于Unity视频播放器插件 AVPro Video(一)平面UI视频播放

1.官网下载该插件或者我分享的链接: 链接:https://pan.baidu.com/s/1boGeJ8r 密码:mvbf 2.新建项目导入资源,添加以下游戏物体与UI到场景中 3.此处先建立一个Canvas再创建 4.将创建好的MediaPlayer组件拖入 5.根据自定义脚本持有该组件,控制该组件面板上的属性来间接控制视屏的播放 6.根据自定义的脚本创建自定义的开关,滚动条等显示UI 7.常用的实现功能脚本如下 1 /************************************

Unity实现c#热更新方案探究(一)

最近研究了一下如何在unity中实现c#的热更新,对于整个DLL热更新的过程和方案有一个初步的了解,这儿就写下来,便于后续的深入调查和方案选择. 一.C# DLL的动态加载和卸载 既然要热更新,那么就是动态的加载c#的DLL,所以第一步就是研究如何实现DLL的动态加载和卸载. 在CLR Via C#中,对于DLL的加载有详细的讲解,这儿就不再长篇幅的讲解整个过程,简单的来说,在C#的工程中,都会生成一个默认的程序域appDomain,就叫做DefaultAppDomain吧,在这个程序域的基础上

[译]如何在Unity编辑器中添加你自己的工具

在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它.你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作出的任何动作,这些全部都是用编辑器脚本来实现的. 这篇教程假设你已经熟悉Unity的基本工作流程.如果你知道如何在编辑器中创建物体.预设.场景并且知道如何移动它们,知道如何添加组件,那么你可以开始本教程的学习了. 最终结果预览 让我们看一下我们做出的最终结果是什么样子: 如你所见,我们会创建一个编辑

unity视频播放,

PC端视频播放: Unity中实现PC端播放视频,非常easy用到MovieTexture属于贴图Texture的子类. 在播放视频之前.我们得记得下载quicktime插件,仅仅有导入了quicktime插件.我们放在Asset以下的视频文件才会生产MovieTexture对象. MovieTexture既能够放在一个物体(比如.Plane.Cube)上,也能够直接放在GUI层面上. 以下我们就实现pane,或Cube上.用代码来控制视频播放了. 代码例如以下: void Start { //

Unity官方公布热更新方案性能对比

孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda ?  什么是热更新 ?  为何要热更新 ?  如何在iOS 上对Unity 应用进行热更新 ?  支持Unity iOS 热更新的各种Lua 插件的对比 什么是热更新 ? 广义定义 ? 无需关闭服务器,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码. ? 狭义定义( iOS热更新) ? 无需将代码重新打包提交至AppStore,即可更新客户端的执行代码,即