使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑

Photon
PUN
Unity
网络游戏开发

网络游戏逻辑处理与MasterClient

网络游戏逻辑处理:

方法一:编写Photon服务器与客户端程序

客户端传递数据之服务器,服务器完成逻辑判断,并将结果返回给客户端

方法二:编写客户端程序

游戏逻辑在客户端处理,photon服务器只负责客户端之间数据验证和传递

Master Client

  • 使用客户端处理网络游戏逻辑时,必须保证游戏房间内只有一个客户端处理网络游戏逻辑,我们选择某个客户端来网络处理游戏逻辑
  • 这个客户端根据其他客户端发送的数据,处理网络游戏逻辑。之后,将处理结果发送给所有客户端同步

PUN Master Client

在PUN的客户端Client中,包含一个MasterClient,我们使用MasterClient来处理网络游戏逻辑

  • MasterCIient是PUN里一个特殊的客户端,每个游戏房间Room有且仅有一个MasterClient
  • MasterCIient拥有比一般客户端更高的权限,包括将其它客户端踢出游戏房间、管理网络游戏场景对象等
  • MasterClient离开房间后,GameServer会自动选择ID最小的客户端作为MasterCIient
  • 使用PhotonNetwork.isMasterCIient判断本地客户端是否为MasterCIient

玩家对象生成

Photon中生成玩家对象需要调用下面方法实例化。

  • ReSourcesPrefabName:需要实例化Prefab在resources文件下下名称
  • Position:需要实例化对象的出生点
  • Quaternion:需要实例化对象的旋转信息
  • Group:编组信息,方便区分各个对象,如区分出我方和敌方 PhotonNetwork.Instantiate("ReSourcesPrefabName",Position,Quaternion, Group)

    例如:
    //生成玩家对象
void InstancePlayer()
{
playerCustomProperties = PhotonNetwork.player.CustomProperties;
if (playerCustomProperties["Team"].ToString().Equals("Team1"))
{
localPlayer = PhotonNetwork.Instantiate("MyPlayer",
TeamOneSpTrans[(int)playerCustomProperties["TeamNum"]].position, Quaternion.identity, 0);
}
//如果玩家属于队伍2,生成RobotPlayer对象
else if (PhotonNetwork.player.CustomProperties["Team"].ToString().Equals("Team2"))
{
localPlayer = PhotonNetwork.Instantiate("MyPlayer",
TeamTwoSpTrans[(int)playerCustomProperties["TeamNum"]].position, Quaternion.identity, 0);
} localPlayer.name = PhotonNetwork.player.NickName;
}

游戏对象状态同步

位置朝向信息同步

方法一:通过将Transfrom组件拖到PhotonView组件上的observed componentS属性上。该方式尽管会传输对象的位置旋转信息,但是由于通信间隔的存在,导致对象运动不连续

方法二:使用PhotonTransformView实现玩家位置与朝向的同步。

PhotonTransformView组件内置几种插值算法,可以使用内置插值方法实现玩家的平滑“移动。

方法三:使用OnPhotonSerializeView(PhotonStream,PhotonMessageInfo)方法同步

使用该方法时需自行处理位置和旋转的插值。

private void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.isWriting)
{
//We own this player: send the others our data
...
stream.SendNext(transform.position);
stream.SendNext(transform.rotation);
}
else
{
...
PlayerPosition = (Vector3)stream.ReceiveNext();
PlayerRotation = (Quaternion)stream.ReceiveNext();
}
}

动画信息同步

方法一:针对使用Animator组件的动画,使用PhotonAnimatorView快速开发。

方法二:使用OnPhotonSerializeView(PhotonStream,PhotonMessageInfo)方法同步。使用该方法将动画参数的值传递,来实现动画的同步,该方法对animation组件动画适用。

Animation动画:

如player有针对于其动画的控制脚本,通过Update函数中的playerState来判断动画表现,这里我们传递playerState来实现动画同步

private void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.isWriting)
{
//We own this player: send the others our data
...
stream.SendNext(player.playerState);
}
else
{
...
player.playerState = (PlayAnimation)stream.ReceiveNext(); ;
}
}

Animator动画:

animator组件中通过各个参数来控制动画的分支走向,这里我们同步其参数来实现动画同步

