unity3d 将Unity UIElement(按钮)与逻辑分离

n6lpvg4x  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(222)

我试图将逻辑从UnityUIElement中分离出来。

public class UILogin: MonoBehaviour
{   
   public TMP_InputField UsernameInputField;
   public TMP_InputField PasswordInputField;   
   public Button ButtonLogin;
   public TMP_Text LoginResult;
    
   /// <summary>
   /// Parameter: Username, password
   /// </summary>
   public UnityEvent<string, string> LoginButtonClicked;

   void Awake() {
       ButtonLogin.onClick.AddListener(() => 
       LoginButtonClicked.Invoke(UsernameInputField.text, PasswordInputField.text));

       /// How to setup a method callback and make the following line happen without setting it somewhere else outside of this class?
       LoginResult.text=?
   }
}
5t7ly7z5

5t7ly7z51#

我不确定我是否完全理解您的问题,但是提供一个其他类可以订阅的事件是否可行?

public class UILogin: MonoBehaviour
{   
   public TMP_InputField UsernameInputField;
   public TMP_InputField PasswordInputField;   
   public Button ButtonLogin;
   // public TMP_Text LoginResult; // Remove here

   public event System.Action onLoginClick;
    
   /// <summary>
   /// Parameter: Username, password
   /// </summary>
   public UnityEvent<string, string> LoginButtonClicked;

   void Awake() {
       ButtonLogin.onClick.AddListener(() => 
       LoginButtonClicked.Invoke(UsernameInputField.text, PasswordInputField.text));

       onLoginClick?.Invoke();
   }
}

那么您的订阅者可能是

public class LoginResultDisplay : MonoBehaviour
{
    public TMP_Text tmpText;
    public UILogin uiLogin;

    void Awake()
    {
        uiLogin.onLoginClick += OnLoginClick;
    }

    void OnDestroy()
    {
        uiLogin.onLoginClick -= OnLoginClick;
    }

    void OnLoginClick()
    {
        tmpText.text = "Login button clicked.";
    }
}

但是既然你说你不想从其他地方设置文本,另一种方法是用UILogin注册/注销一堆字符串。因为你需要将注册对象Map到它想要添加的字符串,你需要像Dictionary这样的代码,但是默认情况下这些代码不会出现在编辑器中,所以你需要在代码中完成所有的处理。比如:
第一次

相关问题