2016年4月7日星期四

[Unity3D]用uFrame的Kernel在場景間修改玩家狀態和數據


在uFrame 1.6的 Example Project裏有一個UserManagementSystem的系統(WinCondition這個eEnum是我之後加的,下文會再討論)



public class UserManagementService : UserManagementServiceBase
{
    [Inject("LocalUser")] public UserViewModel LocalUser;

    public override void Setup()
    {
        base.Setup();
  // for develop only
  LocalUser.AuthorizationState = AuthorizationState.Authorized;
        //LocalUser.AuthorizationState = AuthorizationState.Unauthorized;
    }

    public void AuthorizeLocalUser(string Username, string Password)
    {
        if (Username == "uframe" && Password == "uframe")
        {
            Debug.Log("authorized in service");     
            LocalUser.AuthorizationState = AuthorizationState.Authorized;
        }
    }
}

這是處理Example Project內一開始登入的部份,就是確認登入成功後把AuthorizationState這個Enum轉成Authorized,方便在其他腳本檢查玩家的狀態。

我在想,是不是可以用UserManagementSystem內UserViewModel(我把這個instance命名為LocalUser, 上圖左上角)儲存玩家各種設定和資料,然後在不同場景不同的View 或 Controller的腳本把LocalUser取出來用或修改設定呢?

簡單說個例子,其中一個想做的功能就是在主畫面(有一個SetBattleScreenView)按不同作戰/勝利模式的按鈕,會修改LocalUser中WinCondition的設定,在進入作戰畫面後(另一個場景scene),而作戰畫面會檢查玩家在用哪個勝利模式(就是WinCondition),而運行不同的代碼。



(如果大家不了解uFrame MVVM模式可以來這裏了解一下:http://isaacforfun.blogspot.hk/2015/06/uframeflappy-brid.html)

2016年3月29日星期二

[Unity3D]讀取畫面之簡單進度條制作(Loading Screen)

之前轉換場景一直是用以下的方法:

Application.LoadLevel("SceneName")

因為這個方法比較懶和方便,但隨著場景內的東東越來多,轉場需時也開始越來越長,也因此在轉場時有了是不是卡住了或死機了的感覺。有見及此,小弟要開始製作一個有進度條的過場效果。然後找到Unity3D有以下的方法可以用:

Application.LoadLevelAsync ("SceneName");

剛開始滿失望的因為看到Unity Pro才可以用,然後發覺得原來Unity5已經可以免費使用了!關於它的API請到這裏:http://docs.unity3d.com/ScriptReference/Application.LoadLevelAsync.html

好了我們開始製作了~

2016年3月15日星期二

[Unity3D]uGui製作新手引導

新手引導就是讓玩家一開始玩遊戲時,指示玩家按不同按鈕,希望籍此讓玩家初步了解遊戲介面和各種功能。玩家角度,新手引導就是要不斷「點點點點」然後就可以開始自己玩遊戲了。

那麽應該怎樣做呢?比較常見及簡單的方法就是高亮相關的按鈕,加上箭頭/手指/對話框指示玩家(只能)按下這個按鈕,然後不斷重複這個動作在不同按鈕上,直至新手引導完成。簡單效果大約是這樣:



應該怎樣去達成這個效果呢?

2016年3月3日星期四

[Unity3D]版本5.3出現Fatal Error

話說Unity3D上到版本 5.3.1f1,有一段時間運行專案後出現了 Fatal error!


開始以為是自己的專案那裏有問題,最後發現每次出現這個狀況,電腦都在連iPhone的(因為開始用Unity remote測試遊戲)

然後我就發現了一個解決方法了!

2016年2月16日星期二

[Unity3D] Unity觸控指令問題:我在移動呀~不是按下了呀~

Unity有一個Touch的類別是用來控制手機或是平板電腦的觸控指令,裏頭有一個TouchPhase.Moved 和 TouchPhase.Stationary的狀態,顧名思義Moved是指觸控點在移動,Stationary是在按下不動,但是......

我明明在移動呀!你把我當成按下了!

本來的代碼跟效果圖如下:
代碼部份:這是在Updates裏,我有一個Boolean _clicking, 如果是按下了才會出現紅點


_touches = Input.touches;
  
if(_touches.Length == 1)
{
 if(_touches[0].phase == TouchPhase.Stationary)
 {
  Debug.Log("Clicked, 紅點出現");
  _clicking = true;
 }
 else
 {
  Debug.Log("Moving,  沒有紅點");
  _clicking = false;
 }
}

看代碼我想不會有問題吧?於是我就運行試試看:


結論是:我在移動呀~不是按下了呀~雖然我就乖乖找 Google跟 Facebook的大大求救,然後試驗到其中一個可行的方法!