private void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.isWriting)
{
//We own this player: send the others our data
...
stream.SendNext(ani.GetFloat("RunSpeed"));
stream.SendNext(ani.GetBool("isJump"));
}
else
{
...
ani.SetFloat("RunSpeed",(string)stream.ReceiveNext());
ani.SetBool("isJump",(bool)stream.ReceiveNext());
}
}

使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑的更多相关文章

  1. 使用Photon引擎进行unity网络游戏开发(三)——网络游戏大厅及房间

    使用Photon引擎进行unity网络游戏开发(三)--网络游戏大厅及房间 Photon PUN Unity 网络游戏开发 连接到Photon ConnectUsingSettings 设置你的客户端 ...

  2. 使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍

    使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍 Photon PUN Unity 网络游戏开发 Photon常用类介绍: IPunCallback PUNGIPunCa ...

  3. 使用Photon引擎进行unity网络游戏开发(一)——Photon引擎简介

    使用Photon引擎进行unity网络游戏开发(一)--Photon引擎简介 Photon PUN Unity 网络游戏开发 Photon引擎简介: 1. 服务器引擎: 服 务 器 引 擎 介 绍 服 ...

  4. unity 3d开发的大型网络游戏

    unity 3d开发的大型网络游戏 一.总结 1.unity的官网上面应该有游戏列表 2.unity3D是很好的3d游戏引擎,也支持2d,也能做很多画面精良的3A级游戏 3.范围:电脑游戏,手机游戏, ...

  5. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新

    本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...

  6. Siki_Unity_4-4_丛林战争_Socket/TCP网络游戏开发

    Unity 4-4 丛林战争(Socket/TCP网络游戏开发) 任务1:素材.演示.Prerequisite 使用c#的有关TCP的底层API进行服务器端的开发(直接通过socket进行通信) 功能 ...

  7. 喵的Unity游戏开发之路 - 推球:游戏中的物理

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  8. 关于Unity游戏开发方向找工作方面的一些个人看法

     这是个老生常谈,却又是谁绕不过去的话题,而对于每个人来说,所遇到的情况又不尽相同,别人的求职方式和路线不一定适合你,即使是背景很相似的两个人,有时候机遇也很重要. 我本人的工作经验只有一年,就业方式 ...

  9. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一)

    引言 现在做游戏开发的没有几个不用Excel的,用的最多的就是策划.尤其是数值策划,Excel为用户提供强大的工具,各种快捷键,各种插件,各种函数.但是作为程序来说其实关注的不是Excel而是它最终形 ...

随机推荐

  1. cesium.js 设置缩放最大最小限制

    viewer.scene.screenSpaceCameraController.minimumZoomDistance = 1200;viewer.scene.screenSpaceCameraCo ...

  2. BigDecimal.setScale用法总结

    1. BigDecimal num1 = new BigDecimal(2.225667);//这种写法不允许,会造成精度损失 2. BigDecimal num2 = new BigDecimal( ...

  3. 解决dpdk中出现IOMMU not found的问题

    问题 在使用VFIO前,需要在BIOS打开VT-x和VT-d,想把一个PCIe网卡透传到虚拟机中,发现虚拟机启动失败,提示IOMMU没有找到. 输入以下命令确定vt-d开启 dmesg | grep ...

  4. ARP 协议 理解

    ARP协议的本质是使局域网内的其他主机能够知道我在哪儿,比如在局域网上有人冲着所有人喊了一句「IP为XXXX的家伙,你在哪儿」,我一听,XXXX不是我的IP吗,我得回答他啊,于是我冲着所有人(也可以是 ...

  5. 登录SQLServer报错:无法连接到DESKTOP-LDJHQGN

    解决方法:下↓↓↓

  6. font-failmly字体对应

  7. C# 参数关键字params的作用

    为了将方法声明为可以接受可变数量参数的方法,我们可以使用params关键字来声明数组,要求: (1)在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params ...

  8. CUDA 版本,显卡驱动,Ubuntu版本,GCC版本之间的对应关系

  9. linux脚本运行错误:$'ls\r': command not found

    原因在于 windows 下的换行符是 \r\n,而 linux 下的换行符是 \n 解决方案: 首先运行如下命令安装 dos2unix: yum install dos2unix -y 接下来运行如 ...

  10. iview-cli 项目、iView admin 代理与跨域问题解决方案

    iview-cli 项目.iView admin 跨域.代理问题解决方案 在webpack.dev.config.js文件中: 添加: devServer: { historyApiFallback: ...