이것은 Unity Android 플러그인의 더 큰 문제 중 하나입니다.
여기에는 몇 가지 가능성이 있습니다. 아래에서 올바른 대답을 찾으십시오.
a) 플러그인에서 주 활동 (즉, 실행기 활동)을 "com.inno.myPlugin.MyClass"로 설정해야합니까?
b) OnActivityResult를 MyClass으로 대체합니까?C) 나도 당신이 에 '예'로 대답 한 경우 위의
의
(A) 후 약간의 가능성은 누구나하지만 자신에게없는 것을 다른 사람에 이르기까지 다양한 이유로,이 플러그인을 사용할 수있다 충돌하는 패키지에 대한 코드를 수정하십시오. ANOTHER 플러그인뿐만 아니라
당신이 응답 한 경우에 그 권한을 필요로하는 경우
당신이 (b)에에 '예'로 대답 한 경우는 다음 다른 사람이, 하지만 그들은 그것을 사용할 수 없습니다 사용할 수있는 괜찮은 가능성있다 yes to (c) 당신은 잘되어야합니다.
가장 쉬운 방법은 새 프로젝트에서 다른 패키지 이름으로 플러그인을 사용하고 작동하는지 확인하는 것입니다.
또한 UnityPlayerNativeActivity를 확장하지 말고 조언을 구합니다. UnityPlayerNativeActivity을 확장하는 유일한 이유는
- 는
- 당신이 사용하는 반사를 모두 얻을 수 unitySendMessage
를 사용하려면 currentActivity (즉 UnityPlayer.currentActivity)을 얻으려면입니다. currentActivity는 필드이고 unitySendMessage는 메소드입니다. 귀하의 질문과 직접적으로 관련이 없으므로 여기서 자세히 설명하지는 않겠지 만, 자세한 내용이 필요하면 핑하십시오. 영업 여기
의 요청에 대한 몇 가지 예제 코드를 추가
는
편집 내가 UnityPlayerActivity 또는 UnityPlayerNativeActivity을 확장없이 샘플 플러그인입니다. 여기에 바로 입력 했으므로 코드에 오류가있을 수 있습니다. 내가 확실히 아는 것은 네이티브 코드 시도-catch 블록이 필요하지만, 당신이 코드를 붙여 넣을 때 어떤 IDE 오류를 표시해야한다는 것입니다.
네이티브 안드로이드 코드
package com.myCompany.myProduct;
public class MyClass {
private Class<?> unityPlayerClass;
private Field unityCurrentActivity;
private Method unitySendMessage;
public void init() {
//Get the UnityPlayer class using Reflection
unityPlayerClass = Class.forName("com.unity3d.player.UnityPlayer");
//Get the currentActivity field
unityCurrentActivity= unityPlayerClass.getField("currentActivity");
//Get the UnitySendMessage method
unitySendMessage = unityPlayerClass.getMethod("UnitySendMessage", new Class [] { String.class, String.class, String.class });
}
//Use this method to get UnityPlayer.currentActivity
public Activity currentActivity() {
Activity activity = (Activity) unityCurrentActivity.get(unityPlayerClass);
return activity;
}
public void unitySendMessageInvoke (String gameObject, String methodName, String param) {
//Invoke the UnitySendMessage Method
unitySendMessage.invoke(null, new Object[] { gameObject, methodName, param});
}
public void makeToast (final String toastText, final int duration) {
currentActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(), toastText, duration).show();
}
});
}
}
유니티 C# 코드
AndroidJavaObject myClass = null;
public void Init() {
if(myClass == null)
myClass = new AndroidJavaObject("com.myCompany.myProduct.MyClass");
if(myClass != null)
myClass.Call("init", new object[0]);
}
public void MakeToast (string toastText, int duration) {
if(myClass != null)
myClass.Call("makeToast", new object[] { toastText, duration });
}
,617,
매니페스트의 경우 패키지 이름을 호출하려는 이름으로 변경하십시오. 은이 플러그인 패키지와 일치해야합니다. 예를 들어 플러그인 이름이 "com.myCompany.myProduct"이면 패키지 이름을 "com.someOtherCompany"와 같이 사용할 수 있습니다.someNewProduct는 "
방법이 플러그인을 테스트합니다.
1. 위의 네이티브 코드를 추가합니다"MyClass.java ", 그리고 항아리를 만들 수 있습니다.
2. 복사를 자산으로이 항아리/Plugins/Android 폴더
3. 패키지 이름이 Unity의 기본 패키지 이름이 아닌지 확인하십시오.
4. Unity C# 코드를 새 스크립트로 복사하십시오.
5. OnGUI 코드를 입력하십시오 전화를 걸다. "Init"& C#의 "MakeToast"메소드
출처 - Unity에 대한 필자의 전문 지식.
답해 주셔서 감사합니다. 당신의 대답에 대해 몇 가지 질문이 있습니다. 내 클래스 이름은 UnityPlayerNativeActivity를 확장하는 MyClass입니다. UnityPlayerNativeActivity를 확장하지 않으면 C# 측에서 AndroidJavaObject.Call을 사용하여 Java 함수를 호출 할 수 있습니까? UnityPlayer.UnitySendMessage (arg0, arg1, arg2)를 사용하여 C# 측에서 함수를 호출 할 수 있습니까? Manifest 파일은 어떻게 생겼을 까? 현재 매니페스트의 주요 클래스는 MyClass입니다. 그것을 제거해야합니까? – Programmer
대답 할 질문이 많습니다. 내가 코멘트에 답할 수 있을지 의심 스럽기 때문에 내 대답을 편집 할 것입니다. 나는 곧 여기에 뭔가를 넣을 것이다. –