kListener(new AndroidNativeAdCallbackListener());
注:以上的 GetUnityConnector()
方法表示在C#中获取aar文件中的UnityConnector
,具体代码如下:
//C#中获取UnityConnector
public static AndroidJavaObject GetUnityConnector() {
AndroidJavaClass unityConnector = new AndroidJavaClass("com.andcash.unity.UnityConnector");
if (unityConnector == null)
{
Debug.Log("GetUnityConnector failed: unityConnector is null");
}
AndroidJavaObject instance = unityConnector.CallStatic<AndroidJavaObject>("getInstance");
if (instance == null)
{
Debug.Log("GetUnityConnector failed: instance is null");
}
return instance;
}
//java中 UnityConnector
private static UnityConnector instance;
public static UnityConnector getInstance() {
if (instance == null) {
instance = new UnityConnector();
}
return instance;
}
实际项目中的方法可能比较多,但是大体上离不开这几种。
参考文章:
https://www.cnblogs.com/zhxmdefj/p/13273560.html
https://blog.csdn.net/u014361280/article/details/91888091
https://blog.csdn.net/qq_33337811/article/details/87815573
这里我没有使用Android调Unity,但是查阅文档可以知道Unity是支持的,它支持你向某个游戏对象发送消息。具体代码如下:
public void sendMessageToUnity(
String gameObject,
String method,
String value
) {
if (TextUtils.isEmpty(gameObject) || TextUtils.isEmpty(method)) {
printLog("sendMessageToUnity failed: gameObject or method is empty.");
return;
}
if (value == null) value = "";
UnityPlayer.UnitySendMessage(gameObject, method, value);
}
4. 错误处理
从Unity游戏中退出到Android页面时发生了崩溃?
Unity退出游戏后会结束当前运行的进程,所以退出后由于进程被杀导致崩溃。
解决方案:将 com.unity3d.player.UnityPlayerActivity
设置为单独一个进程,在清单中添加 android:process=":gameProcess"
,例如:
<activity
android:name="com.unity3d.player.UnityPlayerActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
android:exported="true"
android:hardwareAccelerated="false"
android:launchMode="singleTask"
android:resizeableActivity="false"
android:process=":gameProcess"
//....
注意:新进程与默认进程之间的数据是默认分隔的,如果想通信的话需要使用进程之间通信。
Unity游戏中的广告展示会黑屏?
这是由于多进程导致,如果你还遇到崩溃那么应该是Android P之后Webview处理多进程导致的。
解决方案:
针对Webview可以在Applicantion中加入:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
if (packageName != Application.getProcessName()) {
WebView.setDataDirectorySuffix(Application.getProcessName())
}
}
针对广告黑屏,例如我这里使用的是Applovin,那么我可以对它的广告页面添加android:multiprocess="true"
,例如:
<activity
android:name="com.applovin.adview.AppLovinFullscreenActivity"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:exported="false"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:screenOrientation="behind"
android:multiprocess="true"
/>
如果你使用的是Admob,也同理对Admob的具体广告页加入该参数。
该参数的意思是:调用进程uid和组件的uid相同(一个应用的不同进程uid是相同的)则Activity跑在调用进程里面,调用进程是谁,他就跑在那个进程里,换句话说 Activity 可以跑在不同进程里面。
对于android:multiprocess="tr