我学xingo golang服务器之-Unity3d c#多玩家同屏出生过程和AI处理分解
来源:互联网 发布:java多线程网络编程 编辑:程序博客网 时间:2024/09/21 09:21
上一节
我学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的游戏逻辑处理,
- 我学xingo golang服务器之-Unity3d c#多玩家同屏出生过程和AI处理分解
- 我学xingo golang服务器之-Unity3d c# 协议api分解
- 我学xingo golang服务器之-xingo_demo 服务器游戏逻辑处理初始化过程
- 我学xingo golang服务器之-xingo的单进程,集群服务器的配置和初始化过程
- 新手学xingo golang服务器之-golang和unity3d的Protobuf生成(三)
- 我学xingo golang服务器之-XingoApi调用
- 我学xingo golang服务器之-xingo_demo server.go start
- 新手学xingo golang服务器之-修改xingo 支持字符协议(一)
- 新手学xingo golang服务器之-修改xingo 支持字符协议(二)
- Unity3D--创建敌人和玩家之间的AI
- 【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统
- 我和我的小伙伴们一起学Unity3D(四)角色移动之Transform
- UE4之AI追玩家( 1 )
- UE4之AI攻击玩家(3)
- UE4之玩家攻击AI(4)
- 我学你也学之WEB服务器篇——安装JDK和APACHE服务器
- golang错误处理之panic和recover
- unity3D学习之API_PlayerPrefs 玩家偏好
- Linux下用户路径的配置
- HTTP 错误 401.3
- HDU-1494-跑跑卡丁车
- 剑指offer-字符串的排列
- 浅谈Three.js源码-render之WebGLGeometries.js
- 我学xingo golang服务器之-Unity3d c#多玩家同屏出生过程和AI处理分解
- wamp-3.0.6 vhost
- iOS App 签名的原理
- 关于锚点如何不用a标签也能实现跳转
- Android布局
- Drools7在Intellij IDEA下的引入静态方法错误提示
- 关于Java中使用split()方法时报ArrayIndexOutOfBoundsException数组越界异常解决方法
- 用cookie实现自动登录
- python 转化xml为json的一个小例子