Android Studio 프로젝트 및 Unity 프로젝트의 상호 작용 및 추가 패키징

Unity의 콜백 이벤트를 AS 프로젝트 리스너에 노출해야하는 경우 자신의 프로젝트 아래에 Plugins 폴더를 생성하고 하위 폴더 아래에 Android 폴더를 추가하고이 Android 폴더 아래에 생성 된 java 클래스 또는 jar를 추가 할 수 있습니다. aar 패키지는 Unity 프로젝트가 AS 패키지를 출력 할 때 함께 패키지됩니다.

예를 들어 Unity 프로젝트에 씬을로드하는 방법이있는 경우로드시 지속적으로로드 진행 상태로 돌아가고로드 완료 후로드 완료 이벤트를 콜백합니다. 호출을 위해 장면을로드하는이 방법을 AS 프로젝트에 노출하려는 경우 AS 프로젝트는로드 및 완료된 모니터링을 메서드의로드 방법에 직접 넣을 수 없습니다.

AS는 Unity 메서드를 호출하므로 다음과 같은 방식으로 만 호출 할 수 있습니다.

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

이 메커니즘을 사용하면 콜백 모니터링을 직접 구현할 수 없도록 메서드가 모니터링 이벤트를 전달해야하는 경우 AS 기본 사항을 조금 이해하면 해당 모니터링 이벤트를 AS 프로젝트에 추가로 캡슐화하여 하나로 통합 할 수 있습니다. 방법입니다. 양식, 아래에서 구체적인 접근 방식에 대해 이야기하겠습니다.

먼저 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가 장면을로드하는 방법을 트리거 할 때 지속적으로 트리거됩니다. 아래는 통합을위한 코드입니다.

    /// <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의 두 가지 콜백 메소드에 대응하여 인터페이스에 해당하는 두 개의 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가이 두 이벤트를 다시 호출 할 때이 두 인터페이스를 상속하는 클래스의 메서드도 트리거된다는 것입니다.

이 경우 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