2017-06-07 9 views
1

私の問題についてアドバイスをいただければ幸いです。UnityPlayerActivityグローバル初期化

私は、Unity3DおよびAndroidプラグイン用のVuforia SDKを使用してARアプリケーションを開発しています。 私は自分のシーンにいくつかのImageTargetと3Dモデルを持っています。 アンドロイドプラグインで動作します私のクラスには、次のようになります。UnityPlayerが私のinit()機能で複数回初期化されるので、

public class AssetBundleAugmenter : MonoBehaviour, ITrackableEventHandler 
{  
    void Start() 
    { 
     StartCoroutine(DownloadAndCache()); 
     mTrackableBehaviour = GetComponent<TrackableBehaviour>(); 
     if (mTrackableBehaviour) 
     { 
      mTrackableBehaviour.RegisterTrackableEventHandler(this); 
     } 
     init();   
    } 
    public void OnTrackableStateChanged(
    TrackableBehaviour.Status previousStatus, 
    TrackableBehaviour.Status newStatus) 
    { 
     if (newStatus == TrackableBehaviour.Status.DETECTED || 
     newStatus == TrackableBehaviour.Status.TRACKED || 
     newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED) 
     { 
      if (!mAttached && mBundleInstance) 
      { 
       // if bundle has been loaded, let's attach it to this trackable 
       //...   
      } 
      OnTrackingFound(); 
     } 
     else 
     { 
      OnTrakingLost(); 

     } 

    } 

    private void OnTrackingFound() 
    { 
     if (mTrackableBehaviour is ImageTargetAbstractBehaviour) 
     { 
      GetJavaObject().Call("OnMarkerFound"); 
     } 
    } 

    void onButtonClicked(int index) 
    { 
     //Changing current 3D model material 
    } 

#if UNITY_ANDROID 
     private AndroidJavaObject javaObj = null; 
     //LISTENING TO BUTTON CLICK EVENTS FROM ANDROID 
     private sealed class EventListner : AndroidJavaProxy 
     { 
      private AssetBundleAugmenter mReceiver; 

      public EventListner(AssetBundleAugmenter receiver) 
      : base("com.mypackage.myapp.ImageTargetTracker$Listner") 
      { 
       mReceiver = receiver; 
      } 

      public void onButtonClicked(int index) //change color of model 
      { 
       mReceiver.onButtonClicked(index); 
      } 
     } 


     private AndroidJavaObject GetJavaObject() 
     { 
      if (javaObj == null) 
      { 
       javaObj = new AndroidJavaObject("com.mypackage.myapp.ImageTargetTracker"); 
      } 
      return javaObj; 
     } 
     AndroidJavaObject activity; 
     private void init() 
     { 
      // Retrieve current Android Activity from the Unity Player 
      AndroidJavaClass jclass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
      activity = jclass.GetStatic<AndroidJavaObject>("currentActivity"); 

      // Pass reference to the current Activity into the native plugin, 
      GetJavaObject().Call("setActivity", activity, new EventListner(this)); 

     } 


    #else 
     void init() {} 
    #endif 
} 

だから私は、私が間違っている必要があります知っているシーンで私のImageTargetsの全てにこのスクリプトを添付しました。

私のシーンでARCameraにスクリプトを添付してそこに初期化を書き込もうとしましたが、ImageTargetsで動作するスクリプトでcurrentActivityにアクセスする方法がわかりません。また、私はリスナーを使用しています - 私のプラグインのインターフェースで、ボタンのクリックを聞いて、いくつかの機能を一体化しました。

私のプラグインコード:

だから、
public class ImageTargetTracker { 
    public static interface Listner { 
     public void onButtonClicked(int index); 
    } 
    private Listner mListner; 
    protected Activity mCurrentActivity; 
    public void setActivity(Activity activity, Listner listner) 
    { 
     mCurrentActivity = activity; 
     mListner = listner; 

     mCurrentActivity.runOnUiThread(new Runnable() { 
      public void run() { 
       LayoutInflater inflater = mCurrentActivity.getLayoutInflater(); 
       Resources resources = mCurrentActivity.getResources(); 
       String pkgName = mCurrentActivity.getPackageName(); 

       int id = resources.getIdentifier("camera_layout", "layout", pkgName); 
       View view = inflater.inflate(id, null); 

       mCurrentActivity.addContentView(view, param); 
       //INITIALIZING UI ELEMENTS HERE (DISPLAYED ON TOP OF CAMERA) 
    } 


    public void OnMarkerFound(){ 

     mCurrentActivity.runOnUiThread(new Runnable() { 
      public void run() { 
       //Showing some UI elements 
      } 
     }); 
    } 
} 

、どのように私は、グローバルユニティ1時間の活動と私のプラグインクラスを初期化し、そして私のスクリプトのすべてでそれらを使用することができますか?

+1

[シングルトン](http://wiki.unity3d.com/index.php/Singleton)を使用する価値はありますか? –

+0

@StevenCoull、ありがとう、それは今働くようです。しかし、今では、リスナーインターフェースの実装方法がわかりません。シングルトンクラスで宣言すべきですか? –

+0

素晴らしいです、どうやってそれを稼働させましたか?リスナーにシングルトンパターンを使用する必要があるかどうか不明ですが、リスナーに何をもっと詳細にしたいのか説明できますか? –

答えて

0

コメントで説明したように、singletonパターンの使用をお勧めします。

関連する問題