初识GameSparks多人游戏插件
简介
本文跟随Building a Turn-Based Multiplayer Game with GameSparks and Unity对GameSparks进行学习,做一个联网五子棋的游戏,教程中在GameSparks中的js云代码我没有修改,Unity上代码有所修改
GameSparks介绍
GameSparks是一个云服务,可以提供用户认证,自定义匹配,回合制或多人游戏,玩家和游戏数据存储等功能。GameSparks可以与客户端通信,可以在通信拦截点(比如收到请求但在处理前,发送消息前等)执行云代码,完成自定义的功能。在unity中使用GameSparks,直接在官网下载,然后导入项目中即可
创建游戏
官方教程创建一个游戏比较友好,讲得很清楚,这次作业做一个联网五子棋游戏,所以就只使用GameSparks提供的Events、Multiplayer、Cloud Code服务。
云服务配置
Authentication
用户验证不用修改,直接使用GameSparks提供的验证方法,使用用户名和密码登录。
Matches
Matches类似于一个游戏房间,它可以设置游戏开始的最低人数和最多人数,在Thresholds中可以自定义玩家匹配,还可以使用自定义的脚本对匹配过程进行控制等。通过
Configuration/Multiplayer
可以进入该页面。
Challenge
Challenge类似于一个游戏,当Matches匹配成功达到进入游戏的最低人数的时候,就会触发Challenge开始。在整个游戏中,客户端传递的消息,会在Challenge的有关函数中进行处理,通过
Configuration/Multiplayer
可以进入该页面。
MatchFoundMessage
在
Configurator/CloudCode
选择UserMessages/MatchFoundMessage
,编写在匹配成功时候将要执行的代码。这次游戏是判断客户端的玩家ID是不是第一个先匹配的玩家ID,然后将它作为挑战者(类似于房主),然后创建一个新的Challenge,将其他玩家添加到Challenge中。代码见:博客传送门
ChallengeIssuedMessage
在
Configurator/CloudCode
选择UserMessages/ChallengeIssuedMessage
,编写Challenge创建成功后将Challenge的详细信息发送到客户端。代码见:博客传送门
Event
Event是客户端进行某个操作后会触发云端的实现,可以定义传入的参数。这次游戏创建一个Move事件,当客户端的玩家落子的时候会触发这个事件。参数是X,Y,代表落子的位置。
游戏逻辑云代码
Board
在
Configurator/CloudCode
选择Modules
,新建一个Modules叫Board。使用一个一维数组存储了棋盘上的信息(棋子类型或空),可以初始化棋盘,得到棋盘的对应位置的信息,修改棋盘对应位置的信息,检测落子是否有效以及检测游戏是否结束。代码见:博客传送门Move
在
Configurator/CloudCode
选择ChallengeEvents/Move
,在里面实现当玩家落子之后的代码,玩家落子后,传入发送落子位置的消息到服务器上,然后服务器获取玩家的信息使用刚才新建的Board,判断落子是否有效,切换下一个玩家,检测游戏是否结束。代码见:博客传送门
Unity实现
登录/注册界面
首先导入GameSparks的unity包,然后找到GameSparksSettings将网页上的Api Key和API Secret填入。
创建一个空对象,命名为GameSparksManager,然后将GameSparksUnity脚本作为组件,Settings选择GameSparksSettings。
创建UI,在Panel上有用户名输入框,密码输入框,注册按钮,登录按钮。将
LoginPanel
脚本挂载在Panel上。脚本使用GameSparks的Api,在按钮点击的时候向服务端发送消息,GameSparks会自动检测用户是否重名,密码是否正确等,并且将消息返回客户端。在登录、注册成功成功则转到主界面。
public class LoginPanel : MonoBehaviour
{
public InputField userNameInput; //用户名输入框
public InputField passwordInput; //密码输入框
public Button loginButton; //登录按钮
public Button registerButton; //注册按钮
public Text errorMessageText; //错误消息文本
void Awake()
{
loginButton.onClick.AddListener(Login);
registerButton.onClick.AddListener(Register);
}
private void Login()
{
BlockInput();
//发送登录用户的请求
AuthenticationRequest request = new AuthenticationRequest();
request.SetUserName(u