#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. Ой, элемент его перечисления. Исправлено.