Intentaré explicar mi problema. Necesito hacer para mi proyecto escolar una sala de escape 2D simple. Tengo la mayoría de los scripts listos, cuando hago clic en un elemento, lo agrega a la lista de inventario y luego puedo verlo en mi barra de inventario. El problema es que quiero que los botones del inventario de la barra de interfaz de usuario, después de hacer clic en el elemento, sepan en qué elemento he estado haciendo clic. la forma en que lo hice funcionó a medias porque él siempre da el elemento clave. Tengo interfaz de máquina de estado. esa herencia a 2 scripts más (que abren o cierran las otras cosas interactivas (cajón de la puerta). Obtuve el script KeyItems y el Interactable Script y UImanager - Singleton. ¿Existe de manera genérica? Este es el PlayerCast Script que agrego los elementos Hice clic en el inventario, pensé que el botón tenía que estar aquí.
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"); }Necesitas evento.
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 } }