虚拟仿真项目之工具栏

首先看一下效果图:

 然后是干货源代码:

using DG.Tweening;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 工具快捷栏面板
/// 大类:打开界面默认可以看到的一排按钮
/// 小类:点击打开界面默认可以看到的一排按钮 之后 弹出的第二级 新的一排工具按钮
/// </summary>
public class ToolShortCutKeyPanel : BasePanel
{
    bool isClick;//点击是否弹出面板
    public int toolParBtnCount;//生成大类格子数量
    public int toolBtnCount;//生成小类格子数量
    public GameObject toolParBtn;//大类格子工具按钮
    public GameObject toolBtn;//小类格子工具按钮
    public GameObject nullToolBtn;//空格子
    public GameObject toolBtnParTrans;//工具栏小类所有格子的父物体
    public GameObject lucencyImage;//透明遮罩
    public Sprite selectSprite;//选中图片
    public Sprite noSelectSprite;//未选中图片
    public Sprite up;//工具栏伸展按钮图片
    public Sprite down;//工具栏伸展按钮图片
    public Image updownImage;//工具栏伸展按钮图片组件
    public Button toolShortCutKeyBtn;//工具栏弹出(缩回)按钮
    public Transform second;//工具栏小类所有格子的父物体的父物体
    public Transform toolParBtnsParent;//工具栏大类所有格子的父物体
    public Transform activeInventoryTrans;//打开的小类的父物体
    public List<Transform> toolsObjectList;////工具栏小类所有格子的父物体集合
    public List<ToolButton> toolBtnList;//所有小类工具按钮集合
    public List<ToolParentButton> toolParBtnList;//所有大类工具按钮集合
    public int[] array1;//大类格子ID数组
    public int[] array2;//小类格子ID数组
    public char[] charCtrl;//操作指令按键数组(显示)
    protected override void Awake()
    {
        base.Awake();
        for (int i = 0; i < toolsObjectList.Count; i++)
        {
            for (int j = 0; j < toolsObjectList[i].childCount; j++)
            {
                toolBtnList.Add(toolsObjectList[i].GetChild(j).GetComponent<ToolButton>());
            }
        }
    }
    int ss = 0;
    protected override void Start()
    {
        base.Start();
        toolShortCutKeyBtn.onClick.AddListener(OnClickToolShortCutKeyBtn);
        for (int i = 0; i < toolParBtnCount; i++)
        {
            //生成大类格子
            GameObject tpbn = Instantiate(toolParBtn, toolParBtnsParent);
            tpbn.GetComponent<Item>().id = array1[i];
            tpbn.GetComponent<Item>().InitItemProperty();
            toolParBtnList.Add(tpbn.GetComponent<ToolParentButton>());
            int ii = i;
            tpbn.GetComponentInChildren<Text>().text = charCtrl[ii].ToString();
            toolParBtnList[ii].GetComponent<Button>().onClick.AddListener(delegate () { OnClickToolParentButton(ii); });
            GameObject tbpt = Instantiate(toolBtnParTrans, second);
            toolsObjectList.Add(tbpt.transform);
        }
        for (int i = 0; i < toolsObjectList.Count; i++)
        {
            for (int j = 0; j < toolBtnCount; j++)
            {
                if (ss >= array2.Length)
                {
                    //生成空格子
                    Instantiate(nullToolBtn, toolsObjectList[i]);
                }
                else
                {
                    //生成小类格子
                    GameObject tbn = Instantiate(toolBtn, toolsObjectList[i]);
                    tbn.GetComponent<Item>().id = array2[ss];
                    tbn.GetComponent<Item>().InitItemProperty();
                    toolBtnList.Add(tbn.GetComponent<ToolButton>());
                    tbn.GetComponentInChildren<Text>().text = (j + 1).ToString();
                    int ii = ss;
                    toolBtnList[ii].GetComponent<Button>().onClick.AddListener(delegate () { OnClickToolButton(ii); });
                    ss++;
                }
            }
        }
        OnInitPanel();
    }
    //点击小类按钮
    public void OnClickToolButton(int num)
    {
        //高亮
        for (int ii = 0; ii < toolBtnList.Count; ii++)
        {
            int i = ii;
            if (i == num)
            {
                if (toolBtnList[i].isClick)
                {
                    toolBtnList[i].isClick = false;
                    //发送玩家选择物品事件
                    PlayerSelectItemArgs arg = new PlayerSelectItemArgs
                    {
                        item = toolBtnList[i].GetComponent<Item>()
                    };
                    NotificationCenter.Instance().PostDispatch((uint)CommonEnumType.Player_Deselect_Item, new Notification(arg, this));
                    toolBtnList[i].GetComponent<Image>().sprite = noSelectSprite;
                }
                else
                {
                    toolBtnList[i].isClick = true;
                    //发送玩家选择物品事件
                    PlayerSelectItemArgs arg = new PlayerSelectItemArgs
                    {
                        item = toolBtnList[i].GetComponent<Item>()
                    };
                    NotificationCenter.Instance().PostDispatch((uint)CommonEnumType.Player_Select_Item, new Notification(arg, this));
                    NotificationCenter.Instance().PostDispatch((uint)CommonEnumType.Open_Panel, new Notification(PanelEnum.Item2DPropertyPanel.ToString(), toolBtnList[i].GetComponent<Item>()));
                    toolBtnList[i].GetComponent<Image>().sprite = selectSprite;
                }
            }
            else
            {
                toolBtnList[i].GetComponent<Image>().sprite = noSelectSprite;
                toolBtnList[i].isClick = false;
            }
        }
    }
    //点击大类按钮
    public void OnClickToolParentButton(int num)
    {
        //高亮
        for (int i = 0; i < toolParBtnList.Count; i++)
        {
            if (i == num)
            {
                toolParBtnList[i].GetComponent<Image>().sprite = selectSprite;
            }
            else
            {
                toolParBtnList[i].GetComponent<Image>().sprite = noSelectSprite;
            }
        }
        //对应子工具栏出现
        for (int i = 0; i < toolsObjectList.Count; i++)
        {
            if (i == num)
            {
                toolsObjectList[i].gameObject.SetActive(true);
                activeInventoryTrans = toolsObjectList[i];
            }
            else
            {
                toolsObjectList[i].gameObject.SetActive(false);
            }
        }
    }
    private void OnClickToolShortCutKeyBtn()
    {
        if (!isClick)
        {
            ShowParentParent();
        }
        else
        {
            HideParentParent();
        }
    }
    //展示界面
    public void ShowParentParent()
    {
        if (isClick) return;
        isClick = true;
        transform.DOLocalMove(new Vector3(transform.localPosition.x, transform.localPosition.y + 120f, transform.localPosition.z), 0.7f);
        updownImage.sprite = down;
    }
    //隐藏界面
    public void HideParentParent()
    {
        if (!isClick) return;
        ClearSecond();
        isClick = false;
        transform.DOLocalMove(new Vector3(transform.localPosition.x, transform.localPosition.y - 120f, transform.localPosition.z), 0.7f);
        updownImage.sprite = up;
    }
    //小类隐藏
    public void ClearSecond()
    {
        foreach (Transform item in toolsObjectList)
        {
            item.gameObject.SetActive(false);
        }
        activeInventoryTrans = null;
    }
    //清除小类高亮
    public void ClearSecondSelect()
    {
        foreach (ToolButton item in toolBtnList)
        {
            item.GetComponent<Image>().sprite = noSelectSprite;
        }
    }
    //清除大类高亮
    public void ClearFirstSelect()
    {
        for (int i = 0; i < toolParBtnList.Count; i++)
        {
            toolParBtnList[i].GetComponent<Image>().sprite = noSelectSprite;
        }
        //activeInventoryTrans = null;
    }
    public void OnInitPanel()
    {
        ClearSecond();
        ClearFirstSelect();
        ClearSecondSelect();
    }

