как использовать кнопки пользовательского интерфейса инвентаризации с помощью перечислений

#c# #unity3d #user-interface #enums

#c# #unity3d #пользовательский интерфейс #перечисления

Вопрос:

Я попытаюсь объяснить мою проблему. Мне нужно сделать для моего школьного проекта простую 2D-комнату для побега. У меня готово большинство сценариев, когда я нажимаю на элемент, который он добавляет в список инвентаря, и затем я вижу его на панели инвентаря. Проблема в том, что я хочу, чтобы кнопки инвентаря панели пользовательского интерфейса знали после того, как я нажму на элемент, чтобы узнать, на какой элемент я нажимал. то, что я делал, работало наполовину, потому что он всегда давал ключевой элемент. У меня есть интерфейс конечного автомата. это наследование еще 2 скриптам (которые открывают или закрывают другие интерактивные элементы (дверной ящик). есть скрипт KeyItems и сценарий взаимодействия и 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
    }
}
 

Комментарии:

1. Прежде всего, спасибо за ваши комментарии! Я никогда раньше не использовал Event, это единственный способ?. Я не знаю, что такое события и как их использовать? но я вижу, что вы использовали ActiveItem = item.key, разве это не будет только скрепка? что произошло, если теперь это ключ. у меня это не сработало

2. Ой, элемент его перечисления. Исправлено.