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日星期二