此文章隨時還會補充。
在一般的APP而言,snap view不外乎就是重新排列layout,但是遊戲就很麻煩了,很可能讀取的座標會有問題,因此遊戲的話比較不建議去處理在snap view下的遊玩情形。
目前我看到的處理方法約有三種:
請點選。
然後加入方法:
基本上運作是正常的,只是在縮小時暫停,畫面會變黑。還不太確定原因為何。
你要如何取得你的view目前的狀態呢?可以透過WinRT裡面的ApplicationViewState enumeration來取得:
這邊的Value可以取得正在運行的app的view的狀態,可以知道是不是Snapped。
Resize event和View state change event的次序是已經決定的,所以view state event(以及相關的callback函數)會在resize event之前啟動。
若由view state change觸發的callback函數中搜尋display area size,可能會是錯的,舉例來說,從snap的寬度為320px轉變成橫向全螢幕時,view state會是fullscreen-landscape,但是寬度尺寸是320px。
但這個做法的最大問題是,Unity內部好像不能使用Windows的namespace,如果你要用,那要自己建立dll插入,這倒不是一件容易的事情。而且Win8.1之後就沒有snapped了。
Win8.1已經沒有snap view,而是要設定最小寬度,所以如果可以偵測目前App的寬度,那我認為是比較好的處理方法。
對於直接處理視窗大小的作法是:
取得目前App啟動之視窗的大小:Windows.UI.Xaml.Window.Current.Bound
(回傳Rect。Windows.UI.Xaml是namespace,Window是class,Current是屬性,取得應用程式目前已啟動的視窗,Bound是取得應用程式視窗的高度及寬度,作為Rect值)。
在一般的APP而言,snap view不外乎就是重新排列layout,但是遊戲就很麻煩了,很可能讀取的座標會有問題,因此遊戲的話比較不建議去處理在snap view下的遊玩情形。
目前我看到的處理方法約有三種:
第一種
進入snap view模式時,載入一張畫面,上面放個按鈕,要繼續玩就點一下,就會跳回全螢幕繼續,對於相當可能會是一個大工程的snap view來說,這種處理方法可能是比較有效率的,不然就是要一開始就要規劃好整個Layout的變化,不然重寫可是會累死人的。請點選。
第二種
另一種處理方式是暫停app。主要是寫一個script以進行暫停,然後可以在其他地方呼叫它。第三種
我有查到Unity有內建的東西似乎可以拿來用,叫做WSA.WindowSizeChanged,是在UnityEngine下。官方文件裡面有說,比方說可以用在snap時。"This event occurs when window rendering size changes."我認為這是最接近於解決snap view的東西了,我的用法是,找所有View的super class,然後在他的initialize裡面加進去:
UnityEngine.WSA.Application.windowsSizeChanged += YourMethodName;
然後加入方法:
public void YourMethodName (int width, int height) {
//your code
}
第四種
輸出成vs檔案後在App.cs中處理。這邊主要是依賴windows的framwork了:- 註冊螢幕大小變化的事件:WindowSizeChangedEvent
- 使用匿名方法呼叫,就是和1.一起。
- 判斷是否為全螢幕的狀態:ApplicationView.GetCurrentView.IsFullScreen。
以我來說,我是在App.cs內的SetWindow方法內註冊事件的:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// In SetWindow method of App.cs | |
using Windows.UI.ViewManagement; | |
// Registered the event SizeChanged and use it by delegate way | |
coreWindow.SizeChanged += delegate (CoreWindow coreWin, WindowSizeChangedEventArgs arg) | |
{ | |
//Get the current application view | |
ApplicationView currentView = Application.GetForCurrentView (); | |
// use the method of ApplicationView to check the screen state | |
if (currentView.IsFullScreen) | |
{ | |
if (AppCallbacks.Instance.IsInitialized()) | |
AppCallbacks.Instance.UnityPause(0); | |
return; | |
//or you can use | |
//UnityEngine.Time.timeScale = 1.0f; | |
} | |
else if (! currentView.IsFullScreen) | |
{ | |
if (AppCallbacks.Instance.IsInitialized()) | |
AppCallbacks.Instance.UnityPause(1); | |
//or you can use | |
//UnityEngine.Time.timeScale = 0.0f; | |
} | |
}; |
基本上運作是正常的,只是在縮小時暫停,畫面會變黑。還不太確定原因為何。
補充
順便補一點解釋。以下都是使用C#的語言。適用於Win 8。不適用於Win 8.1。你要如何取得你的view目前的狀態呢?可以透過WinRT裡面的ApplicationViewState enumeration來取得:
var CurrentViewState = Windows.UI.ViewManagement.ApplicationView.Value;
這邊的Value可以取得正在運行的app的view的狀態,可以知道是不是Snapped。
Resize event和View state change event的次序是已經決定的,所以view state event(以及相關的callback函數)會在resize event之前啟動。
若由view state change觸發的callback函數中搜尋display area size,可能會是錯的,舉例來說,從snap的寬度為320px轉變成橫向全螢幕時,view state會是fullscreen-landscape,但是寬度尺寸是320px。
但這個做法的最大問題是,Unity內部好像不能使用Windows的namespace,如果你要用,那要自己建立dll插入,這倒不是一件容易的事情。而且Win8.1之後就沒有snapped了。
Win8.1已經沒有snap view,而是要設定最小寬度,所以如果可以偵測目前App的寬度,那我認為是比較好的處理方法。
對於直接處理視窗大小的作法是:
取得目前App啟動之視窗的大小:Windows.UI.Xaml.Window.Current.Bound
(回傳Rect。Windows.UI.Xaml是namespace,Window是class,Current是屬性,取得應用程式目前已啟動的視窗,Bound是取得應用程式視窗的高度及寬度,作為Rect值)。
留言
張貼留言