UGUIは、大規模なカーネル(XIII)ドロップダウンを探ります

ドロップダウンは(ドロップダウンボックス)は、新たにユニティエディタドロップダウンに建てで、UGUIのマスターとして記述することができ、付属のテキスト(ラベルターゲット)、画像(矢印はオブジェクト)、ScrollRect(テンプレートオブジェクト)、トグル(テンプレート\ビューポート\コンテンツに従います\項目)とスクロールバー(テンプレート\スクロールバー)。また、ボタン(ブロッカー)は、ドロップダウンボックスを展開して実行]をクリックして、だけでなく、テンプレートに見えるドロップダウンリストの別の例に従って作成されます。そのような複合体の成分は、実際にはコードの600行について、当社はポートフォリオに精通叫んだUnityが公式のようにする必要があります。この記事では、どのようなドロップダウン魔法を探求します。

慣例により、UGUIソースダウンロードを伴います。

我々ドロップダウンインナークラスDropdownItem(ドロップダウン)を初めて目。動作状態ドロップダウンボックスを展開し、上記商品を追加していることがわかります。

DropdownItemはMonoBehaviourとIPointerEnterHandler、ICancelHandler二つのインターフェースから継承されました。

テキスト、画像、rectTransformとトグル:それは4つの属性が含まれています。

IPointerEnterHandlerから継承されたメソッドを(マウスが入ったとき)OnPointerEnter、選択されたオブジェクト(チャン大カーネルパラメータUGUI探索()EventSystem)としてこのオブジェクトにSetSelectedGameObjectのEventSystemを呼び出します。背景色が変更されたアイテムオブジェクトによって明示されます。

OnCancel(キーが押されるキャンセル)ICancelHandlerから継承されたメソッド、親オブジェクトのドロップダウンコンポーネントを入手することは、非表示メソッドを呼び出します。具体的な性能はオプションテーブル(ドロップダウンリスト)隠されています。

ドロップダウンメニューは、選択可能とIPointerClickHandler、ISubmitHandler、ICancelHandler 3つのインターフェイスから継承されました。

目を覚まし方法、TweenRunnerの新しいタイプFloatTween m_AlphaTweenRunner変数を書き換え、表示/非表示オプション実行透過性のあるグラデーションテーブル(ドロップダウンリスト)の時間で、この変数を初期化ドロップダウン。その後m_CaptionImageが利用可能な設定、変数を使用すると、画像を設定するオプション(オプション)を選択した場合、それはm_CaptionImageを使用することになり、キャプションイメージで編集に対応してドロップダウンのタイトルに表示されます。M_Templateは最終的に、この変数は、テンプレートのテーブルオプションとして、たとえば、テンプレートオブジェクトに対応し、falseに設定します。

OnPointerClick(クリックしたときに、IPointerClickHandlerから継承されます)とOnSubmitの(ISubmitHandlerから継承され、確認キーが押された)Showメソッドを呼び出し、(ICancelHandlerから継承され、キーが押されるキャンセル)ICancelHandlerは隠す方法と呼ばれます。

