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

[Unity3D] uFrame 1.6 YouTube片集合!

自己弄了一個收集 uFrame 1.6 的教學片的播放清單:
https://www.youtube.com/playlist?list=PL_4-s3WYPtenA7g4OqkH9cBEFOjNV5dWZ

有官方及非官方的影片,還會不斷更新喔

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//


2015年7月27日星期一

[Unity3D] "The Book Of uFrame"的誕生

自從在Asset Store買了uFrame之後加入了他們Slack的群組,這裏的氣氛超好,Developers都很有善很樂意答解不同問題和一起討論uFrame可以改善的地方,當然我也是其中一個受惠的人XD uFrame 1.6更新之後增加了不少的東西,然後大家都好奇的在試,當中新增了一個Default Project,裏頭也有不少東西值得學習,但是沒有太多指引下,對小弟來說實在有點難度...... 然後有一天,群組裏出現了一群有心人,決定弄一個比較完善和合適uFrame 1.6的Wiki, 就是這樣,"Book of uFrame" 在這幾個有心人的努力下慢慢形成了: https://www.penflip.com/bartlomiejwolk/uframe-documentation?invite=kVBKehap

目前還會不斷更加內容,當中有GitHub本身已經有的Wiki (uFrame Guide):
https://www.penflip.com/bartlomiejwolk/uframe-documentation/blob/master/pages/home.md

以及我期待以久的uFrame 1.6 tutorial~
uFrame MVVM 1.6 Getting Started I:
https://www.penflip.com/bartlomiejwolk/uframe-documentation/blob/master/tutorials/getting-started-for-uframe-mvvm-16/tutorial-1.md
uFrame MVVM 1.6 Getting Started II:
https://www.penflip.com/bartlomiejwolk/uframe-documentation/blob/master/tutorials/getting-started-for-uframe-mvvm-16/tutorial-1.md

Getting Started I 主要是如何建立第一個uFrame專案和運行裏頭Default Project的步驟

Getting Started II 則主要講述Default Project裏的操作環境和MainMenu System的部分,還會教你在每個Screen 轉換時做簡單的動畫(Default Project本身沒有的)

大家有興趣可以先去看看喔~

2015年7月24日星期五

[Unity3D]讓物件圍繞外在一點旋轉


小弟在用uGUI, 因為uGUI上沒有任何Tween的東東,所以最後盯上了DoTween作研究
然後想做一個Menu圍繞外在一點而不是物件自己的中心旋轉進入畫面,大概想做這個效果:




在找DoTween有沒有方法告訴物件圍繞自定的某一點旋轉,而不是物件的中心,找了DoTween官方的API好像沒有類似的東西,最後發現原來是我方向錯了 OTL


2015年7月15日星期三

[Unity3D]uFrame 1.6更新了


昨天uFrame 終於在Asset Store正式更新到1.6:
https://www.assetstore.unity3d.com/en/#!/content/14381


因為官方之前說好了1.6 之前會減價,所以更新到1.6之後格價從$60上調回$90了 (幸好在$60時買了)。Asset Store的uFrame還會提及1.5r2 及 1.6兩個版本。大概因為1.6版本的改變不少,uFrame 1.6 特別提及到新增了Kernel 這東西,官方也更新了youtube channel的教學:

KernelTalk(UFRAME 1.6 PART1)
https://www.youtube.com/watch?v=g6aWob_UbK0&list=PLkyxC3Co3Q39AyC_jB_kK4WoGpSZzjSa6

UFRAME 1.6 PART2
https://www.youtube.com/watch?v=QSwXIlNbVCg

PART 1分了三段:
第一段簡介Kernel的由來
第二段重點講述Kernel及提供兩個例子作講解(沒有uFrame MVVM)
第三段講述 Kernel跟 uFrame MVVM的合作

PART 2則總括講述 uFrame 1.6 的重點更新,作業環境等等


[Unity3D]如何改變物件的座標(原點)位置

有點完主義想把物件座標(原點)位置設定為(0,0,0),也是為了方便打程式時的設定,但是這樣設定後,運行遊戲時會見到圖的邊緣,可是我又不想改變Camera的座標,於是就想改變這圖本身的座標(原點)位置,不在是中央,只是問Google大神找不到答案......


於是我想到了一個不知好不好,但解決到我完美主義的答案!

2015年7月1日星期三

[轉貼]Unconventional Tips for Improving your Programming Skills

原文:http://gamasutra.com/blogs/LivioDeLaCruz/20140702/220177/Unconventional_Tips_for_Improving_your_Programming_Skills.php

1. Eat Well, Sleep a Lot, and Stay Hydrated!

2. Take Periodic Breaks, and Get Increased Productivity

3. Learn How to Pump Yourself Up for Work

4. Don’t Work More than Eight Hours Per Day

5. Stop And Think About What You’re Doing

6. Get Good at Writing Documentation

7. Get Good at Taking Notes and Writing Down Your Ideas

8. Know When to Take Shortcuts

9. Know When to Clean Up Your Code

10. Get Really, Really Good at Debugging

11. Learn to Predict Bugs Before They Appear

2015年6月30日星期二

Unity 5.1中EventTrigger的小改變

原來更新Unity 5.1時,EventTrigger做了一些小改變
Unity 5.0或之前:UnityEngine.EventSystems.EventTrigger.delegates
Unity 5.1          :UnityEngine.EventSystems.EventTrigger.triggers

在用插件的時候發現的,如用Unity 5.0, 把Unity更新到5.1或將delegates改成triggers即可

2015年6月22日星期一

[CLIP STUDIO PAINT]說好了Photoshop載入和匯出功能呢?

