IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> UnityPlayerActivity详解 -> 正文阅读

[游戏开发]UnityPlayerActivity详解

如何查找UnityPlayerActivity

UnityPlayerActivity路径

C:\Program Files\Unity\Hub\Editor\2020.3.32f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player

class.jar路径(UnityPlayerActivity代码引用与calss.jar)

注意:什么时候选择il2pp。主要看unity中的设置

C:\Program Files\Unity\Hub\Editor\2020.3.32f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes

源码解析

`// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
package com.unity3d.player;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.os.Process;

public class UnityPlayerActivity extends Activity implements IUnityPlayerLifecycleEvents
{
protected UnityPlayer mUnityPlayer; // don’t change the name of this variable; referenced from native code

// Override this in your custom UnityPlayerActivity to tweak the command line arguments passed to the Unity Android Player
// The command line arguments are passed as a string, separated by spaces
// UnityPlayerActivity calls this from 'onCreate'
// Supported: -force-gles20, -force-gles30, -force-gles31, -force-gles31aep, -force-gles32, -force-gles, -force-vulkan
// See https://docs.unity3d.com/Manual/CommandLineArguments.html
// @param cmdLine the current command line arguments, may be null
// @return the modified command line string or null
protected String updateUnityCommandLineArguments(String cmdLine)
{
    return cmdLine;
}

// Setup activity layout
@Override protected void onCreate(Bundle savedInstanceState)
{
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);

    String cmdLine = updateUnityCommandLineArguments(getIntent().getStringExtra("unity"));
    getIntent().putExtra("unity", cmdLine);

    mUnityPlayer = new UnityPlayer(this, this);
    setContentView(mUnityPlayer);
    mUnityPlayer.requestFocus();
}

// When Unity player unloaded move task to background
@Override public void onUnityPlayerUnloaded() {
    moveTaskToBack(true);
}

// Callback before Unity player process is killed
@Override public void onUnityPlayerQuitted() {
}

@Override protected void onNewIntent(Intent intent)
{
    // To support deep linking, we need to make sure that the client can get access to
    // the last sent intent. The clients access this through a JNI api that allows them
    // to get the intent set on launch. To update that after launch we have to manually
    // replace the intent with the one caught here.
    setIntent(intent);
    mUnityPlayer.newIntent(intent);
}

// Quit Unity
@Override protected void onDestroy ()
{
    mUnityPlayer.destroy();
    super.onDestroy();
}

// If the activity is in multi window mode or resizing the activity is allowed we will use
// onStart/onStop (the visibility callbacks) to determine when to pause/resume.
// Otherwise it will be done in onPause/onResume as Unity has done historically to preserve
// existing behavior.
@Override protected void onStop()
{
    super.onStop();

    if (!MultiWindowSupport.getAllowResizableWindow(this))
        return;

    mUnityPlayer.pause();
}

@Override protected void onStart()
{
    super.onStart();

    if (!MultiWindowSupport.getAllowResizableWindow(this))
        return;

    mUnityPlayer.resume();
}

// Pause Unity
@Override protected void onPause()
{
    super.onPause();

    if (MultiWindowSupport.getAllowResizableWindow(this))
        return;

    mUnityPlayer.pause();
}

// Resume Unity
@Override protected void onResume()
{
    super.onResume();

    if (MultiWindowSupport.getAllowResizableWindow(this))
        return;

    mUnityPlayer.resume();
}

// Low Memory Unity
@Override public void onLowMemory()
{
    super.onLowMemory();
    mUnityPlayer.lowMemory();
}

// Trim Memory Unity
@Override public void onTrimMemory(int level)
{
    super.onTrimMemory(level);
    if (level == TRIM_MEMORY_RUNNING_CRITICAL)
    {
        mUnityPlayer.lowMemory();
    }
}

// This ensures the layout will be correct.
@Override public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    mUnityPlayer.configurationChanged(newConfig);
}

// Notify Unity of the focus change.
@Override public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);
    mUnityPlayer.windowFocusChanged(hasFocus);
}

// For some reason the multiple keyevent type is not supported by the ndk.
// Force event injection by overriding dispatchKeyEvent().
@Override public boolean dispatchKeyEvent(KeyEvent event)
{
    if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
        return mUnityPlayer.injectEvent(event);
    return super.dispatchKeyEvent(event);
}

// Pass any events not handled by (unfocused) views straight to UnityPlayer
@Override public boolean onKeyUp(int keyCode, KeyEvent event)     { return mUnityPlayer.injectEvent(event); }
@Override public boolean onKeyDown(int keyCode, KeyEvent event)   { return mUnityPlayer.injectEvent(event); }
@Override public boolean onTouchEvent(MotionEvent event)          { return mUnityPlayer.injectEvent(event); }
/*API12*/ public boolean onGenericMotionEvent(MotionEvent event)  { return mUnityPlayer.injectEvent(event); }

}
`