表示ドロップダウンは非常に長いが、最も重要な方法であるが、それはそれは固執する価値があります。

        //ドロップダウンを表示します。
        //
        //ドロップダウンのための計画では、ドロップダウンが画面内に含まれていることを確認するためにスクロールします。
        //
        //私たちは、キャンバスがドロップダウンが内部に保持されなければならないことを画面であると仮定します。
        //これは、常に画面スペースキャンバスモードで有効です。
        //ワールド空間キャンバスのために我々はそれが使われているのか分からないが、それはゲーム内のモニター用などである可能性があります。
        //私たちは、それキャンバスにドロップダウンが含まれているために十分な大きさでなければならないことを公正な制約を検討してください。
        ます。public voidショー()
        {
            場合(!!!のisActive()|| IsInteractable()|| m_Dropdown = null)の
                リターン;
 
            (もし!validTemplate)
            {
                SetupTemplate();
                (!validTemplate)であれば
                    リターン。
            }
 
            //ルートキャンバスを取得します。
            VARリスト= ListPool <キャンバス>に.get();
            gameObject.GetComponentsInParent(偽、リスト)。
            (list.Count == 0)の場合
                のリターン;
            キャンバスrootCanvas =リスト[0]。
            ListPool <キャンバス> .Release(リスト);
 
            m_Template.gameObject.SetActive(真の);
 
            //インスタンス化ドロップダウンテンプレート
            m_Dropdown = CreateDropdownList(m_Template.gameObject)。
            m_Dropdown.name =「ドロップダウンリスト」。
            m_Dropdown.SetActive(真の);
 
            //メイクドロップダウンRectTransformはオリジナルと同じ値を持ちます。
            RectTransform dropdownRectTransform = m_Dropdown.transform RectTransformとして。
            dropdownRectTransform.SetParent(m_Template.transform.parent、偽);
 
            //インスタンス化のドロップダウンリストの項目
 
            //ドロップダウン項目を無効にして下さい。
            DropdownItem ItemTemplateに= m_Dropdown.GetComponentInChildren <DropdownItem>();
 
            ゲームオブジェクトの内容= itemTemplate.rectTransform.parent.gameObject。
            RectTransform contentRectTransform = content.transform RectTransformとして。
            itemTemplate.rectTransform.gameObject.SetActive(真の);
 
            //ドロップダウン項目のrectsを取得
            RECT dropdownContentRect = contentRectTransform.rect。
            RECT itemTemplateRect = itemTemplate.rectTransform.rect。
 
            //計算アイテムのエッジと背景のエッジ間のオフセット視覚
            ベクトル2 offsetMin = itemTemplateRect.min - dropdownContentRect.min +(ベクトル2)itemTemplate.rectTransform.localPosition。
            ベクトル2 offsetMax = itemTemplateRect.max - dropdownContentRect.max +(ベクトル2)itemTemplate.rectTransform.localPosition。
            ベクトル2 itemSize = itemTemplateRect.size。
 
            m_Items.Clear();
 
            切り替え前= NULL;
            (; I <options.Count ++ iが0 = INT)のために
            {
                OptionDataデータ=オプション[I]。
                DropdownItemアイテム= AddItemメソッド(データ、値== I、ItemTemplateに、m_Items)。
                (項目== nullの)があれば
                    続けます。
 
                //自動的にリスナートグル状態変化を設定し
                、私はitem.toggle.isOn =値==;
                item.toggle.onValueChanged.AddListener(X => OnSelectItem(item.toggle))。
 
                //現在のオプションを選択して
                いる場合(item.toggle.isOn)
                    item.toggle.Select();
 
                //自動的に明示的なナビゲーションを設定し
                ている場合(PREV!= NULL)
                {
                    ナビゲーションprevNavはprev.navigationを=。
                    ナビゲーションtoggleNav = item.toggle.navigation。
                    prevNav.mode = Navigation.Mode.Explicit。
                    toggleNav.mode = Navigation.Mode.Explicit。
 
                    prevNav.selectOnDown = item.toggle。
                    prevNav.selectOnRight = item.toggle。
                    toggleNav.selectOnLeft = PREV。
                    toggleNav.selectOnUp = PREV。
 
                    prev.navigation = prevNav。
                    item.toggle.navigation = toggleNav。
                }
                PREV = item.toggle。
            }
 
            //再配置今やそれらのすべてが追加されていることをすべての項目
            ベクトル2 sizeDelta = contentRectTransform.sizeDelta。
            sizeDelta.y = itemSize.y * m_Items.Count + offsetMin.y - offsetMax.y。
            contentRectTransform.sizeDelta = sizeDelta。
 
            フロートextraSpace = dropdownRectTransform.rect.height - contentRectTransform.rect.height。
            (extraSpace> 0)であれば
                dropdownRectTransform.sizeDelta =新しいベクトル2(dropdownRectTransform.sizeDelta.x、dropdownRectTransform.sizeDelta.y - extraSpace)。
 
            //反転アンカーとドロップダウンが部分的または完全に外部のキャンバスの矩形のであれば位置。
            //通常、これは代わりに、以下のボタンの上にあるドロップダウンを配置する効果を持つことになり、
            //それは関係なく、初期セットアップの反転として動作します。
            するVector3 []の角=新規のVector3 [4]。
            dropdownRectTransform.GetWorldCorners(コーナー)
            偽のブール外=;
            RectTransform rootCanvasRectTransform = rootCanvas.transform RectTransformとして。
            以下のために(INT I = 0; I <4; I ++)
            {
                するVector3コーナー= rootCanvasRectTransform.InverseTransformPoint(コーナー[I])。
                (もし!rootCanvasRectTransform.rect.Contains(コーナー))
                {
                    外=はtrue。
                    ブレーク;
                }
            }
            もし(外側)
            {
                RectTransformUtility.FlipLayoutOnAxis(dropdownRectTransform、0、偽、偽)。
                RectTransformUtility.FlipLayoutOnAxis(dropdownRectTransform、1、偽、偽)。
            }
 
            ため(INT iは= 0; I <m_Items.Count; I ++)
            {
                RectTransform itemRect = m_Items [I] .rectTransform。
                itemRect.anchorMin =新しいベクトル2(itemRect.anchorMin.x、0);
                itemRect.anchorMax =新しいベクトル2(itemRect.anchorMax.x、0);
                itemRect.anchoredPosition =新しいベクトル2(itemRect.anchoredPosition.x、offsetMin.y + itemSize.y *(m_Items.Count - 1 - I)+ itemSize.y * itemRect.pivot.y)。
                itemRect.sizeDelta =新しいベクトル2(itemRect.sizeDelta.x、itemSize.y)。
            }
 
            ポップアップで//フェード
            AlphaFadeList(0.15f、0F、1F)。
 
            //非アクティブにする]ドロップダウンテンプレートと項目テンプレート
            m_Template.gameObject.SetActive(偽);
            itemTemplate.gameObject.SetActive(偽);
 
            m_Blocker = CreateBlocker(rootCanvas)。
        }

 

