2016年6月13日星期一

[Unity3D] uFrame裏修改ViewModel的各種方法


uFrame是根據MVVM的結構的,而當中的ViewModel是負責每一個MVVM的物件的變數(properties),如果大家不淸楚的話可以先到這裏了解一下:http://isaacforfun.blogspot.hk/2015/06/uframeflappy-brid.html



遊戲中,我們不時需要修改物件的變數,例如血量,狀況(State)等,而uFrame的結構,這是建議直接在Controller中修改變數的,但小弟有時想在View的腳本中修改ViewModel的數值,原來是可以的,但當中有它的限制,所以就在這裏列出小弟用過修改ViewModel的方法:

2016年5月1日星期日

[PixelArt]Aseprite OR Pyxel Edit

突然發現下文原來是在兩個多月前寫下的,軟件買下來之後沒什麼時間畫,以下是患有選擇困難症的小弟買畫素像畫軟件:Aseprite 或 Pyxel Edit之前的少少研究,希望大家有用~

===============兩個月前的文章=======================

事源是小弟突然對Pixel Art(素像畫)產生了興趣,然後Google了一下想找一些畫的軟件

http://www.slant.co/topics/1547/~pixel-art-sprite-editors

最後在兩款都很好的軟件之間猶豫:Aseprite 和 Pyxel Edit



它們的價錢也差不多,分別是10美元和9美元,而且都支援Mac和Window!但小弟有選擇困難症﹐而且也想先買一個試試看,於是就開始找不同......

小弟在 Google 和 Youtube 的協助下了解它們的分別,還有不要面的在Twtich找畫素像畫的實況主,問他們Aseprite和Pyxel Edit的分別

在未決定買那個之前,我就簡單講述一下兩者的分別。


2016年4月22日星期五

[Unity3D]大型手遊用,Android OBB文件研究


為什麼用到OBB (Opaque Binary Blob)?
Google Play限制了只可以上載小於100MB的apk檔(以前是50MB),但App Store提供上載apk擴展文件,OBB檔則是一種可供上載的擴展文件。

//啟用分離應用程序二進制(Split Application Binary)時,播放器可執行文件和數據將分離,生成僅包含可執行(Java, Native) 代碼(約為10MB)、任何及所有腳本/插件代碼以及第一個場景數據的.apk(主要應用程序二進制)。其他數據(所有其他場景、資源、流媒體資源...)將分別序列化成 APK 擴展文件 (.obb)。//


之後我在Asset Store找到個OBB Downloader
Google Play OBB Downloader:
https://www.assetstore.unity3d.com/en/#!/content/3189

但是我試了一整天都無辦法下載建立出來的OBB,然後有人告訴我,Unity 4.6之後可以自動下載OBB了,所以可以以不用這插件 OTL

然後,幾經辛苦,終於可以用OBB了,以下是一些小心得跟大家分享

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的大大求救,然後試驗到其中一個可行的方法!

2016年2月5日星期五

[Unity3D] 手動更新uFrame到最新的Unity版本

因為uFrame對相應Unity的版本更新比較慢,所以uFrame用家有時不得不手動更新uFrame到最新的Unity版本

之前試過從Unity 5.0更新到Unity 5.1遇上一個小問題,最後發覺原來是Unity的命名改變了:

不過在uFrame,有個比較萭用的方法,因為uFrame有兩個腳本(Script)會檢查Unity的版本,只要加上新得版就可以了!

這兩個腳本分別是:
UIBinding.cs
JSON.cs (這個要修改的地方在line 665, 比較難找~)

本來是這樣:
#if UNITY_4_6 || UNITY_5_0 || UNITY_5_1 

加上新版本:
#if UNITY_4_6 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3

完成!uFrame可以用在新的Unity版本了~

題外話:
下面有網友提及Header 3 會出面error的問題,小弟之前在Unity 5.1版本也遇過這個問題,好像是uFrame自身的Header 3有點怪,我暫時的設定是這樣,暫時也沒有問題

[Unity3D]學習UniRx前對它的認識

(這篇是念念碎文章還沒有學習的心得,不過讀者有興趣先了解一下也可以看看喔)