Unity升级需要注意及时更新和替换

Unity升级之后需要修改,看版本比对内容
也可以直接拷贝,然后activity 继承
在这里插入图片描述

重写UnityPlayerActivity需要注意的问题(不正确使用导致的黑屏)

直接从引擎内拷贝,尽量少修改

启动黑屏和切后台黑屏


    // Resume Unity
    @Override
    protected void onResume() {
        super.onResume();

//        if (MultiWindowSupport.getAllowResizableWindow(this))
//            return;
        LTBaseSDK.getInstance(this).onResume();
        mUnityPlayer.resume();

		//修复 sdk 切后台回来黑屏的问题,
        mUnityPlayer.postInvalidate();
        //下面的写法会引起启动黑屏,不建议使用
        //mUnityPlayer.windowFocusChanged(true);
        //mUnityPlayer.requestFocus();
       //onWindowFocusChanged(true);
        //Log.d(LOG_TAG, "onResume:" );
    }

来回切后台导致的unity焦点丢失黑屏


    // Resume Unity
    @Override
    protected void onResume() {
        super.onResume();

//        if (MultiWindowSupport.getAllowResizableWindow(this))
//            return;
        LTBaseSDK.getInstance(this).onResume();
        mUnityPlayer.resume();

		//修复 sdk 切后台回来黑屏的问题,
        mUnityPlayer.postInvalidate();
        //下面的写法会引起启动黑屏,不建议使用
        //mUnityPlayer.windowFocusChanged(true);
        //mUnityPlayer.requestFocus();
       //onWindowFocusChanged(true);
        //Log.d(LOG_TAG, "onResume:" );
    }

最终修改版本

package com.longtugame.rjsdk;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Window;
import android.database.Cursor;
import android.net.Uri;
import com.bh.sdk.Interface.LTBaseSDK;
import com.unity3d.player.IUnityPlayerLifecycleEvents;
//import com.unity3d.player.MultiWindowSupport;
import com.unity3d.player.UnityPlayer;

import org.json.JSONException;
import org.json.JSONObject;

import android.os.Process;

public class MainActivity extends Activity implements IUnityPlayerLifecycleEvents {
    private final static String LOG_TAG = "MainActivity";
    private int TAKE_PHOTO = 3;
    private int TAKE_VIDEO = 2;
    private int SELECT_PHOTO = 4;
    private int SELECT_VIDEO = 5;
    private static String m_listenerName = "";
    public static Context instance;
    public static String m_Spath = "";
    public Uri originalUri = null;
    public Bitmap m_Bitmap = null;
    public String m_Extension = "";
    public String m_tbPath = "";
    public Cursor cursor = null;
    public int column_index = -1;
    public String _path = "";


    protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code

    // Override this in your custom UnityPlayerActivity to tweak the command line arguments passed to the Unity Android Player
    // The command line arguments are passed as a string, separated by spaces
    // UnityPlayerActivity calls this from 'onCreate'
    // Supported: -force-gles20, -force-gles30, -force-gles31, -force-gles31aep, -force-gles32, -force-gles, -force-vulkan
    // See https://docs.unity3d.com/Manual/CommandLineArguments.html
    // @param cmdLine the current command line arguments, may be null
    // @return the modified command line string or null
    protected String updateUnityCommandLineArguments(String cmdLine) {
        return cmdLine;
    }

