【问题标题】:Unity3D - Android Communication?Unity3D - Android 通信?
【发布时间】:2014-05-19 19:42:56
【问题描述】:

所以我编写了一个 Android 插件,可以在我的 Android 版 Unity3D 游戏中显示广告。我想这样做,以便我可以在我的 Unity C# 代码中关闭和打开广告。但是,没有任何工作。

如果我尝试调用 com/mycompany/mygame/MainActivity.java 中的以下函数:

public void hideAd() {
    adView.setVisibility(View.INVISIBLE);
}   

public void showAd() {
    adView.setVisibility(View.VISIBLE);
}

来自我游戏中的脚本:

using UnityEngine;
using System.Collections;

public class callMyPlugin : MonoBehaviour {
    AndroidJavaObject ajo;
    float o = 0f;
    bool ohBool = true;

    void Start() {
        ajo = new AndroidJavaObject("com.mycompany.mygame.MainActivity");
    }

    void Update () {
        ...
        // Touch
        foreach (Touch touch in Input.touches) {
            // Other game code involving screen touch
            ...
            if (touch.phase == TouchPhase.Began) {
                // Call my function
                float touchLoc = Camera.main.ScreenToWorldPoint(touch.position).y;
                if (touchLoc > 0.0f) {
                    if (ohBool) {
                        ajo.Call("hideAd");
                        //hideAd();
                        ohBool = false;
                    } else {
                        ajo.Call("showAd");
                        //showAd();
                        ohBool = true;
                    }
                }

            }
        }
        // More game code
        ...
    }
}

编辑: 如果有帮助,这是我的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mycompany.mygame">

  <!-- User permissions -->
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATS"/>

  <!-- Application -->
  <application android:icon="@drawable/app_icon" android:label="@string/app_name">

    <!-- Ad Banner -->
    <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
    <!-- UnityPlayerAcivity -->
    <activity android:name="com.mycompany.mygame.MainActivity"
              android:label="@string/app_name"
              android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>
    <!-- UnityPlayerNativeActivity -->
    <activity android:name="com.unity3d.player.UnityPlayerNativeActivity"
              android:label="@string/app_name"
              android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <meta-data android:name="android.app.lib_name" android:value="unity" />
        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>
    <!-- UnityPlayerProxyActivity -->
    <activity android:name="com.unity3d.player.UnityPlayerProxyActivity"
              android:label="@string/app_name"
              android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>
    <!-- VideoPlayer -->
    <activity android:name="com.unity3d.player.VideoPlayer"
              android:label="@string/app_name"
              android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>

  </application>
</manifest> 

【问题讨论】:

    标签: c# java android plugins unity3d


    【解决方案1】:

    首先,您尝试调用静态方法,而您的 Java 方法是非静态的。

    ajo.CallStatic("someMethod") 替换为ajo.Call("someMethod")

    其次,通过使用new AndroidJavaObject("com.mycompany.mygame.MainActivity"),您正在创建MainActivity 的新实例。我们稍后会处理这个问题

    AndroidJavaClass 与 AndroidJavaObject

    AndroidJavaObject 将创建给定类的新实例。
    AndroidJavaClass创建新实例,您可以访问静态方法和字段

    调用当前活动中的方法

    AndroidJavaClass playerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
    AndroidJavaObject curActivity = playerClass.GetStatic<AndroidJavaObject>("currentActivity");
    
    curActivity.Call("showAd");
    

    【讨论】:

    • 糟糕!好点子。但是,它仍然不起作用,当我尝试执行代码时它崩溃了。这是我单击时遇到的错误,这将导致代码调用要执行的函数:05-19 14:44:05.890: W/Looper(14985): Ignoring unexpected epoll events 0x0 on fd 0 that is no注册时间更长。 05-19 14:44:05.890: E/NativeActivity(14985): channel 'b35214a8 com.mycompany.mygame/com.mycompany.mygame.MainActivity (client)' ~ 未能接收到调度信号。状态=-11。
    • 我将 ajo 切换到 AndroidJavaClass 并且当我尝试调用该方法时程序不再崩溃,但没有任何反应...
    • 不知道该用哪一个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    相关资源
    最近更新 更多