在unity做一個3d旋轉菜單,像亂鬥西遊2的這種:

暫時有兩種方法可以實作:
一、當做是2d界面,通過定義幾個固定點的坐标、大小、透明度,還有每個點的panel depth大小,把資料存儲下來,在手機滑動的過程中計算滑動劃過的距離和這個panel大小的比值,乘以兩個點之間的距離,獲得坐标點移動的距離,通過改變x軸改變位置,同理改變大小和透明度。
這個方法我自己做2d遊戲的時候實作過,做起來比較簡單,沒有什麼可拓展性可言,并且會有很多限制,比如拖動過程中很難轉變方向。要自己實作運動中的彈性(這裡可以用一個itween插件來解決運動中彈性的問題)
這裡的拖動效果有兩個實作方法:1.像上面說的計算每一點來拖動。2.用itween來直接跳轉到下一點,但是手指已停止就停止每個按鈕的動作。
二、做3d界面,通過改變z軸,把camera移到前上方往菜單上照。還是要定義幾個固定的點的坐标,透明度,每個點的panel depth的大小,通過itween來跳轉到固定點。
三、使用一個上網找到的資源,http://pan.baidu.com/s/1sjA7XDF,一個選擇立體塊的小demo。基本已實作需要的功能。
這裡我再說一下我改過之後的一些地方
1,原本demo的碰撞體是在螢幕前放一整塊平面的碰撞,每個方塊不帶碰撞。這點可以從原來的ui結構中可以看出
但是我們項目要實作的功能是除了左右滑動以外,點選左右的方塊會對應的居中,對中間方塊能選擇對應的模式進行遊戲。
所有我把前面的一整塊碰撞去掉。每個方塊加上碰撞,并把這個demo拖動事件的監聽腳本挂着每個方塊上。
同時在點選事件上加判斷,如果在最前方出發按鈕事件,如果不在最前方調用這裡面的函數CenterOn自動居中。(關于是否最前方的判斷後面再講)
2.上面有個問題是,這個demo的方塊不得少于6塊,如果像我一樣是4塊,需要改一個地方
偏移量盡量減少。
3.由于最後在2d的ui中顯示,而且我用的是ngui,3.0之後都跟z軸無關,隻跟depth有關。是以要控制好每個按鈕圖檔文字等uiwidget的depth。
首先這裡要解決的是排序問題,把每個按鈕從最前往最後排到一個list裡
這裡我的方式是:
首先因為這個demo的腳本是通過周遊父節點下挂的子節點來确定GameObject,然後儲存到contentObjects裡,
是以我顯示定了一個類,這個類包括GameObject和他的z軸這兩個變量。(可以把z軸單獨拉出來,不過我覺得這樣簡單就這麼做了)
并且內建iComparable這個接口,重寫CompareTo這個函數來進行之後的比較。
class SortObject : IComparable
{
public float Z;
public GameObject Object;
public int CompareTo(object obj)
{
int result;
try
{
SortObject sortObj = obj as SortObject;
if (this.Z > sortObj.Z)
{
result = -1;
}
else
result = 1;
return result;
}
catch (Exception ex) { throw new Exception(ex.Message); }
}
}
private List<SortObject> SortObjects = new List<SortObject>();
并且在LateUpdate()中,當在選中過程中把contentObjects和z軸值指派過來并一直排序。通過這樣來識别深度depth,并找出最前面的Object。
在每個方塊就是每個GameObject上挂一個uipanel來控制深度。并通過上面的排序指派每個uipanel的depth值
同時在每個方塊上面挂上一個uisprite來控制透明度(本身uipanel應該是能控制透明度,但是不知道為什麼這裡不行)
設定最大透明度和最小,通過z值在最前和最後之間的比值來計算透明度大小。
到這裡基本就完成了我們項目的需求。
這個方案使用起來最快,最少的計算量實作了最好的效果,友善拓展且基本沒什麼限制