顯示包含「Unity3D」標籤的文章。顯示所有文章
顯示包含「Unity3D」標籤的文章。顯示所有文章

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

2015年12月2日星期三

[Unity3D]在UI介面不觸發遊戲畫面的物件(Blocking Clicks)

在弄一個類似回合制的遊戲,遊戲上有個uGUI介面(Render Mode為Screen Space Overlay), Canvas設定如圖:


和一個可以放大縮小的棋盤,按下棋盤的格會出現紅色的圓點。

可是棋盤放大時,當玩家想按UI介面的按鈕,會不小心同時觸發棋盤格(出現紅點):




我想處理的問題是按下UI介面(上方半透明的介面)不會觸發棋盤的功能。

然後謝謝Facebook Unity群組的大大提供了一個不錯的影片:
Unity UI - Blocking clicks
https://www.youtube.com/watch?v=EVZiv7DLU6E

影片提供了三個方法:
1. Event System Checking
20160516補充:之前有網友反映EventSystem.current.IsPointerOverGameObject()在Editor測試沒有問題但放在Android機就不行,然後小弟找到以下方法
using unityEngine.EventSystems; 
#if IPHONE || ANDROID
 if(EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
#else 
 if(EventSystem.current.IsPointerOverGameObject())
#endif 
{
  //棋盤的邏輯
}

參考至雨松大大:http://www.xuanyusong.com/archives/3327 
另外找到一個不錯的研究:http://blog.csdn.net/liqiangeastsun/article/details/46490041

2. Event Triggers
將Event Triggers放到Cube/棋盤格,然後Pointer Up,類似uGUI Button的OnClick,把想運行的方法加進去

然後在攝影機(Camera)加上Physics Ray caster

3. Event System Interface
加上PointerClickHandler這個interface然後把棋盤的邏輯放進下面的代碼裏:
public void OnPointerClick(PointerEventData eventData){ 
//棋盤的邏輯
}

然後在攝影機(Camera)加上Physics Ray caster

雖然影片中提及第三個方法就最好的,但是我還是用了第一個方法。因為我不想把棋盤的邏輯放進另一個Function(方法)裏,不然比較麻煩,所以最後用一個if-case把想做的事情包住就好了。


2015年10月14日星期三

[Unity3D]讓自己的腳本(Script)成為uFrame的東西


最近在把另一個第三方插件 - GameObject Grids Pro放進uFrame裏。本身在uFrame以外寫了一個繼承了GridBehaviour的腳本

public class GSHexGridManager : GridBehaviour{
//Game Logic
}

大概是這樣,然後在uFrame裏建立一些玩家(Player)和敵人(Enemy)的東西,希望想在GSHexGridManager用一些玩家和敵人的數據和邏輯,但發覺不把GSHexGridManager轉成uFrameComponent是無法找到玩家和敵人的東西!也就是uFrame這個系統會一直不知道GSHexGridManager這個腳本的存在!

所以,我的 GSHexGridManager要同時繼承GridBehaviour和uFrameComponent兩個類別(Class),但這是C# 不准許的事情!然後想用Interface (介面)的方法去處理這個問題!

然後發覺有人問過這樣的問題:
http://forum.unity3d.com/threads/gamelogic-grids-a-library-for-hex-tri-polar-and-square-grids.189866/page-7#post-1780947

2015年10月7日星期三

[Unity3D][轉貼] C# 四個Timer的寫法

第一種:Time.deltaTime
第二種:Time.time
第三種:StartCoroutine
第四種:InvokeRepeating

從這個網誌看出來的:
http://home.gamer.com.tw/creationDetail.php?sn=2275726

先記錄一下 :P

2015年9月24日星期四

[Unity3D]接觸uFrame三個月有感

接觸uFrame大約有三個月了,其實這差不多也是開始了解並進行遊戲製作的時間。雖然有用Unity3D的經驗,但其實一直都不知道遊戲該怎樣做的。所以大約三個月前就可以問Google大神遊戲該怎樣做,然後在網上尋找一些寫遊戲的結構,框架之類,希望方便自己寫遊戲。其實小弟剛開始是研究MVC模式,但覺得有點困難。後來偶然在Asset Store發現uFrame,它用的是MVVM + Controller 的模式,覺得不錯,就買下來用了。三個月很快就過去了。驀然回首,雖然自己還是一名菜鳥,但對遊戲製作的認識及程式上的知識都多了。我想其中一個主要是uFrame 其實有個Slack的群組,大家只要買了uFrame就可以進去了,那裏可以問uFrame的問題、Unity3D的問題、遊戲製作的問題、甚至各種代碼的問題或閒聊都可以!群組裏的人滿友善。話說回來,這篇文章主要不是技術分享,只想說用uFrame的心路歷程。

如果想先了解uFrame是甚麽的話,可以先去看看小弟第一篇關於uFrame的文章!
傳送門:http://isaacforfun.blogspot.hk/2015/06/uframeflappy-brid.html

買下uFrame的6月的事,剛開始研究時發現先用uFrame 寫一個小遊戲最實際,然後就跟著官方教學的Angry Flapper(也就是Flappy Bird)來寫。剛開始其實廷順利的,跟著做大概很快就做好了,而且對uFrame的理解也多了,說到底就是 MVVM +Controller的模式。但發覺跟著教學做還是有一些問題,例如遊戲中的管子在離開畫面沒有被破壞(Destroy),後來發現原來版本不對了!身邊又沒有人用uFrame!最後發現原來uFrame有一個Slack的群組供大家發問,進去了之後很快就把問題解決了!

但是同時得知uFrame很快就更新了,還說到更新到版本1.6後會加入不少新元素,總之感覺是用當時1.5版本開發的話,轉過去1.6會很麻煩,也不知版本1.6的實際釋出的時間。因為覺得uFrame 1.5版本不用再有用,所以就放棄了研究uFrame 1.5,也沒有再更新用uFrame寫Flappy Bird系列的文章。有一段短時間重拾MVC模式的懐抱。

2015年9月15日星期二

2015年9月10日星期四

[Unity3D] Array與List

在學習List<T>, 其實List<T>跟Array有點相似所以問了一下Google大神,發現兩個不錯的說明

[C#] 陣列 & List<T>
https://kw0006667.wordpress.com/2013/04/03/c-陣列-listt/
下面的 code主要是抄考這篇的,只是弄了一個Unity的版本,用上Lambda真的廷方便的呀,Lumbda也是最近才學習的!左邊是參數(parameters), 右邊則是指令(instructions),這樣就不用開一個有名的function那麽麻煩!
students.Sort((x, y) => { return -x.Score.CompareTo(y.Score); });

例如這一句,(x, y)是參數,reutrn -x.Score.CompareTo(y.Score) 則是指令,這樣就可以由大到小排序了~

Array與List
http://sharecoder.blogspot.hk/2012/10/arraylist.html
//Array使用連續記憶體空間,List【不需要】使用連續記憶體空間。//
重點呀!長知識了~

好了看看測試的程式

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Test: MonoBehaviour {
 
 public struct Student
 {
  public string Name;
  public int Score;

  public Student(string name, int score)
  {
   this.Name = name;
   this.Score = score;
  }
 }
 
 void Start()
 {
  List students = new List()
  { 
   new Student("Tim", 80),
   new Student("Jimmy", 76),
   new Student("David", 92),
   new Student("Jason", 57),
   new Student("Amy", 40)
  };
  
  // 利用 Lambda 運算式,由大到小排序
  students.Sort((x, y) => { return -x.Score.CompareTo(y.Score); });
  
  foreach (var item in students)
  {
   Debug.Log(item.Name + " : " + item.Score);
  }
 }
}

結果:

2015年9月1日星期二

[Unity3D] 初嘗插件Grids Pro 與 Hex/Isometric tiles 的合作


前言

故事開始之先想先讓各位認識一下 2D Isometric Game,我想起兩個比較有名的遊戲:世紀帝國II和暗黑破壞神II


其實它們是用了Isometric Tiled Map 就是用2D去模仿3D的感覺,例如你看下圖的地圖,每一個正方體(Cube)看似立體:

每一個正方體都是平面(2D)的!只是畫出來好像立體(3D)~


你看到的地圖其實只是一張平面的畫~以前是怎樣將一用2D的素材去模仿3D的環境?就像我們怎樣畫畫是怎樣畫出立體的感覺?

這就要說起透視投影(Perspective projection)和平行投影(Parallel projection),而Isometric Game用的是等軸測投影(Isometric Projection),這是源自Parallel projection

簡單點說就是假設光線是平行,物件不會因為遠了而縮小但也產生了3D的感覺

如果引發了大家對Isometric Projection/Game 興趣的話,可以參考一下以下網址
Isometric game 及譯法漫談:http://www.ituring.com.cn/article/788
或是問問偉大的Google大神!

2015年8月5日星期三

[C#]使用 "is" 和 "as" Operators的分別

一直都是見別人都是用as, 像是
GameObject myObject = Instantiate(refObject) as GameObject;

然後有天見到有人把 as 寫成 is 我以為他打錯了,誰料翻查下發現原來是有分別的!

長知識了~

以下就是答案:
How to: Safely Cast by Using as and is Operators (C# Programming Guide)

//In general, the as operator is more efficient because it actually returns the cast value if the cast can be made successfully. The is operator returns only a Boolean value//