    //所有工具未点击
    public void BtuNoClick()
    {
        for (int i = 0; i < toolBtnList.Count; i++)
        {
            toolBtnList[i].isClick = false;
        }
    }
}
using UnityEngine.UI;
using UnityEngine;

/// <summary>
/// 工具快捷栏面板控制器
/// </summary>
public class ToolShortCutKeyCtrl : ControllerBase
{
    public ToolShortCutKeyPanel toolShortCutKeyPanel;
    public ItemLayoutController itemLayoutController;
    public ItemLayoutExamController itemLayoutExamController;
    public bool isClose;
    protected override void Awake()
    {
        base.Awake();
        noticeCenter.AttachObsever((uint)CommonEnumType.Closed_UITool_Light, ClosedUIToolLight);
        noticeCenter.AttachObsever((uint)CommonEnumType.Esc_Clear_Select_Item, EscClearSelectItem);
    }

    private void OnDestroy()
    {
        noticeCenter.DetachObsever((uint)CommonEnumType.Closed_UITool_Light, ClosedUIToolLight);
        noticeCenter.DetachObsever((uint)CommonEnumType.Esc_Clear_Select_Item, EscClearSelectItem);
    }

    private void EscClearSelectItem(Notification notification)
    {
        EscClearSelectItem();
    }

    private void ClosedUIToolLight(Notification notification)
    {
        ClearSelect();
        toolShortCutKeyPanel.BtuNoClick();
    }

