我学xingo golang服务器之-Unity3d c#多玩家同屏出生过程和AI处理分解

10 篇文章 0 订阅
9 篇文章 0 订阅

上一节
我学xingo golang服务器之-Unity3d c# 协议api分解
http://blog.csdn.net/atgczcl/article/details/75076884
分析了xingo_demo_unity3d 对服务器协议的处理流程
处理过程中涉及到了unity3d 多玩家同步和出生过程,这块我觉得有xingo项目写的有点难度,所以提取出来进行分解一下;
Unity3d c# 多玩家出生:
大家都知道,在上一节,xingo服务器定义出生玩家是mid==200,
这里写图片描述
bc.Tp==2,
调用

GameMgr.BornPlayer(bc);
GameMgr.PlayerIDS.Add(bc.Pid);

进行出生同屏连接的玩家
接下来我们解析一下GameMgr,看他是如何出生玩家的:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Pb;
using UnityEngine.UI;


public class GameMgr : MonoBehaviour {

    public static ArrayList PlayerIDS = new ArrayList();
    public static string GameIP;
    public static int GamePort;

    private static BroadCast mBc;// 记录传过来的bc数据
    private static Player mPlayer; //记录传过来的player数据
    private static ArrayList mPlayers; //传递过来的player集合

    private static bool flag = false; //第一种实例方式
    private static bool flag1 = false; //第二种实例方式

    // Use this for initialization
    void Start () {
        mPlayers = new ArrayList();
    }

    // Update is called once per frame
    void Update () {
        if (flag || flag1)
        {
            OnBorn();
        }

    }

    private void OnBorn()
    {
        if (flag)
        {
            var player = Instantiate(Resources.Load<GameObject>("16_2"));

            var controller = player.GetComponent<AIController>();

            flag = false;
            if (controller)
            {
                controller.InitPlayer(mBc.Pid, mBc.P.X, mBc.P.Y, mBc.P.Z, mBc.P.V);
            }
            else
            {
                Debug.Log("Controller null");
            }

        }
        if (flag1)
        {
            flag1 = false;

            for (int i = 0; i < mPlayers.Count; ++i)
            {
                var player = Instantiate(Resources.Load<GameObject>("16_2"));

                var controller = player.GetComponent<AIController>();

                var data = (Player)mPlayers[i];
                controller.InitPlayer(data.Pid, data.P.X, data.P.Y, data.P.Z, data.P.V);
            }
        }

    }

    public static void BornPlayer(BroadCast bc)
    {
        mBc = bc;
        flag = true;
    }

    public static void BornPlayer(Player player)
    {
        mPlayer = player;
        flag1 = true;
    }

    public static void BornPlayer(ArrayList players)
    {
        mPlayers.Clear();
        mPlayers = players;
        flag1 = true;
    }
}

这里写图片描述

题外话:GameMgr类是继承Unity3d的MonoBehaviour, MonoBehaviour是unity3d里面特有的一个类,可以直接挂载在GameObject上面,

Update() 函数在unity3d里面是每一帧都被调用,刷新很快,可以做循环监听事件
参见官方文档:
https://docs.unity3d.com/ScriptReference/MonoBehaviour.Update.html
*Update is called every frame, if the MonoBehaviour is enabled.
Update is the most commonly used function to implement any kind of game behaviour.*

public static void BornPlayer(BroadCast bc)
    {
        mBc = bc;
        flag = true;
    }

flag=true, flag1=true;

var player = Instantiate(Resources.Load<GameObject>("16_2"));

var controller = player.GetComponent<AIController>();

这样就会实例一个玩家,
实例后flag=false; 程序只进行了一次,就只有一个玩家产生;
Unity3d 里面的Instantiate是GameObject内置函数, 省略前缀,类似copy一个玩家,
参见官方文档:
https://docs.unity3d.com/ScriptReference/Object.Instantiate.html
Resources.Load..是Unity3d加载工程目录Resources文件夹下面的资源,
参见官方文档:
https://docs.unity3d.com/ScriptReference/Resources.Load.html

最终我们知道了所有的玩家都是在GameMgr.cs Update函数里面产生的;

下面看看游戏里面同屏玩家的AI和玩家的AI:
这里写图片描述
NetMgr三个Action委托
如果需要可以学习一下c#官方的Action介绍
https://msdn.microsoft.com/zh-cn/library/018hxwa8(v=vs.110).aspx
玩家挂载的脚步PlayerController.cs
这里写图片描述
很明显,连接socket的时候注册了两个委托OnBorn和OnMove

再看看动态生成的同屏玩家AIController.cs,这是挂载在同屏玩家上面的Prefab脚本
这里写图片描述
也注册了两个委托:OnMoveFunction和OnOver; 没有再去连接Socket,统一由NetMgr管理
现在就很清楚了;
这三节主要就是服务器协议和客户端的协议对应分解过程,顺便讲解了Unity3d同屏处理和AI的处理过程;
现在xingo的列子协议分解完了;
最后放一个流程图:
这里写图片描述
从下一节开始分解xingo_demo server的游戏逻辑处理,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值