一般在游戏中,经常会有一段游戏故事背景视频,而且有一个跳过的按钮,点击后会跳过视频进入游戏。经过资料搜索,一般在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的使用,
我也用了类似的方法,可以使输入框将界面往上顶。
好了,大家可以按照我的方案自己进行尝试了,不发源码也是希望大家能自己动手尝试
一下并加深印象,如有问题可以留言。