Unity开发弱数据多人联网游戏(一)

在前面的文章中,我们基本学会了如何使用后端云实现本地与云端数据的交互,接下来,我们要尝试使用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.打包出来后,运行,运行结果如下

 

至此,一个特别简单的多人游戏就完成了,其实还有很多需要注意的细节问题是需要考虑的,大家可以找开发文档多看看,在下一篇文章,我们将会尝试开发更为完善的多人对战游戏,再见!

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值