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;
}
이런 식으로 장면을로드하는 메서드를 호출 할 때로드 및 완료 콜백을 메서드에 매개 변수로 전달할 수 있습니다.