    private void Update()
    {
        if (isClose) return;
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            EscClearSelectItem();
        }
        if (Input.GetKeyDown(KeyCode.Z))
        {
            toolShortCutKeyPanel.ShowParentParent();
            toolShortCutKeyPanel.toolParBtnList[0].GetComponent<Button>().onClick.Invoke();
        }
        if (Input.GetKeyDown(KeyCode.X))
        {
            toolShortCutKeyPanel.ShowParentParent();
            toolShortCutKeyPanel.toolParBtnList[1].GetComponent<Button>().onClick.Invoke();
        }
        if (Input.GetKeyDown(KeyCode.C))
        {
            toolShortCutKeyPanel.ShowParentParent();
            toolShortCutKeyPanel.toolParBtnList[2].GetComponent<Button>().onClick.Invoke();
        }
        if (Input.GetKeyDown(KeyCode.V))
        {
            toolShortCutKeyPanel.ShowParentParent();
            toolShortCutKeyPanel.toolParBtnList[3].GetComponent<Button>().onClick.Invoke();
        }
        if (Input.GetKeyDown(KeyCode.F))
        {
            toolShortCutKeyPanel.ShowParentParent();
            toolShortCutKeyPanel.toolParBtnList[4].GetComponent<Button>().onClick.Invoke();
        }
        if (Input.GetKeyDown(KeyCode.G))
        {
            toolShortCutKeyPanel.ShowParentParent();
            toolShortCutKeyPanel.toolParBtnList[5].GetComponent<Button>().onClick.Invoke();
        }
        if (Input.GetKeyDown(KeyCode.R))
        {
            toolShortCutKeyPanel.ShowParentParent();
            toolShortCutKeyPanel.toolParBtnList[6].GetComponent<Button>().onClick.Invoke();
        }
        if (Input.GetKeyDown(KeyCode.T))
        {
            toolShortCutKeyPanel.ShowParentParent();
            toolShortCutKeyPanel.toolParBtnList[7].GetComponent<Button>().onClick.Invoke();
        }
        if (toolShortCutKeyPanel.activeInventoryTrans)
        {
            if (Input.GetKeyDown(KeyCode.Alpha1))
            {
                toolShortCutKeyPanel.activeInventoryTrans.GetChild(0).GetComponent<Button>().onClick.Invoke();
            }
            if (Input.GetKeyDown(KeyCode.Alpha2))
            {
                toolShortCutKeyPanel.activeInventoryTrans.GetChild(1).GetComponent<Button>().onClick.Invoke();
            }
            if (Input.GetKeyDown(KeyCode.Alpha3))
            {
                toolShortCutKeyPanel.activeInventoryTrans.GetChild(2).GetComponent<Button>().onClick.Invoke();
            }
            if (Input.GetKeyDown(KeyCode.Alpha4))
            {
                toolShortCutKeyPanel.activeInventoryTrans.GetChild(3).GetComponent<Button>().onClick.Invoke();
            }
            if (Input.GetKeyDown(KeyCode.Alpha5))
            {
                toolShortCutKeyPanel.activeInventoryTrans.GetChild(4).GetComponent<Button>().onClick.Invoke();
            }
            //if (Input.GetKeyDown(KeyCode.Alpha6))
            //{
            //    toolShortCutKeyPanel.activeInventoryTrans.GetChild(5).GetComponent<Button>().onClick.Invoke();
            //}
            //if (Input.GetKeyDown(KeyCode.Alpha7))
            //{
            //    toolShortCutKeyPanel.activeInventoryTrans.GetChild(6).GetComponent<Button>().onClick.Invoke();
            //}
            //if (Input.GetKeyDown(KeyCode.Alpha8))
            //{
            //    toolShortCutKeyPanel.activeInventoryTrans.GetChild(7).GetComponent<Button>().onClick.Invoke();
            //}
        }
    }

    private void EscClearSelectItem()
    {
        CancelTool();
        toolShortCutKeyPanel.BtuNoClick();
    }

    public void HidePanel()
    {
        toolShortCutKeyPanel.HideParentParent();
    }
    public void CancelTool()
    {
        //NotificationCenter.Instance().PostDispatch((uint)CommonEnumType.Close_Panel, new Notification(PanelEnum.Item2DPropertyPanel.ToString(), this));
        toolShortCutKeyPanel.ClearFirstSelect();
        toolShortCutKeyPanel.ClearSecondSelect();
        toolShortCutKeyPanel.ClearSecond();
        if (itemLayoutController.gameObject.activeSelf)
            itemLayoutController.OnDeselectItem();
        else
            itemLayoutExamController.OnDeselectItem();
    }
    void ClearSelect()
    {
        //toolShortCutKeyPanel.ClearFirstSelect();
        toolShortCutKeyPanel.ClearSecondSelect();
    }
    //关闭快捷栏功能
    public void CloseFunction()
    {
        isClose = true;
        toolShortCutKeyPanel.lucencyImage.SetActive(true);
    }
    //开启快捷栏功能
    public void OpenFunction()
    {
        isClose = false;
        toolShortCutKeyPanel.lucencyImage.SetActive(false);
    }
}

接着是物体组件截图:


在开始之前我们只需要把这些字段设置好


Array1为第一层工具栏的大类工具ID(ID是使用时用来判断是否正确,也是用来显示属性的重要依据),也就是这些

对应的ID分别为101~109


Array2为第二层,如图,从1到5 的ID分别为 1011~1015,以此类推第八个大类第五个小类的格子ID为 1085(ID可不固定,我这样更便于记)


CharCtrl就是我们的快捷键字符数组,要跟快捷键控制器的按键一一对应


最后就是一些UI的摆放和做预制

猜你喜欢

转载自www.cnblogs.com/fangshiyuanzhucheng/p/11425629.html