Unity结合Flask实现排行榜功能(2)

发表于:2015-04-01来源:uml.org.cn作者:娃娃点击数: 标签:Unity
这里的id其实是自增主键,可以不必保留,但为了后面处理方便就一起保留了。 POST提交的JSON格式如下: { id: 0, name: C, score: 300 } 现在我们可以着手实现i

  这里的id其实是自增主键,可以不必保留,但为了后面处理方便就一起保留了。

  POST提交的JSON格式如下:

{
  "id": 0,
  "name": "C",
  "score": 300
  }

  现在我们可以着手实现index方法了:

def index():
  cur = g.db.execute('select id, name, score from rank order by score desc;')
  result = cur.fetchmany(100)
  data = []
  for row in result:
  data.append({'id': row[0], 'name': row[1], 'score': row[2]})
  return jsonify({'data': data})

  (其中jsonify和g在flask模块内。后面不再对导入进行说明,默认都是从flask导入。)

  在查询时对数据做了排序,并且只返回了前100条记录。可以用curl再测试一下。测试无误再实现create方法:

def create():
  status = {'status': 'OK'}
  if not request.json or not 'name' in request.json or not 'score' in request.json:
  status['status'] = 'bad request'
  try:
  g.db.execute('insert into rank (name, score) values (?, ?)', [request.json['name'], request.json['score']])
  g.db.commit()
  except:
  status['status'] = 'database error'
  return jsonify(status)

  我们的POST请求都是JSON类型的,所以要从request.json获得,而不是args或者form。此外,返回了一个status变量,便于查看出错原因。

  再用curl测试一下POST。这次,我们要向POST请求中加入数据:

curl -i -X POST -H "Content-Type: application/json" -d '{"id": 0, "name": "xyz", "score": "800"}' 127.0.0.1:5000/scores

  -H参数用于指定头部信息,-d参数可以携带数据,这里就是一条符合我们提交格式的JSON数据。

  现在服务器端就(暂时)实现完了。下面该写C#代码啦。

  我们需要设计一个和服务器交互、并返回数据给UI层的类。

  首先,这个类应该是单例的,要继承MonoBehaviour(因为和服务器交互要利用Coroutine);而且最好独立于场景之外。关于Unity中实现单例类的集中方式,请看我的另一篇文章。单例的代码如下:

private static SaveLoad _instance = null;
public static SaveLoad Instance {
get
{
if (_instance == null)
{
GameObject go = new GameObject("SaveLoadGameObject");
DontDestroyOnLoad(go);
_instance = go.AddComponent<SaveLoad>();
}
return _instance;
}
}

  还需要定义一些常量:

const int recordsPerPage = 5;
  const string URL = "127.0.0.1:5000/scores";

  定义一个数据结构:

public struct Data {
  public int id;
  public string name;
  public int score;
  }

  在动手之前,还要了解两个东西:WWW类和LitJson库。WWW类是Unity自带的处理HTTP请求的类;LitJson是一个C#处理JSON的开源库。要使用LitJson,先从官网下载dll文件,然后导入Asset。

  SaveLoad类的功能就像名字一样,包括保存Save和载入Load。

原文转自:http://www.uml.org.cn/Test/201503235.asp