AndroidStudioプロジェクトとUnityプロジェクトの相互作用とさらなるパッケージ化

unityのコールバックイベントをASプロジェクトリスナーに公開する必要がある場合は、独自のプロジェクトの下にPluginsフォルダーを作成し、サブフォルダーの下にAndroidフォルダー、このAndroidフォルダーの下に作成されたjavaクラスまたはjarを追加できます。aarパッケージはユニティプロジェクトがASパッケージを出力するときに一緒にパッケージ化されます。

たとえば、ユニティプロジェクトにシーンをロードするメソッドがある場合、ロード時に継続的にロードの進行状況に戻り、ロードが完了した後にロード完了イベントをコールバックします。シーンをロードするこのメソッドを呼び出しのためにASプロジェクトに公開する場合、ASプロジェクトは、ロードおよび完了した監視をメソッドのロードメソッドに直接配置することはできません。

ASはUnityメソッドを呼び出すため、次の方法でのみ呼び出すことができます

/*
gameObj----unity挂载调用类的gameobject物体的name
function----unity中触发的类
param----unity中触发的类的参数
*/
UnityPlayer.UnitySendMessage("gameObj","function","param")

このメカニズムを使用すると、コールバックモニタリングを直接実装できないようにメソッドがモニタリングイベントを渡す必要があるが、ASの基本を少し理解している場合は、対応するモニタリングイベントをASプロジェクトにさらにカプセル化して、1つに統合できます。メソッド。フォーム、以下の特定のアプローチについて話しましょう。

まず、Unityプロジェクトでは、Plugins / Androidで作成されたJavaクラスを使用して、監視する必要のあるコールバックメソッドをマークします。上記の例によると、シーンをロードするときに、ロードの進行状況とロードの完了イベントを監視する必要があります。次に、CallbackActivity.javaを作成できます。内部のコードは次のとおりです。

package com.XXX.XXXX;
import android.os.Bundle;
import android.widget.FrameLayout;

import com.unity3d.player.UnityPlayerActivity;

public abstract class CallbackActivity extends UnityPlayerActivity
{
    public static CallbackActivity instance = null;

    abstract protected void loadSceneComplete();//加载完成的监听事件
    abstract protected void loadSceneProcess(String percent);//加载中的监听事件


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        instance = this;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        instance = null;
    }
}

Unityがシーンをロードするメソッドをトリガーすると、これら2つのリスニングコールバックが継続的にトリガーされます。以下は団結のためのコードです

    /// <summary>
    /// 加载场景
    /// </summary>
    /// <param name="content"></param>
    public void LoadScene(string content)
    {
        #if UNITY_ANDROID
        AndroidJavaClass jc = new AndroidJavaClass("com.XXX.XX.CallbackActivity");
        AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("instance");
        #endif
        rbxManager.LoadScene(sceneID,Progress.Create<float>(percent =>
        {
        #if UNITY_ANDROID
            activity.Call("loadSceneProcess", precent.ToString());
        #endif
        }), ()=> {
        #if UNITY_ANDROID
            activity.Call("loadSceneComplete","");
        #endif

        });

    }

通常のロジックでは、ASプロジェクトでUnityPlayer.UnitySendMessage( "gameObj"、 "LoadScene"、 "content")メソッドを呼び出してシーンをロードする場合、上記で継承されたCallbackActivityクラスのloadSceneCompleteメソッドとloadSceneProcessメソッドをオーバーライドする必要があります。 。モニター。コードは次のとおりです。

public class UnityCallbackActivity extends CallbackActivity {    
@Override
    protected void loadSceneComplete() {
        //监听
    }
@Override
    protected void loadSceneProcess(String percent) {
        //监听
    }
}

このステップまでは、UnityPlayer.UnitySendMessageを使用してロードをトリガーし、レプリケーションメソッドでイベントをリッスンするデフォルトのアプローチです。

エクスポートしたUnityプロジェクトを単独で使用する場合はもちろん問題ありませんが、3D開発を理解していないAS開発エンジニアにプロジェクトを提供する場合は少しわかりにくいです。個人的にはさらに先が必要だと思います。メソッドにカプセル化され、メソッドの呼び出しと監視の両方が同じ関数に入れられます。

一つ目は委員会の書き直しです。JavaはC#と同じではありません。Actionのような組み込みのデリゲート型はありませんが、デリゲートはインターフェイスを介して実装されます。

上記のシーンをロードする例を見てください。loadSceneCompleteとloadSceneProcessの2つのコールバックメソッドに対応して、インターフェイスに対応する2つのJavaクラスを再定義する必要があります。

package com.realibox.ar.callback;

public interface LoadSceneCallback{
    public void loadSceneAction(float percent);
}
package com.xxx.xxxx.callback;

public interface LoadSceneComleteCallback{
    public  void loadSceneCompleteAction();
}

次に、上記のUnityCallbackActivity.javaをさらに変更すると、コードは次のようになります。

public class UnityCallbackActivity extends CallbackActivity {    
    /*
    *when scene loading complete, this function will callback
     */
    private LoadSceneComleteCallback loadSceneComleteCallback;
    @Override
    protected void loadSceneComplete() {
        if (loadSceneComleteCallback!=null)
        loadSceneComleteCallback.loadSceneCompleteAction();
    }

    /*
    * when scene is loading, this function will stay callback
     */
    private LoadSceneCallback loadSceneCallback;
    @Override
    protected void loadSceneProcess(String percent) {
        if (loadSceneCallback!=null) {
                loadSceneCallback.loadSceneAction(p);
        }
    }
}

上記で実装されたロジックは、Unityがこれら2つのイベントをコールバックすると、これら2つのインターフェイスを継承するクラスのメソッドもトリガーされるというものです。

この場合、ASプロジェクトでは、シーンを呼び出すメソッドをさらにカプセル化できます。コードは次のとおりです。

    void Init(){
                LoadProject(sceneId, 
                    percent -> {
                        Log.e(TAG, "percent-"+percent);
                    }, 
                    () -> {
                        Log.e(TAG, "loadsenecomplete");
                    });
    }

    /*
     *
     * scene_id
     * LoadSceneCallback:return percent of load scene
     * LoadComleteCallback:callback when finish load scene
     */
    protected void LoadProject(String sceneid, String doMain,LoadSceneCallback loadSceneCallback,LoadSceneComleteCallback loadSceneComleteCallback) {
        UnityPlayer.UnitySendMessage("gameobj", "LoadScene", sceneid);
        this.loadSceneCallback = loadSceneCallback;
        this.loadSceneComleteCallback = loadSceneComleteCallback;

    }   

このように、シーンをロードするメソッドを呼び出すときに、ロードと完了のコールバックをパラメーターとしてメソッドに渡すことができます。

おすすめ

転載: blog.csdn.net/ssssssilver/article/details/108466721