2017年11月25日 星期六

[Unity 範例檔] 即時戰略選取框(3D)

使用滑鼠拖曳出選取框,被該框圈住的物件將會視為已選取。

線上玩
範例檔下載 (v2.1) 2017.11.27 更新
範例檔下載 (v1) 2017.11.24 首發
================================================

在撰寫該功能時參考了不少網站的教學,例如:
 http://hyunkell.com/blog/rts-style-unit-selection-in-unity-5/
 http://www.bendangelo.me/tutorials/rts/2015/12/30/rts-unit-selection-in-unity.html

但他們提供的選取效果並沒有很理想,
因為上面網站提供的選取是要使用者必須圈到【生物的座標點】才算選取,
而真正對使用者更為直覺的應該是判斷是否圈到【生物的碰撞器】



為了達到這個效果真是花了我超過兩天的時間研究東研究西。
我想了兩個做法:
  1. 依照使用者拖拉的選取框,動態產生MeshCollision資料去碰撞場景生物。
  2. 將轉換生物的Collision成2D資訊 再與選取框做碰撞判斷。
本文提供的是第一種方式,目前看起來沒啥問題。(動態產生MeshCollision搞了蠻久的)
但是第二種方式有一些優勢存在...也許改天也會試著實做出來吧!

================================================
V2更新內容 2017.11.25:
由於我方式是依照使用者拖曳的位置跟矩形大小動態調整拉3D Box
但這樣做法會有一個風險:當使用者拖拉的範圍太小時會當機 @@b
那我的解決之道就是限制3DBox只會在使用者畫的範圍夠大才更新。
這樣的做法雖然在 Perspective Camera (透視攝影機) *不太會有問題
但是在 Orthographic Camera 卻很容易當機@@

所以我花了整個假日,在想要怎麼解決這問題。
最後生出了V2版本。

在V2版本中 Perspective Camera 跟 Orthographic Camera 將會採用不同的碰撞器。
來避免V1版本中,Orthographic Camera 有機率被玩家搞當機。

已知問題
為什麼說 Perspective Camera 不太會有問題呢?
因為在V1或V2版本中,只要把Perspective Camera 的 Field Of View 參數調低於20以下
還是有機率當機的 ! 不信的話你把 Field Of View 參數 調到1,然後隨便拖拉出選取框
就會當機了~~

我自己認為應該不會有人用了 Perspective Camera,
還要把 Field Of View 參數調低於20以下所以V2版本就這樣放著了。
P.S 2017.12.01:馬上打臉自己...我自己在用的遊戲就有把 Field of View 調到10了...
P.S 所以之後還會有V2.2要更新....

但是如果你莫名其妙的就是有這個需求 你可以把下面的程式碼:
     if (Mathf.Approximately(sRay.origin.x, eRay.origin.x)) return;
     if (Mathf.Approximately(sRay.origin.y, eRay.origin.y)) return;

改成下面這樣:
     if (Mathf.abs(sRay.origin.x-eRay.origin.x)< Dist) return;
     if (Mathf.abs(sRay.origin.x-eRay.origin.x)< Dist) return;
上面的變數Dist 可以自行使用別的浮點數替代,
數值越大表示使用者要拖拉越大範圍,3DBox才會更新。

2.1 發現還是很容易當機,改用成用下列代碼做判斷 (Dist 我用0.1f)
     if (Mathf.abs(SelectFrameTransform.position.x-Input.mousePosition.x)< Dist) return;
     if (Mathf.abs(SelectFrameTransform.position.y-Input.mousePosition.y)< Dist) return;

 V2心得:
經過這一番折騰後我認為【將轉換生物的Collision成2D資訊,再與選取框做碰撞判斷】
會比我現在這個方法來的簡單而少問題。
  

V2.1更新內容 2017.11.27: 
  • 修正、調整部分變數與Calss的命名 (我很不擅長這個,請大家給我建議)
  • 修正在Perspective 模式下當機的問題。
  • 修正 Orthographic Camera下,更新SelectBox旋轉值的時機。

沒有留言:

張貼留言