编写Unity工具类

脚本功能设定:游戏GM工具(根据物品ID、数量向服务器发送信息,获取本地所需物品道具)


using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;
using System.Linq;
using Tianyu;

public class GMUtil : EditorWindow
{
    string[] toolbarStr = new string[] { "标准添加道具", "搜索添加道具" };//标题栏名称
    int toolbarOption = 0;//默认显示也签ID

    List<ItemNodeState> allItemNodeList;
    List<HeroNode> allHeroNodeList;

    bool isAddedListener = false;
    bool isRemovedListener = false;

    //注册消息监听
    private void OnEnable()
    {
        MessageMediator.AddListener<CReadPacket>(MessageMediatType.gm_add_player_data_ret, ReceiveServGMMsg);
    }
    
    //销毁消息监听
    private void OnDisable()
    {
        MessageMediator.RemoveListener<CReadPacket>(MessageMediatType.gm_add_player_data_ret, ReceiveServGMMsg);
    }
    
    //Window面板绘制
    static GMUtil window;
    [MenuItem("Tools/GM工具 #&Q")]
    static void Main()
    {
        window = (GMUtil)EditorWindow.GetWindow(typeof(GMUtil), false, "GM工具");
        window.Show();
    }

    private void OnGUI()
    {
        if(!Application.isPlaying || SceneManage.Instance.SceneID != EnumSceneID.UI_MajorCity01)
        {
            GUILayout.Label("请进入主城后再使用GM工具");
            return;
        }
        else
        {
            //初始化获取所有物品表信息
            if (isAddedListener == false)
            {
                isAddedListener = true;
            }
            if (allItemNodeList == null)
            {
                allItemNodeList = GameLibrary.Instance().ItemStateList.Values.ToList<ItemNodeState>();
            }
            if (allHeroNodeList == null)
            {
                allHeroNodeList = FSDataNodeTable<HeroNode>.GetSingleton().DataNodeList.Values.ToList<HeroNode>();
            }
        }

        toolbarOption = GUILayout.Toolbar(toolbarOption, toolbarStr);
        switch (toolbarOption)
        {
            case 0:
                GetItemFromId();
                break;
            case 1:
                GetItemFromSearch();
                break;

        }
    }

    int inputItemId;
    int inputItemCount;
    void GetItemFromId()
    {
        EditorGUILayout.Space();
        //存储输入的道具ID和道具数量
        inputItemId = EditorGUILayout.IntField("道具Id:", inputItemId);
        inputItemCount = EditorGUILayout.IntField("道具数量:", inputItemCount);

        EditorGUILayout.Space();
        if (GUILayout.Button("确定"))
        {
            //向服务器发送
            CommonGMTool.OnSubmitRequest("ty", inputItemId, inputItemCount);
        }
    }

    string inputItemName;
    string fullItemName;
    bool isSearching = false;
    Vector2 scrollPosition;
    List<ItemNodeState> itemNodeList;
    List<HeroNode> heroNodeList;

    ItemData selectItemData;

