在前面的文章中,我们基本学会了如何使用后端云实现本地与云端数据的交互,接下来,我们要尝试使用leancloud开发多人联网游戏,本次先从比较简单的游戏开始。
游戏设置:我们需要创建一个两人对战的联网游戏,游戏一开始,玩家加入或创建房间,当房间一共有2人时表示匹配成功,关闭房间。这时候,显示开始游戏的按钮,当然这个按钮只能房主能使用,点击开始按钮,将会开始游戏;在游戏中,我们通过点击分数按钮获得分数,并在UI上显示出来,上方显示自己的得分情况,下方显示对手得分情况,当房间中任何一人分数先到达20时,结束游戏,并判断输赢。
1.下载SDK
前往leancloud下载多人对战SDK
2.新建项目,在SDK中Plugins文件夹和Source文件夹是我们需要的,将他们放置在Assets下
3.创建Game脚本,代码如下
using UnityEngine;
using UnityEngine.UI;
using LeanCloud.Play;
public class Game : MonoBehaviour
{
const byte GAME_OVER_EVENT = 100;
const byte GAME_START_EVENT = 101;
// 获取客户端 SDK 实例
private Client client;
private async void Start()
{
var appID = "你的appID";
var appKey = "你的appKey";
var playServer = "https://******";
// 这里使用随机数作为 userId
var random = new System.Random();
var randId = string.Format("{0}", random.Next(10000000));
Debug.Log(randId);
// 初始化
client = new Client(appID, appKey, randId, playServer: playServer);
await client.Connect();
// 根据当前时间(时,分)生成房间名称
var now = System.DateTime.Now;
var roomName = string.Format("{0}_{1}", now.Hour, now.Minute);
var options = new RoomOptions();
options.Flag = CreateRoomFlag.FixedMaster;
await client.JoinOrCreateRoom(roomName);
// 注册新玩家加入房间事件
client.OnPlayerRoomJoined += (newPlayer) =>
{
Debug.LogFormat("new player: {0}", newPlayer.UserId);
if (client.Player.IsMaster)
{
Debug.Log("匹配成功,可以开始游戏了");
startBtn.gameObject.SetActive(true);
// 获取房间内玩家列表
}
};
// 注册「玩家属性变更」事件
client.OnPlayerCustomPropertiesChanged += (player, changedProps) =>
{
string point = player.CustomProperties.GetString("name");
long hp = player.CustomProperties.GetInt("hp");
long score = player.CustomProperties.GetInt("score");
if (player.IsLocal)
{
texleft.text = string.Format($"我的名字:{point}\nHP:{hp}\nscore:{score}");
}
else
{
texright.text = string.Format($"对手名字:{point}\nHP:{hp}\nscore:{score}");
}
if (score == 20)
{
//props.Add
var data = new PlayObject { { "winnerId", player.ActorId } };
var opts = new SendEventOptions
{
ReceiverGroup = ReceiverGroup.All
};
client.SendEvent(GAME_OVER_EVENT, data, opts);
}
};
// 注册自定义事件
client.OnCustomEvent += (eventId, eventData, senderId) =>
{
if (eventId == GAME_OVER_EVENT)
{
scoreBtn.gameObject.SetActive(false);
int winnerId = eventData.GetInt("winnerId");
if (client.Player.ActorId == winnerId)
{
winer.text = "YOU WIN";
}
else
{
winer.text = "YOU LOSS";
}
}
else if (eventId == GAME_START_EVENT)
{
Debug.Log("开始游戏");
startBtn.gameObject.SetActive(false);
scoreBtn.gameObject.SetActive(true);
var playerList = client.Room.PlayerList;
for (int i = 0; i < playerList.Count; i++)
{
var player = playerList[i];
var props = new PlayObject();
props.Add("name", player.UserId);
props.Add("hp", 100);
props.Add("score", 0);
player.SetCustomProperties(props);
}
}
};
startBtn.onClick.AddListener(() =>
{
var opts = new SendEventOptions
{
ReceiverGroup = ReceiverGroup.All
};
client.SendEvent(GAME_START_EVENT, null, opts);
});
scoreBtn.onClick.AddListener(() =>
{
score += 1;
var playerList = client.Room.PlayerList;
for (int i = 0; i < playerList.Count; i++)
{
var player = playerList[i];
if (player.IsLocal)
{
var props = player.CustomProperties;
props["score"] = score;
player.SetCustomProperties(props);
}
}
});
}
public Text texleft;
public Text texright;
public Text winer;
public Button startBtn;
public Button scoreBtn;
public int score = 0;
private void Awake()
{
startBtn.gameObject.SetActive(false);
scoreBtn.gameObject.SetActive(false);
}
}
4.创建UI,如下
5.随便找个物体将刚刚创建的脚本挂载上去,并将所需的UI拖上去
6.打包出来后,运行,运行结果如下
至此,一个特别简单的多人游戏就完成了,其实还有很多需要注意的细节问题是需要考虑的,大家可以找开发文档多看看,在下一篇文章,我们将会尝试开发更为完善的多人对战游戏,再见!