您的位置:首页 > 移动开发 > Unity3D

服务器开发之Unity3d(C#)接口回调

2015-09-11 00:34 344 查看
作者:oneym

本文地址:http://blog.csdn.net/oneym/article/details/48355859

一、前言

一只脚踏入服务器开发的行列,一只脚还在客户端徘徊。在这个职业规划亦或是人生规划的三叉路口,未来是朝着客户端发展,还是向服务端进发。现在是一个重要的选择,也是一个全新的机会。这篇文章我把它分类到服务器开发之列,也想把这篇文章列入我今后服务器开发的第一篇。第一次总是感恩戴德的,第一次总是刻骨铭心的。

注意

1.在Unity3d中(以4.x为例)是使用
.net framework 2.0
的,这一点需要注意。

2.联网操作是耗时操作,在这里我选择了使用Unity协程来完成联网操作。

3.封装SDK可以既可以加快客户端开发也可以减少用来开会约定通信字段的时间。这篇文章是使用C#来封装一个dll文件供客户端调用。

4.服务端使用php来开发。

5.依赖的dll文件
UnityEditor.dll
UnityEngine.dll
可以在
Unity根目录\Editor\Data\Managed
下找到

二、环境描述

OS:win7_x64

IDE:VS、Zend、Uinty3d

Other:xampp

三、项目准备

1.建立C# .net framework 2.0库项目

2.建立Unity3d测试项目

3.建立php项目

四、服务端程序书写

在tempController.class.php中写一个方法用来接收客户端程序的方法。客户端用post传过来一个
name
字段和
pass
字段。

我们的方法就可以写成:

$name = I('post.name');
$pass = I('post.pass');


这两行代码使用来接受客户端的字段内容。

有了字段内容我就可以做需要的操作了

五、SDK程序(dll文件)编写

我们使用Unity3d自带的联网工具类来书写。代码如下:

业务操作类

WWWForm form = new WWWFrom();
form.AddField("name","thisIsMyName");
form.AddField("pass","thisIsMyPass");
WWW www = new WWW(url,form);


通过上面的操作我们就能够将客户端的
thisIsMyName
thisIsMyName
信息发送到服务端了。

补充

通过以上操作可以将客户端的信息发送到服务端,那么怎么判断消息发送结束和接收服务端返回的Json数据呢?

Unity3d提供了一个很好的方法。在dll中判断网络发送消息结束可以使用下面的方式(接上面的代码):

www.isDone();


这个方法会返回一个bool值,通过判断bool值可以知道通信是否已经结束了。本篇文章讲的是接口回掉,到现在也没有讲到回掉的要点,各位看官是否有点安奈不住自己的耐心了呢?且容我在卖给关子。

上面我们说道,在联网操作中要使用协程。在网络通信时,就是协程发挥作用的时候。下面给出协程的使用方法:

while (!www.isDone()) {
yeild return new WaitForSeconds(0.5f);
}


这段代码是允许在通信过程中弹出用户等待状态的进度条的关键所在。

通信完成后,如何解析服务端的Json数据呢?

Unity3d只提供了,接收数据,没有提供很好的Json数据解析的工具类,或者说我没有找到。在此推荐使用
Newtonsoft.Json
,我最初使用的是
MiniJson
由于使用的是别人封装的dll在apk打包的时候不能通过编译,这才转而使用
Newtonsoft.Json
。关于
Newtonsoft.Json
在此不再赘述。

下面给出Unity3d接收服务器返回数据的方法(接上面的代码):

www.text();


这个会将服务端的Json数据接收下来。接收之后,可以是
Newtonsoft.Json
进行进一步解析。

六、接口回调

通过上面的操作我们的客户端可以通过dll文件向服务端发送请求并能够顺利接收消息。在实际生产过程中可能因为这样或那样的原因我们不能在dll中写完所有的操作,需要客户端的配合。这就诞生接口回调。接口回调可以让我们的库文件与客户端代码进行交互。接口回调中我们使用C#的委托(delegate)机制。通过委托,可以将方法申明和方法体书写分离开来。下面开始关键的代码演示,dll中代码如下:

方法申明

public void deleget Success();


dll库文件回调客户端方法体

public static IEnumerator login(String name,String pass,Success success) {
String url = "http://ServerIP/模块/控制器/方法";

WWWForm form = new WWWFrom(); form.AddField("name","thisIsMyName"); form.AddField("pass","thisIsMyPass"); WWW www = new WWW(url,form);

while(!www.isDone()) {
yeild return new WaitForSeconds(0.5f);
}

//Json数据解析(略)可以使用结束语中的邮箱联系我。

if(登陆成功) {
success();//调用客户端代码
}
}


客户端方法体编写(供dll调用)

假设
namespace
com.oneym
,类名是
Utlis


Utils.login("thisIsMyName","thisIsMyPass",delegate(){
Debug.Log("这里是成功后的操作。");
});


通过以上的操作我就可以在dll中完成接口回调了。

七、结束语

如果对文章有疑问可以通过邮箱
oneym@sina.cn
与我一起探讨。

也可以加入QQ群
137163838
,开源我们的思维,点亮整个世界!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity3d .net 服务器 c# php