    // Setup activity layout
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        instance = getApplicationContext();
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);

        String cmdLine = updateUnityCommandLineArguments(getIntent().getStringExtra("unity"));
        getIntent().putExtra("unity", cmdLine);

        mUnityPlayer = new UnityPlayer(this, this);
        setContentView(mUnityPlayer);
        mUnityPlayer.requestFocus();
        //Log.d(LOG_TAG, "onCreate:" );
    }

    // When Unity player unloaded move task to background
    @Override
    public void onUnityPlayerUnloaded() {
        moveTaskToBack(true);
    }

    // Callback before Unity player process is killed
    @Override
    public void onUnityPlayerQuitted() {
    }

    @Override
    protected void onNewIntent(Intent intent) {
        // To support deep linking, we need to make sure that the client can get access to
        // the last sent intent. The clients access this through a JNI api that allows them
        // to get the intent set on launch. To update that after launch we have to manually
        // replace the intent with the one caught here.
        setIntent(intent);
        mUnityPlayer.newIntent(intent);
        LTBaseSDK.getInstance(this).onNewIntent(intent);
        //Log.d(LOG_TAG, "onNewIntent:" );
    }

    // Quit Unity
    @Override
    protected void onDestroy() {
        mUnityPlayer.destroy();
        super.onDestroy();
        LTBaseSDK.getInstance(this).onDestroy();
    }

    // If the activity is in multi window mode or resizing the activity is allowed we will use
    // onStart/onStop (the visibility callbacks) to determine when to pause/resume.
    // Otherwise it will be done in onPause/onResume as Unity has done historically to preserve
    // existing behavior.
    @Override
    protected void onStop() {
        super.onStop();
        LTBaseSDK.getInstance(this).onStop();
//        if (!MultiWindowSupport.getAllowResizableWindow(this))
//            return;

       // mUnityPlayer.pause();

    }

    @Override
    protected void onStart() {
        super.onStart();
        LTBaseSDK.getInstance(this).onStart();
//        if (!MultiWindowSupport.getAllowResizableWindow(this))
//            return;

       // mUnityPlayer.resume();

    }

    // Pause Unity
    @Override
    protected void onPause() {
        super.onPause();
        LTBaseSDK.getInstance(this).onPause();
//        if (MultiWindowSupport.getAllowResizableWindow(this))
//            return;

        mUnityPlayer.pause();

    }

    // Resume Unity
    @Override
    protected void onResume() {
        super.onResume();

//        if (MultiWindowSupport.getAllowResizableWindow(this))
//            return;
        LTBaseSDK.getInstance(this).onResume();
        mUnityPlayer.resume();

		//修复 sdk 切后台回来黑屏的问题,
        mUnityPlayer.postInvalidate();
        //下面的写法会引起启动黑屏,不建议使用
        //mUnityPlayer.windowFocusChanged(true);
        //mUnityPlayer.requestFocus();
       //onWindowFocusChanged(true);
        //Log.d(LOG_TAG, "onResume:" );
    }

    // Low Memory Unity
    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mUnityPlayer.lowMemory();
    }

    // Trim Memory Unity
    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (level == TRIM_MEMORY_RUNNING_CRITICAL) {
            mUnityPlayer.lowMemory();
        }
    }

    // This ensures the layout will be correct.
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mUnityPlayer.configurationChanged(newConfig);
        LTBaseSDK.getInstance(this).onConfigurationChanged(newConfig);
    }

    // Notify Unity of the focus change.
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        mUnityPlayer.windowFocusChanged(hasFocus);
        //Log.d(LOG_TAG, "onWindowFocusChanged:"+hasFocus );
    }

    // For some reason the multiple keyevent type is not supported by the ndk.
    // Force event injection by overriding dispatchKeyEvent().
    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
            return mUnityPlayer.injectEvent(event);
        return super.dispatchKeyEvent(event);
    }

    // Pass any events not handled by (unfocused) views straight to UnityPlayer
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        return mUnityPlayer.injectEvent(event);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            LTBaseSDK.getInstance(this).LTBaseSDKExitGame();
            return mUnityPlayer.injectEvent(event);
        }
        return super.onKeyDown(keyCode, event);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return mUnityPlayer.injectEvent(event);
    }

    /*API12*/
    public boolean onGenericMotionEvent(MotionEvent event) {
        return mUnityPlayer.injectEvent(event);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        LTBaseSDK.getInstance(this).onRestart();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        LTBaseSDK.getInstance(this).onBackPressed();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        LTBaseSDK.getInstance(this).onActivityResult(requestCode, resultCode, data);

    }

    @Override
    public void attachBaseContext(Context newBase) {
        super.attachBaseContext(newBase);
        LTBaseSDK.getInstance(this).attachBaseContext(newBase);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        LTBaseSDK.getInstance(this).onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (BaseSDK.mListenerName != "") {
            m_listenerName = BaseSDK.mListenerName;
        }

        JSONObject jo = new JSONObject();
        if (requestCode == 1003 || requestCode == 1004 || requestCode == 1002) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

                try {

                    if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {

                        jo.putOpt(SDKJsonDefine.RESULT, false);
                        jo.putOpt(SDKJsonDefine.PERMISSION_RESULTCODE, requestCode);
                        jo.putOpt(SDKJsonDefine.MSG, "权限获取失败");
                    } else {

                        jo.putOpt(SDKJsonDefine.RESULT, true);
                        jo.putOpt(SDKJsonDefine.PERMISSION_RESULTCODE, requestCode);
                        jo.putOpt(SDKJsonDefine.MSG, "权限获取成功");
                    }

                    if (m_listenerName != "") {

                        UnityPlayer.UnitySendMessage(m_listenerName, SDKCallbackDefine.ONPERMISSION, jo.toString());
                    } else {
                        Log.i("OnGetPermissions", "Unity接收回调对象不存在!!!");
                    }
                } catch (JSONException e) {

                    e.printStackTrace();
                }
            }
        }
    }
}


  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-07-05 23:42:25  更:2022-07-05 23:42:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:40:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码