2013-03-07 2 views
0

here 지침에 따라 Vuforia/Unity 프로젝트를 기반으로 Eclipse 프로젝트를 만들었습니다. 그게 실행되고있어.Unity Android/Eclipse 프로젝트에서 스플래시 화면 종료 감지

주 활동에 버튼을 추가하고 있으며, QCARPlayerActivity에서 확장됩니다. 유니티 스플래시 화면이 재생 될 때 버튼도 유니티 플레이어 위에 위치합니다.

유니티 스플래시 화면이 종료되어 장면이로드되기 전에 제 위치에 컨트롤이 없으면 감지 할 수있는 방법이 있습니까?

UPDATE는 3/18/13

나는 시작 화면의 완료를 추적하기 위해 Eclipse에서 내 주요 활동에 정적 부울을 추가하고 부울을 볼 컨트롤을 추가하는 코드를 수정했습니다.

나는 자바에서 정적 부울을 설정하는 간단한 스크립트를 생성하고 Vuforia ARCamera

SplashExit.js에 부착

유니티에서
public static boolean splashComplete = false; 
private View mControlViewContainer = null; // initialized in onCreate 

class QCARViewFinderTask extends TimerTask { 
    public void run() { 
     MainActivity.this.runOnUiThread(new Runnable() { 
      public void run() { 
       if (!QCAR.isInitialized()) return; //wait for QCAR init 
//search for QCAR view if it hasn't been found 
       if (mQCARView == null) 
       { 
        View rootView = MainActivity.this.findViewById(android.R.id.content); 
        QCARUnityPlayer qcarView = findQCARView(rootView); 
        if (qcarView != null) { 
         mQCARParentView = (ViewGroup)(qcarView.getParent()); 
         mQCARView = qcarView; 
        } 
       }      

       // add controls if QCAR view is located and the splash sequence is complete 
       if(mQCARView != null && splashComplete && mControlViewContainer != null){ 
        mQCARParentView.addView(mControlViewContainer); 
        mViewFinderTimer.cancel(); 
        mViewFinderTimer = null; 
       } 
      } 
     }); 
    } 
} 

MainActivity.java

function Start() { 
    var mainActivity = new AndroidJavaClass ("com.example.app.MainActivity"); 
    mainActivity.SetStatic.("splashComplete",true); 
} 

이 간단한 장면을 가진 프로젝트에서 꽤 잘 작동합니다. 내 컨트롤이 스플래시 출구에로드하는 것 같습니다. 그러나이 방법을 좀 더 복잡한 장면에서 사용하면 스플래시 화면이 사라지기 전에 컨트롤이 2 초 정도 올라옵니다.

내 유니티 스크립트 나 스플래시 시퀀스가 ​​종료되었을 때를보다 정확히 반영하는 더 나은 방법을 첨부 할 수있는 더 좋은 곳이 있습니까? 아마도 Jerdak의 의견에 대한 제안은 무엇입니까?

+1

통일성 태그는 마이크로 소프트 유니티입니다. 오용하지 마십시오. –

+0

알았습니다. 감사! –

+0

Unity iOS 라이센스로 Unity가 기본이라고 가정합니까? 깨끗한 메서드가 없다면 실제 레벨을로드하기 위해 Application.LoadLevel을 호출하는 단일 스크립트가있는 빈 레벨을 만들 수 있습니까? 스플래시가 모든 레벨로드 사이에 표시되는지 또는 앱을 시작할 때 표시되는지는 기억할 수 없습니다. – Jerdak

답변

0

yield 문을 추가하는 것이 트릭입니다. 완전한 해결책이 뒤 따른다.

SplashExit.js는 Unity의 ARCamera Game 개체에 연결되어야합니다. start 메소드는 장면이로드 될 때까지 정지 한 다음 MainActivity.java에서 splashComplete를 true로 설정합니다.

MainActivity.java의 타이머가 QCARViewFinderTask의 run 메소드를 반복적으로 호출하면 splashComplete가 true로 전환되므로 컨트롤 뷰가 Unity Player 상위 뷰에 추가됩니다.

MainActivity.java

public class MainActivity extends QCARPlayerActivity { 
    private QCARUnityPlayer mQCARView = null; 
    private ViewGroup mQCARParentView = null; 
    private Timer mViewFinderTimer = null; 
    private View mControlViewContainer = null; 

    public static boolean splashComplete = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mControlViewContainer = getLayoutInflater().inflate(R.layout.control_layout, null); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     if (mQCARView == null) { 
      //search the QCAR view 
      mViewFinderTimer = new Timer(); 
      mViewFinderTimer.scheduleAtFixedRate(new QCARViewFinderTask(), 1000, 1000); 
     } 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if (mViewFinderTimer != null) { 
      mViewFinderTimer.cancel(); 
      mViewFinderTimer = null; 
     } 
    } 

    class QCARViewFinderTask extends TimerTask { 
     public void run() { 
      MainActivity.this.runOnUiThread(new Runnable() { 
       public void run() { 
        if (!QCAR.isInitialized()) return; //wait for QCAR init 

        //search for QCAR view if it hasn't been found 
        if (mQCARView == null) 
        { 
         View rootView = MainActivity.this.findViewById(android.R.id.content); 
         QCARUnityPlayer qcarView = findQCARView(rootView); 
         if (qcarView != null) { 
          mQCARParentView = (ViewGroup)(qcarView.getParent()); 
          mQCARView = qcarView; 
         } 
        }      

        // add controls if QCAR view is located and the splash sequence is complete 
        if(mQCARView != null && splashComplete && mControlViewContainer != null){ 
         mQCARParentView.addView(mControlViewContainer); 
         mViewFinderTimer.cancel(); 
         mViewFinderTimer = null; 
        } 
       } 
      }); 
     } 

     private QCARUnityPlayer findQCARView(View view) { 
      if (view instanceof QCARUnityPlayer) { 
       return (QCARUnityPlayer)view; 
      } 
      if (view instanceof ViewGroup) { 
       ViewGroup vg = (ViewGroup)view; 
       for (int i = 0; i

SplashExit.js

function Start() { 
    yield; // wait for the scene to fully load 
    // Note that com.example.app.MainActivity should be updated to match your bundle identifier and class names 
    var mainActivity = new AndroidJavaClass ("com.example.app.MainActivity"); 
    mainActivity.SetStatic.("splashComplete",true); 
}