天天看點

unity制作一個3d旋轉菜單

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

unity制作一個3d旋轉菜單

暫時有兩種方法可以實作:

一、當做是2d界面,通過定義幾個固定點的坐标、大小、透明度,還有每個點的panel depth大小,把資料存儲下來,在手機滑動的過程中計算滑動劃過的距離和這個panel大小的比值,乘以兩個點之間的距離,獲得坐标點移動的距離,通過改變x軸改變位置,同理改變大小和透明度。

這個方法我自己做2d遊戲的時候實作過,做起來比較簡單,沒有什麼可拓展性可言,并且會有很多限制,比如拖動過程中很難轉變方向。要自己實作運動中的彈性(這裡可以用一個itween插件來解決運動中彈性的問題)

這裡的拖動效果有兩個實作方法:1.像上面說的計算每一點來拖動。2.用itween來直接跳轉到下一點,但是手指已停止就停止每個按鈕的動作。

二、做3d界面,通過改變z軸,把camera移到前上方往菜單上照。還是要定義幾個固定的點的坐标,透明度,每個點的panel depth的大小,通過itween來跳轉到固定點。

三、使用一個上網找到的資源,http://pan.baidu.com/s/1sjA7XDF,一個選擇立體塊的小demo。基本已實作需要的功能。

unity制作一個3d旋轉菜單

這裡我再說一下我改過之後的一些地方

1,原本demo的碰撞體是在螢幕前放一整塊平面的碰撞,每個方塊不帶碰撞。這點可以從原來的ui結構中可以看出

unity制作一個3d旋轉菜單

但是我們項目要實作的功能是除了左右滑動以外,點選左右的方塊會對應的居中,對中間方塊能選擇對應的模式進行遊戲。

所有我把前面的一整塊碰撞去掉。每個方塊加上碰撞,并把這個demo拖動事件的監聽腳本挂着每個方塊上。

unity制作一個3d旋轉菜單

同時在點選事件上加判斷,如果在最前方出發按鈕事件,如果不在最前方調用這裡面的函數CenterOn自動居中。(關于是否最前方的判斷後面再講)

2.上面有個問題是,這個demo的方塊不得少于6塊,如果像我一樣是4塊,需要改一個地方

unity制作一個3d旋轉菜單

偏移量盡量減少。

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。

unity制作一個3d旋轉菜單

在每個方塊就是每個GameObject上挂一個uipanel來控制深度。并通過上面的排序指派每個uipanel的depth值

unity制作一個3d旋轉菜單

同時在每個方塊上面挂上一個uisprite來控制透明度(本身uipanel應該是能控制透明度,但是不知道為什麼這裡不行)

設定最大透明度和最小,通過z值在最前和最後之間的比值來計算透明度大小。

到這裡基本就完成了我們項目的需求。

這個方案使用起來最快,最少的計算量實作了最好的效果,友善拓展且基本沒什麼限制

繼續閱讀