首页 > 代码库 > Unity视频播放可添加控制按钮方案

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的使用,

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

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

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


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