如何通过枚举使用 Inventory UI 按钮

Posted

技术标签:

【中文标题】如何通过枚举使用 Inventory UI 按钮【英文标题】:how to use Inventory UI buttons by enums 【发布时间】:2021-05-16 01:34:59 【问题描述】:

我会尝试解释我的问题。我需要为我的学校项目做简单的 2D 逃生室。我已经准备好大部分脚本,当我单击他添加到库存列表的项目时,我可以在我的库存栏上看到它。问题是,我希望 UI Bar 库存的按钮在我单击项目后知道我一直在单击什么项目。我这样做的方式工作了一半,因为他总是给关键项目。我有状态机接口。该继承到另外 2 个脚本(打开或关闭其他交互的东西(门抽屉)。得到 KeyItems 脚本和 Interactable Script 和 UImanager - Singleton。 有通用的方式吗? 这是我将点击的物品添加到库存中的 PlayerCast 脚本,我认为按钮需要在这里

public enum item none , paperclip , key  

public class PlayerCast : MonoBehaviour

    public Camera cam;
    public List<item> inventory;
    public item activeItem;

    private void Start()
    
        inventory = new List<item>();
    

    // Update is called once per frame
    void Update()
    
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Input.GetMouseButtonDown(0))
        

            if (Physics.Raycast(ray, out hit))
            

                if (hit.collider.CompareTag("Interact"))
                
                    Interactable interactable = hit.collider.gameObject.GetComponent<Interactable>();
                    interactable.CLickMe(activeItem);
                    
                
                else if(hit.collider.CompareTag("Key"))
                
                     KeyItems hitItem = hit.collider.gameObject.GetComponent<KeyItems>();
                    hitItem.PickMeUp();
                

            
        

    

    public void ButtonSelect()  //this is the generic button im trying to do
    
        this.activeItem = item.key;
        Debug.Log("Clicked");

    

【问题讨论】:

【参考方案1】:

你需要事件。

public enum ItemTypes  None , Paperclip , Key  

[DisallowMultipleComponent]

public class Foo : MonoBehaviour 

    // Action its void delegate
    public event System.Action<ItemTypes> Selected;

    public ItemTypes ActiveItem  get; private set; ; // property

    public void ButtonSelect () 
        ActiveItem = ItemTypes.Key;
        Selected?.Invoke(ActiveItem); // invoke event
    


[DisallowMultipleComponent]

public class YourUIBar : MonoBehaviour 

    [SerializeField] private Foo _foo; // link on inspector

    private void OnEnable () 
        ItemChange(Foo.ActiveItem); // setup current
        Foo.Selected += ItemChange; // subscribe to event
    

    private void OnDisable () 
        Foo.Selected -= ItemChange;
    

    private void ItemChange (ItemTypes item) 
        // your code
    

【讨论】:

首先感谢您的 cmets!我以前从未使用过事件,这是唯一的方法吗?我不知道什么是事件以及如何使用它们?但我看到你使用了 ActiveItem = item.key,它不会只是回形针吗?如果它现在是关键会发生什么。它对我不起作用 哦,项目它的枚举。固定。

以上是关于如何通过枚举使用 Inventory UI 按钮的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D 通用提示窗口实现分析(Inventory Pro学习总结)

我的 monodroid UI 元素(按钮、TextView...)中的枚举需要一个 .Net 包

Ansible的Inventory管理

如何通过单选按钮实现动态 UI 渲染? [关闭]

Ansible Inventory指北进阶

如何通过统一单击UI按钮来传递值