認識UniRx(Reactive Extensions for Unity)是因為小弟在uFrame,而uFrame這插件在版本1.5之後也加入了UniRx這個插件,其實小弟剛開始以為UniRx的功能是屬於uFrame的,然後才發現原來Asset Store有一個叫UniRx的插件,而且是免費的!最近發覺得UniRx好像很強大,所以想研究起來,我們先看一點UniRx在Asset Store的簡介,文末也有一些相關傳送門,大家對小弟的文字沒興趣可以直接滑下去喔XD

//Reactive Extensions for Unity that allows LINQ to asynchronous and LINQ to multithreading and LINQ to events and more. Welcome to the reactive game architecture! //

//Ordinary, Unity network operation use WWW and coroutine but coroutine is not good practice for asynchronous operation.//

//Unity is single thread but UniRx helps multithreading for join, cancel, access GameObject etc.//

2016年1月27日星期三

[Unity3D]除錯系列:not all code paths return a value

小弟打算弄一個系列將平日遇到的臭蟲(Bug)記錄下來,雖然可能是一些很白痴的Bug,但小弟記憶力從來不好,所以打算借用這個日誌加深自己的記憶,當然也希望可以幫助有需要的菜鳥(因為小弟也是一名大菜鳥 XD)

其實小弟有個習慣把當日每天工作的想法、做法、問題、解決方法、奇想等等記錄下來的開日誌,現在也有60頁了!當中還把一些臭蟲記錄了,因為是本身比較可能只有自己看得懂,整理到這個網誌需時.......

無論如何,今日為大家介紹本系列一個臭蟲:

not all code paths return a value

事源是小弟弄了一個新的Function把兩點計算然後reutrn一個方向的值好讓敵方知道該怎樣跟隨玩家(有點有機會再跟大家說,我覺得廷有趣的),但是建立了之後就出Error了!



就是"not all code paths return a value",先讓大家看看代碼猜猜是那裏問題


 public FlatHexPoint DirectionPoint(FlatHexPoint targetPoint, FlatHexPoint currentPoint)
 {
  //NorthEast, North, NorthWest, SouthWest, South, SouthEast
  FlatHexPoint point = currentPoint - targetPoint;
  
  //N, NE, E, S
  if(point.X >= 0)
  {
   if(point.Y > 0)
    return FlatHexPoint.North;
   else if (point.Y == 0)
    return FlatHexPoint.NorthEast;
   else
   {
    if(point.X == 0)
        return FlatHexPoint.South;
    else
        return FlatHexPoint.SouthEast;
   }
  }
  
  //NW, SW
  else if(point.X < 0)
  {
   if(point.Y > 0)
    return FlatHexPoint.NorthWest;
   else
    return FlatHexPoint.SouthWest;
  }
 }


2016年1月6日星期三

[Unity3D]uFrame MVVM & ECS WIKI

Penflip 裏的早前 Book of Frame 已經沒有了,如果想看uFrame的文檔可以到一直都在的GitHub
https://github.com/InvertGames/uFrame.Documentation

uFrame MVVM在這裏:
https://github.com/InvertGames/uFrame.Documentation/blob/master/uFrameMVVM/pages/home.md

uFrame 1.6 Example Project的Tutorial 放在這裏了,大家去興趣可认到這裏看喔~
https://github.com/InvertGames/uFrame.Documentation/tree/master/uFrameMVVM/tutorials/getting-started-for-uframe-mvvm-16

上年uFrame 終於出了 uFrame ECS(Entity Component System), 感謝uFrame大大們,如果就上年10月前買了uFrame MVVM可以免費取得 uFrame ECS Indie,就是可以用uFrame ECS但是沒有Source Code,有Source Code的版本是uFrame ECS Pro,這個比較貴喔,我想Indie還好吧。uFrame ECS 好像把遊戲的邏輯拆得更少,用上去比uFrame MVVM更易入手。小弟還沒有詳細試試看,有機會再跟大家更新

uFrame ECS:
https://github.com/InvertGames/uFrame.Documentation/blob/master/uFrameECS/Overview.md

我也弄了一個ECS的播放淸單:
https://www.youtube.com/watch?v=uxivyGL5StA&list=PL_4-s3WYPtenJlTdsCTl8i9Vi1bj-KMOU&index=1