Hi all. Suppose we have a 2d game (it often uses unity UIs). For example to register a user, the game has a register panel:
IRegister interface, CRegister class that implements logics(send/receive data to/from the server) , CTestRegister class that implements fake server (send/receive data to/from the fake server) to test other implementations, CRegisterView.
My view classes are views/controllers and logic classes are models.
My question is that I often think about which section of my codes are placed inside logic or view, for example after registering I want to activate another gameobject and deactivate this panel or etc. (view is only unityUIs or all gameobjects, colliders,monobehaviours?)
note: My UIs doesn’t change (I use only unity UIs).
note: I need to test other sections of the game when I don’t access to server (So I send/receive fake data)
Can I Have a generic model/view for all panels:
logic(for example send/receive data to/from the server/ connect to dataset/userinfo …) in nonmonobehaviour classes and view (for example all monobehaviour components) in monobehaviour classes that have logic classes inside of themselves.
and finally I know MVC is not good enough for games but I think I can use them for menus,panels.,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public interface IRegister {
void Register(string _username, string _password);
void AddEventListener();
void RemoveEventListener();
System.EventHandler<System.EventArgs> OnRegisteredEvent { get; set; }
}
public class CTestRegister : IRegister {
public System.EventHandler<System.EventArgs> OnRegisteredEvent { get; set; }
public CTestRegister() {
}
public void AddEventListener() {
CEventManager.GetInstance().AddEventListener("Register", OnRegistered);
}
public void RemoveEventListener() {
CEventManager.GetInstance().RemoveEventListener("Register", OnRegistered);
}
public void Register(string _username, string _password) {
OnRegistered(this,new RegisterEventArgs());
}
void OnRegistered(object _sender, RegisterEventArgs _e) { //event function from server to client(recieved packet)
// do something
PlayerPrefs.SetString("Player", JsonUtility.ToJson(_e));
OnRegisteredEvent(this,new System.EventArgs());
}
}
public class CRegister : IRegister {
public System.EventHandler<System.EventArgs> OnRegisteredEvent { get; set; }
public CRegister() {
}
public void AddEventListener() {
CEventManager.GetInstance().AddEventListener("Register", OnRegistered);
}
public void RemoveEventListener() {
CEventManager.GetInstance().RemoveEventListener("Register", OnRegistered);
}
public void Register(string _username, string _password) {
string jsonStr = JsonUtility.ToJson(new RegisterSentPacket(_username, _password));
CServerMenager.GetInstance().SendRequest(jsonStr);//send to network
}
void OnRegistered(object _sender, RegisterEventArgs _e) { //event function from server to client(recieved packet)
// do something
PlayerPrefs.SetString("Player", JsonUtility.ToJson(_e));
OnRegisteredEvent(this, new System.EventArgs());
}
}
public class CRegisterView : MonoBehaviour {
IRegister m_register;
[SerializeField]
InputField m_username;
[SerializeField]
InputField m_password;
[SerializeField]
GameObject newPanelObj;
// Use this for initialization
void Start() {
m_register = new CRegister(); // can be changed to CTestRegister() but I need to recompile this code because of lacking depondancy injection!!
}
void OnEnable() {
m_register.OnRegisteredEvent += OnRegistered;
m_register.AddEventListener();
}
void OnDisable() {
m_register.RemoveEventListener();
}
public void OnRegisterButtonClick() {
m_register.Register(m_username.text, m_password.text);
}
void OnRegistered(object _sender, System.EventArgs _e) {
CPanelManager.GetInstance().ChangePanel(newPanelObj); // activate new panel and deactivate the old one
}
}
If I don’t separate logics from views, I must reimplement all of them(contaning logics and views to test them).