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