    bool isSending = false;
    //提供模糊字搜索功能检索用户可能需要的道具
    void GetItemFromSearch()
    {
        EditorGUILayout.Space();
        inputItemName = EditorGUILayout.TextField("道具名称:", inputItemName);

        EditorGUILayout.Space();
        if (GUILayout.Button("模糊搜索"))
        {
            Search();
        }

        if(isSearching)
        {
            //绘制根据用户输入的模糊字检索出来的道具列表
            EditorGUILayout.Space();
            scrollPosition = GUILayout.BeginScrollView(scrollPosition);
            if (itemNodeList != null)
            {
                for (int i = 0; i < itemNodeList.Count; i++)
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Label(itemNodeList[i].props_id.ToString());
                    GUILayout.Label(itemNodeList[i].name);
                    if (GUILayout.Button("选中"))
                    {
                        selectItemData = new ItemData();
                        selectItemData.id = itemNodeList[i].props_id;
                        selectItemData.name = itemNodeList[i].name;
                        isSearching = false;
                        isSending = true;
                    }
                    GUILayout.EndHorizontal();
                }
            }
            if (heroNodeList != null)
            {
                for (int i = 0; i < heroNodeList.Count; i++)
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Label(heroNodeList[i].hero_id.ToString());
                    GUILayout.Label(heroNodeList[i].name);
                    if (GUILayout.Button("选中"))
                    {
                        selectItemData = new ItemData();
                        selectItemData.id = heroNodeList[i].hero_id;
                        selectItemData.name = heroNodeList[i].name;
                        isSearching = false;
                        isSending = true;
                    }
                    GUILayout.EndHorizontal();
                }
            }
            GUILayout.EndScrollView();
        }

        if(isSending && selectItemData != null)
        {
            EditorGUILayout.Space();
            EditorGUILayout.Space();

            EditorGUILayout.LabelField("道具Id:", selectItemData.id.ToString());
            EditorGUILayout.LabelField("道具名称:", selectItemData.name.ToString());
            inputItemCount = EditorGUILayout.IntField("道具数量:", inputItemCount);

            EditorGUILayout.Space();
            if (GUILayout.Button("确定"))
            {
                CommonGMTool.OnSubmitRequest(GetTypeById(selectItemData.id), selectItemData.id, inputItemCount);
                notificationText = "[ID:" + selectItemData.id + " 名称:" + selectItemData.name + "] 获取中……";
            }

            GUIStyle fontStyle = new GUIStyle();
            fontStyle.normal.background = null;    //设置背景填充  
            fontStyle.normal.textColor = new Color(0, 1, 0);   //设置字体颜色  
            fontStyle.fontSize = 11;       //字体大小  
            GUILayout.Label(notificationText, fontStyle);
        }
        else
        {
            notificationText = "";
        }

        this.Repaint();
    }

    void Search()
    {
        itemNodeList = new List<ItemNodeState>();
        heroNodeList = new List<HeroNode>();
        try
        {

            var itemNodeEnumerator = allItemNodeList.GetEnumerator();
            while (itemNodeEnumerator.MoveNext())
            {
                if (itemNodeEnumerator.Current.name.Contains(inputItemName))
                {
                    itemNodeList.Add(itemNodeEnumerator.Current);
                }
            }
            var heroNodeEnumerator = allHeroNodeList.GetEnumerator();
            while (heroNodeEnumerator.MoveNext())
            {
                if (heroNodeEnumerator.Current.name.Contains(inputItemName))
                {
                    heroNodeList.Add(heroNodeEnumerator.Current);
                }
            }
        }
        catch (System.Exception)
        {

        }
        isSending = false;
        isSearching = true;
    }


    string notificationText = "";
    void ReceiveServGMMsg(CReadPacket packet)
    {
        if (packet == null || packet.data == null)
        {
            notificationText = "[ID:" + selectItemData.id + " 名称:" + selectItemData.name + "] 获取失败";
            return;
        }
        string str = packet.data.ContainsKey("ret") ? "成功" : "失败";
        notificationText = "[ID:" + selectItemData.id + " 名称:" + selectItemData.name + "] 获取" + str;

    }

    /// <summary>
    /// 根据类型获取物品类型
    /// </summary>
    private string GetTypeById(long Id)
    {
        ItemNodeState ins = null;
        GameLibrary.Instance().ItemStateList.TryGetValue(Id, out ins);
        if (ins != null)
        {
            return ins.types + "";
        }
        else
        {
            HeroNode node = null;
            FSDataNodeTable<HeroNode>.GetSingleton().DataNodeList.TryGetValue(Id, out node);
            if (node != null)
            {
                return node.types + "";
            }
        }
        return string.Empty;
    }

    class ItemData
    {
        public long id;
        public string name;
    }

}



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dropdown 是 Unity 中常用的 UI 控件之一,它可以让用户通过下拉列表来选择选项。在游戏开发中,我们可能需要在不同场景中多次使用 Dropdown,为了提高开发效率,我们可以将 Dropdown 工具化,方便快速地创建和配置 Dropdown。 下面是实现 Dropdown 工具化的步骤: 1. 创建一个 Dropdown 预制件 首先,我们需要创建一个 Dropdown 预制件。在 Unity 中,打开 Hierarchy 窗口,右键点击窗口空白处,选择 UI -> Dropdown,创建一个 Dropdown 控件。然后,将该 Dropdown 控件拖拽到 Project 窗口中,创建一个新的预制件。 2. 创建一个 Dropdown 工具类 接下来,我们需要创建一个 Dropdown 工具类,用于动态创建和配置 Dropdown。在 Unity 中,打开 Project 窗口,右键点击窗口空白处,选择 Create -> C# Script,创建一个名为 DropdownTool 的脚本。然后,将下面的代码复制到脚本中: ```csharp using UnityEngine; using UnityEngine.UI; public class DropdownTool : MonoBehaviour { public GameObject dropdownPrefab; public Dropdown CreateDropdown(Transform parent, string[] options, int defaultIndex) { GameObject dropdownObject = Instantiate(dropdownPrefab, parent); Dropdown dropdown = dropdownObject.GetComponent<Dropdown>(); dropdown.ClearOptions(); dropdown.AddOptions(new List<string>(options)); dropdown.value = defaultIndex; return dropdown; } } ``` 该脚本定义了一个 CreateDropdown 方法,用于创建 Dropdown 控件并进行基本配置。其中,参数 parent 表示 Dropdown 控件的父级节点,参数 options 表示 Dropdown 的选项列表,参数 defaultIndex 表示默认选中的选项索引。 3. 在场景中使用 Dropdown 工具类 最后,我们可以在场景中使用 Dropdown 工具类来创建和配置 Dropdown。在 Unity 中,打开一个场景,创建一个空 GameObject,并将 DropdownTool 脚本添加到该对象上。然后,将预制件拖拽到 dropdownPrefab 属性中,即可完成 Dropdown 工具类的配置。 接下来,我们可以在脚本中调用 CreateDropdown 方法,来创建和配置 Dropdown。例如,在 Start 方法中,我们可以编写如下代码: ```csharp public class Example : MonoBehaviour { public Transform dropdownParent; public string[] options; public int defaultIndex; private DropdownTool dropdownTool; private void Start() { dropdownTool = GetComponent<DropdownTool>(); Dropdown dropdown = dropdownTool.CreateDropdown(dropdownParent, options, defaultIndex); dropdown.onValueChanged.AddListener(OnDropdownValueChanged); } private void OnDropdownValueChanged(int index) { Debug.Log("Selected option: " + options[index]); } } ``` 该脚本使用了 DropdownTool 工具类,创建了一个 Dropdown 控件,并监听了其 valueChanged 事件。当用户选择了一个选项时,会触发 OnDropdownValueChanged 方法,输出所选选项的文本内容。 至此,我们已经成功实现了 Dropdown 工具化。通过使用 Dropdown 工具类,我们可以快速地创建和配置 Dropdown,并在多个场景中重复使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值