一、准备工作

我这边用的是Unity2017.4.40,最后一个版本,用的mumu模拟器,有手机可以用手机。

二、打包选项

image-20220217183819683

Development Build,刚需就这一个,不是网上说的还要Autoconnect Profiler,这个选项只是方便你连接机器而已。

image-20220217170823276

Scripting Backend一定要是mono,只有个才能deep(2019i2cpp开始支持),官方文档里面有讲,如果你是没有修改启动的Activity,勾选v7应该是没问题的,如果你是修改的启动的Activity,一定要勾选x86,为了保险起见还是两个都勾选上。

以下三种处理情况

情况1

没有自定义AndroidManifest,就是使用unity自带的方式直接出包,直接安装就行了,对了记录一下包名,使用下面几个命令就能deep了。

1
2
3
4
5
6
7
8
9
#这个命令是连接mumu模拟器,可以查询怎么连接其他模拟器或者手机(自行查错)
adb connect 127.0.0.1:7555
#这个是启动的命令行参数,com.pp.test 就是你的包名,对应 Player Settings -> (我这里是安卓) Identification -> Package Name
adb shell am start -n com.pp.test/com.unity3d.player.UnityPlayerActivity -e 'unity' '-deepprofiling'
#如果上面这个命令能正常进入游戏,那么你已经成功了90%
#先清掉一下
adb forward --remove-all
#下面这个命令是把你的应用连接上profile,注意tcp后面的端口后,先查询有没有被其他应用占用,如果你是2017用55000应该问题不大,其他unity版本,我这边测试到2018用4600没问题,2019后面就很容易的,自动扫端口自动连这个问题不大,2018也可以自动扫端口,然后把com.pp.test换成你自己的包名就可以,如果不行就多试几次,先 adb forward --remove-all,再连,或者重启再连多尝试几次
adb forward tcp:55000 localabstract:Unity-com.pp.test

情况2

自定义了AndroidManifest,启动Activity继承了UnityPlayerActivity,可以用情况1去尝试,这里给出更好的处理方式。如果你是2018可以略过,这个应该是2017才需要处理,修改一个onCreate, 增加一个updateUnityCommandLineArguments

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 protected String updateUnityCommandLineArguments(String cmdLine)
{
return cmdLine;
}
@Override protected void onCreate(Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
//modify start 这里取到命令行参数,传递给Activity
String cmdLine = updateUnityCommandLineArguments(getIntent().getStringExtra("unity"));
getIntent().putExtra("unity", cmdLine);
//modify end
mUnityPlayer = new UnityPlayer(this);
setContentView(mUnityPlayer);
mUnityPlayer.requestFocus();
}

然后再进行情况1处理基本上就可以解决问题了。

情况3

如果你的启动Activity不是继承UnityPlayerActivity,那么你需要在进入UnityPlayerActivity或者他的子类的时候添加参数,看下面代码。

1
2
3
4
// 这个UnityPlayerActivity换成你们项目的实现即可了。
Intent intent = new Intent(MainActivity.this, UnityPlayerActivity.class);
intent.putExtra("unity", "-deepprofiling");
startActivity(intent);

如果是这种情况,你可以不用从命令行启动,是不是非常方便,不过这个参数需要你们项目控制开关。

三、我碰到的错误

image-20220217175939792

这个是没有勾选x86,直接闪退,勾选x86就行了。

还有unity -deepprofiling 这两个参数是给UnityPlayerActivity这个activity用的,并不是启动activity,要注意分清情况。