之前見CLIP STUDIO PAINT大減價,結果忍不住就把它買下來XD (減價真是邪惡的策略!)

它除了對於畫CG和漫畫有各種各樣的好(有興趣可以去看看http://www.clipstudio.net/tc/),就是它可以載入(Import)和匯出(Export) psb和psd檔。因為本身有用Photoshop,所以有些地方能轉到Photoshop修改或加工實在太好了!

然後有天打算轉到Photoshop時......











說好了的psd呢!!!

於是我只好電郵到CLIP STUDIO PAINT問一下,他問我有沒有把程式移到別處,這會因為不能使用PSD插件而無法顯示於匯出項目


然後發現我不知甚麼時候放了在Desktop(桌面),直接從Application裏或放在Dock上開啟就沒事了,然後我開CLIP STUDIO PAINT的資料夾看一下:






大概是這裏吧 OTL

2015年6月18日星期四

用uFrame寫Flappy Bird(二)遊戲結構

廢話

來到第二回,開始跟大家做遊戲了。首先申報一下,希望想用uFrame 1.5 寫 Flappy Bird 的朋友可以先跟上 youtube 的教學片,並視本文為輔助。因為本日誌的主要目的是幫助小弟自己記錄學習過程(有夠自私XD),不會一步步跟大家做,內容可能不完整,而且小弟也是 Unity 的新手,如果當中有甚麽不對請多多包涵及請告訴小弟,謝謝


前言

這回先不會提及代碼,但是會簡單講述我們在uFrame環境中看到的所有東東,就是它們告訴我們遊戲的結構,而且透過uFrame我們可以用圖像來表達一下。首先我就先介紹它們的名字:
-GameManager
-SceneManager
-SubSystem
-Element
-View
-State

那Flappy Bird我想大家都知道是怎樣玩吧?不知道的話可以看看 youtube 的教學片,基本上是一樣的。

uFrame寫Flappy Brid的教學片: https://www.youtube.com/watch?v=oo8sRgCa6hk&list=PLkyxC3Co3Q38r0ZWow9Jw1Xd7Wj0xbdnd&index=1


遊戲結構

首先在uFrame的環境是空空如也(那當然XD), 這裏我們先稱為Root, 在Root的環境我們先加入一個SceneManager,就叫AngryFlapperManager吧;然後再加入一個SubSystem,就叫Game吧,然後把Game連上AngryFlapperManager,如下圖:


那SceneManager和SubSystem是甚麽呢?

SceneManager 顧名思義就是管理(某一)場景,每一次你載入一個場景,uFrame會確保所有東西已經載入和可以正確地運作(當然首先要你代碼正確),另外SceneManager會提供場景轉換,AngryFlapperManager下的Transitions,我加了GoToMenu,這個之後我再作講解
(想了解多點SceneManager可以來這裏:https://github.com/InvertGames/uFrame/wiki/Scene-Managers

SubSystem就是子系統,在設計遊戲時,你就可以透過子系統把不同代碼分類,例如:AimingSystem, AISystem, MovementSystem等(大家猜到是甚麽吧),這款遊戲比較簡單,我們建一個SubSystem就可以了。每個遊戲玩家都有一個屬於自己的instance,裏面儲存玩家各種數據和狀態,所以我們之後記得把AngryFlapperGame加入到SubSystem的instances裏(現在還未建立,不能加的不用擔心)
(想了解多點SubSystems可以來這裏:https://github.com/InvertGames/uFrame/wiki/Subsystems



2015年6月16日星期二

用uFrame寫Flappy Bird(一)簡介

前言

事源是小弟想寫遊戲但沒有相關經驗,雖然FYP是用Unity3D, 但是其實只是做Leap Motion的研究,不算是做遊戲。然後開始在網上尋找一些寫遊戲的結構,框架之類,希望方便自己寫遊戲。研究過MVC模式,但小弟不才,還是覺得有點困難。然後在Asset Store發現一個不錯的可視化插件做遊戲開發框架 - uFrame;然後見youtbue也有一些教學片,最後決定買下來試試看。順帶一提,uFrame是用MVVM模式的,而小弟正在用uFrame 1.51r2 version。

uFrame是甚麽?

這是從Unity Asset Store抓下去的簡介(網絡中文翻譯版):
「uFrame是最先進的遊戲開發框架設計給甚至新手開發人員工作的一個專業級圖形工具。強大的行為系統和一個強大的設計模型專門為Unity引擎開發遊戲,你會比以往開發的更快!

使用uFrame你可以比以前更好,更穩定的開發維護你的遊戲。

你有沒有為開發一個項目因為一個小的變化就改很長時間而頭疼?如果是這樣的話,uframe是你的完美解決方案!開始像現在這樣專業級開發遊戲吧!」

2015年6月15日星期一

NGUI與uGUI的抉擇

最近因為工作關係再次接觸Unity3D, 雖然上年做FYP也是用Unity,但已經有一年多時間沒有再用甚至沒有寫code了!這次先研究UI部份,發現Unity上年更新4.6時已經出了新的GUI系統(uGUI);NGUI則是本身最火爆的GUI插件!但是因為NGUI本身要錢,所以想研究uGUI做開發的可能性。

雖然沒有用NGUI的經驗,但接觸了uGUI已經有大約兩星期了,可以應付目前的工作,而且也很方便。在網上也翻查了一下,看了不少有用的資料,也發現原來NGUI的作者Michael “ArenMook” Lyashenko在2012 - 2013年曾在Unity工作,我想這給了uGUI不少幫助!


我想我還是會做uGUI做下去!

發現一個不錯的比較,我把它轉成了繁體,值得參考喔~
(可按圖放大)