表示手順:
1、コールSetupTemplate方法は、テンプレートを設定します。SetupTemplate DropdownItem項目オブジェクトのコンポーネント、および4つのプロパティDropdownItem割り当て続い限定判断シリーズの方法は、TRUEに設定しoverrideSorting、自分自身のためにキャンバスコンポーネントを追加し、オプションリストを実行することを可能にするsortingOrder 30000、一番上に表示可能、その後、マウスイベントを受け取るために、GraphicRaycasterとCanvasGroupコンポーネントを追加します。

図2に示すように、テンプレートとしてm_Templateにm_Dropdown(オプション・テーブル)を作成し、CreateDropdownListメソッドを呼び出します。そしてm_Dropdownは名前を変更され、親オブジェクトを設定します。そして、それはonValueChangedイベントトグル項目として選択によるものである(リスナーOnSelectItemを追加し、(エディタのオプション]でオプションに対応し、データOptionData)の各項目を作成するためのテンプレートとしてItemTemplateにに、ItemTemplateにとして保存DropdownItemに子オブジェクトを見つけますトグルは、親オブジェクトのコンテンツインデックスがドロップダウンの設定値のためのものであり、非表示ドロップダウンリスト)、そして最終的にナビゲーションを設定してそれを見つけます。

3.品目番号がコンテンツの寸法にされ、コンテンツはコンテンツオブジェクトを表示するために使用されるスクロールのRect(チャン照会基準UGUI大きいカーネル(XI)及びスクロールバーscrollRect)です。ドロップダウンリストとコンテンツの高さよりも高さの大きい場合は、それをコンテンツと同じ高さを修正しました。そして、境界線を越えてrootCanvasドロップダウンリストのコーナー(キャンバス最上位のドロップダウンが)、彼らがドロップダウンリストに、この時間を反転するかどうかを決定示すように、我々は、ドロップダウンオプション上記の表に表示されます。

その項目の位置とサイズを設定します。
 

4、アルファ勾配(m_AlphaTweenRunner)表示ドロップダウンリスト、およびm_Template ItemTemplateにセット無効。

5、コールCreateBlockerはブロッカーを作成します。rootCanvasブロッカー、1(29999)より小さいrootCanvas、sortingOrderドロップダウンリストと同じサイズです。画像追加の成分は、色が完全に透明であり、onClickのリスナーコールバックを隠す方法を追加、Buttonコンポーネントを追加します。ブロッカーは、ドロップダウンリストの表示は、オプションのテーブル以外の領域をクリックすることをマウスイベントを停止するために使用されるとき、このことから、我々が知ることができ、単に非表示オプションのリスト、その他のコンポーネントをトリガしません。

隠す方法は非常に簡単です:

        。ドロップダウン//隠す
        ます。public void隠す()
        {
            IF(!m_Dropdown = NULL)
            {
                AlphaFadeList(0.15f、0F)を、
                StartCoroutine(DelayedDestroyDropdownList(0.15f));
            }
            (!= NULL m_Blocker)IF
                DestroyBlocker(m_Blocker)。
            = NULL m_Blocker;
            選択();
        }
ドロップダウンリスト隠さアルファ勾配、および勾配の終了後及び全アイテムドロップダウンリストを破壊します。その後DestroyBlocker。このオブジェクトは、最終的に選択(明るい状態)に設定されています。


ドロップダウン属性値は、値(プロパティ)、対応する変数m_Valueです。これは、setアクセッサ(参考C#構文ティドビッツ(f)およびインデクサ性)情報、パラメータ値がoptions.Count(オプションの数)を0に制限される - 1の間です。リフレッシュと(エディタで設定することができます)m_OnValueChangedイベントを送信すること。

リフレッシュRefreshメソッドは、値が対応するOptionDataオプションの値を見つけるだろう、m_CaptionText m_CaptionImageテキストと画像の設定のための設定は、ドロップダウンに表示されているオプションを選択します。
 

リリース6元記事 ウォン称賛43 ビュー570 000 +

おすすめ

転載: blog.csdn.net/hany3000/article/details/89742264