本文主要针对游戏设计。
一.pureMVC图解框架模块
【详细设计太多,不深入解释】
pureMVC使用见例:http://www.unitymanual.com/thread-34296-1-1.html
[资源采用动态加载,包括UI面板等]
补充:方案,派发事件的时候,可派发一个泛型结构过去,里面包含回调函数,谁派发,就调用谁的,已应用。
范例:
【LoginMediator】
[mw_shl_code=csharp,true]public LoginMediator()
: base(NAME)
{
addEventListener(LoginEventType.LOGIN_START_UP, onStartUp);
addEventListener(LoginEventType.BACK_RESULT_CLIENT, backResultFromServer);
}
private void onStartUp(PEvent PEvent)
{
Debug.Log("-----login--------onStartUp-----");
LoaderData<WWW> data = new LoaderData<WWW>();
data.loadPath = ResourcesXmlLoader.getInstance().getResouceUrlById("20001", "12000");
data.action = initPanel;
dispatchEventWith(SystemEventType.LOAD_START_UP, data);
}
private void initPanel(WWW asset)
{
//解析面板
GameObject go = (GameObject)asset.assetBundle.mainAsset;
panel.addEventListener(LoginEventType.SEND_RESULT_SERVER, sendResultToServer);
panel.addEventListener(LoginEventType.OPEN_REGISTER_PANEL, openRegisterPanel);
panel.init(go);
}[/mw_shl_code]
【Panel】
[mw_shl_code=csharp,true]
public override void init(GameObject obj)
{
this.panelObj = (GameObject)GameObject.Instantiate(obj);
base.init(panelObj);
new PanelHandler().RootHandler(panelObj);
errorObj = panelObj.transform.FindChild("ErrorPanel").gameObject;
loginBtn = panelObj.transform.FindChild("Submit").gameObject;
registerBtn = panelObj.transform.FindChild("Register").gameObject;
UIEventListener.Get(loginBtn).onClick = onSubmitClick;
UIEventListener.Get(registerBtn).onClick = onRegisterClick;
}
public void closeErrorPanel()
{
base.closeErrorPanel(errorObj, PanelType.SCALE);
}
public void showErrorPanel()
{
errorObj.transform.FindChild("Label").GetComponent<UILabel>().text = "账户或者密码错误,登录失败!";
base.showErrorPanel(errorObj, PanelType.SCALE);
GameController.getInstance().addDelayCallFun(3.0f, closeErrorPanel);
}[/mw_shl_code]
【LoadingMediator】
[mw_shl_code=csharp,true]public LoadingMediator()
: base(NAME)
{
addEventListener(SystemEventType.LOAD_START_UP, onStartUp);
addEventListener(SystemEventType.SCENE_LOAD_SUCESSFUL, onLoadAllComplete);
loadingPanelObj = GameObject.Find("LoadSceneDates");
}
private void onStartUp(PEvent pEvent)
{
LoaderData<WWW> data = (LoaderData<WWW>)pEvent.data;
Initialization();
Loader loader = new Loader();
loader.addEventListener(LoaderEventType.LOAD_PROGRESS, onLoadProgress);
loader.load(data);
}
//初始化load界面的UI
private void Initialization()
{
if (!loadingPanelObj.activeSelf)
{
loadingPanelObj.SetActive(true);
}
}
//显示资源下载进度条
private void onLoadProgress(PEvent obj)
{
loadingPanelObj.GetComponentInChildren<UISlider>().value = (float)obj.data;
Debug.Log("progress:" + float.Parse(obj.data.ToString()) * 100 + "%");
}
[/mw_shl_code]
【Loader】
[mw_shl_code=csharp,true]public void load(LoaderData<WWW> data, int version = 1)
{
if (isLoading)
{
Debug.LogWarning("资源正在加载中,不能进行加载操作。");
return;
}
this.data = data;
string url;
isLoading = true;
if (Application.platform == RuntimePlatform.WindowsWebPlayer)
{
url = ServerEventType.LOAD_RES_SERVERURL + "res/" + data.loadPath;
}
else
{
Caching.CleanCache();
url = ServerEventType.LOAD_RES_SERVERURL + "res/" + data.loadPath;
Debug.Log("xml path" + url);
}
www = WWW.LoadFromCacheOrDownload(url, version);
if (www.isDone)
{
loadComplete();
}
else
GameController.getInstance().addInterval(loadProgress);
}
[/mw_shl_code]
: base(NAME)
{
addEventListener(LoginEventType.LOGIN_START_UP, onStartUp);
addEventListener(LoginEventType.BACK_RESULT_CLIENT, backResultFromServer);
}
private void onStartUp(PEvent PEvent)
{
Debug.Log("-----login--------onStartUp-----");
LoaderData<WWW> data = new LoaderData<WWW>();
data.loadPath = ResourcesXmlLoader.getInstance().getResouceUrlById("20001", "12000");
data.action = initPanel;
dispatchEventWith(SystemEventType.LOAD_START_UP, data);
}
private void initPanel(WWW asset)
{
//解析面板
GameObject go = (GameObject)asset.assetBundle.mainAsset;
panel.addEventListener(LoginEventType.SEND_RESULT_SERVER, sendResultToServer);
panel.addEventListener(LoginEventType.OPEN_REGISTER_PANEL, openRegisterPanel);
panel.init(go);
}[/mw_shl_code]
【Panel】
[mw_shl_code=csharp,true]
public override void init(GameObject obj)
{
this.panelObj = (GameObject)GameObject.Instantiate(obj);
base.init(panelObj);
new PanelHandler().RootHandler(panelObj);
errorObj = panelObj.transform.FindChild("ErrorPanel").gameObject;
loginBtn = panelObj.transform.FindChild("Submit").gameObject;
registerBtn = panelObj.transform.FindChild("Register").gameObject;
UIEventListener.Get(loginBtn).onClick = onSubmitClick;
UIEventListener.Get(registerBtn).onClick = onRegisterClick;
}
public void closeErrorPanel()
{
base.closeErrorPanel(errorObj, PanelType.SCALE);
}
public void showErrorPanel()
{
errorObj.transform.FindChild("Label").GetComponent<UILabel>().text = "账户或者密码错误,登录失败!";
base.showErrorPanel(errorObj, PanelType.SCALE);
GameController.getInstance().addDelayCallFun(3.0f, closeErrorPanel);
}[/mw_shl_code]
【LoadingMediator】
[mw_shl_code=csharp,true]public LoadingMediator()
: base(NAME)
{
addEventListener(SystemEventType.LOAD_START_UP, onStartUp);
addEventListener(SystemEventType.SCENE_LOAD_SUCESSFUL, onLoadAllComplete);
loadingPanelObj = GameObject.Find("LoadSceneDates");
}
private void onStartUp(PEvent pEvent)
{
LoaderData<WWW> data = (LoaderData<WWW>)pEvent.data;
Initialization();
Loader loader = new Loader();
loader.addEventListener(LoaderEventType.LOAD_PROGRESS, onLoadProgress);
loader.load(data);
}
//初始化load界面的UI
private void Initialization()
{
if (!loadingPanelObj.activeSelf)
{
loadingPanelObj.SetActive(true);
}
}
//显示资源下载进度条
private void onLoadProgress(PEvent obj)
{
loadingPanelObj.GetComponentInChildren<UISlider>().value = (float)obj.data;
Debug.Log("progress:" + float.Parse(obj.data.ToString()) * 100 + "%");
}
[/mw_shl_code]
【Loader】
[mw_shl_code=csharp,true]public void load(LoaderData<WWW> data, int version = 1)
{
if (isLoading)
{
Debug.LogWarning("资源正在加载中,不能进行加载操作。");
return;
}
this.data = data;
string url;
isLoading = true;
if (Application.platform == RuntimePlatform.WindowsWebPlayer)
{
url = ServerEventType.LOAD_RES_SERVERURL + "res/" + data.loadPath;
}
else
{
Caching.CleanCache();
url = ServerEventType.LOAD_RES_SERVERURL + "res/" + data.loadPath;
Debug.Log("xml path" + url);
}
www = WWW.LoadFromCacheOrDownload(url, version);
if (www.isDone)
{
loadComplete();
}
else
GameController.getInstance().addInterval(loadProgress);
}
[/mw_shl_code]
二 . Tnet轻型多人在线游戏开发框架图解分析
【具体Tnet框架理解,可自行运行example例子,服务端同步打断点研究】
[服务器也是C#写的,代码很清晰]
三 . 总结
个人结合两者暂实现登陆注册,框架流程基本走通。
图例:
1.启动服务器
2. 启动客户端
3.登陆失败
3.登录服务器验证
4.数据库数据
5.注册信息
6.注册结果
7.写入数据库
四 . 完结
基本可以跑通框架的话,就可以慢慢开始开发和优化了。
[贵在设计,有错勿殴]
转载请注明出处。
作者: 大帅纷纭
微博:http://weibo.com/2357191704/profile?topnav=1&wvr=6
博客:http://blog.youkuaiyun.com/dashuaifenyun1991