使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑
使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑
网络游戏逻辑处理与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引擎实现网络游戏逻辑的更多相关文章
- 使用Photon引擎进行unity网络游戏开发(三)——网络游戏大厅及房间
使用Photon引擎进行unity网络游戏开发(三)--网络游戏大厅及房间 Photon PUN Unity 网络游戏开发 连接到Photon ConnectUsingSettings 设置你的客户端 ...
- 使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍
使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍 Photon PUN Unity 网络游戏开发 Photon常用类介绍: IPunCallback PUNGIPunCa ...
- 使用Photon引擎进行unity网络游戏开发(一)——Photon引擎简介
使用Photon引擎进行unity网络游戏开发(一)--Photon引擎简介 Photon PUN Unity 网络游戏开发 Photon引擎简介: 1. 服务器引擎: 服 务 器 引 擎 介 绍 服 ...
- unity 3d开发的大型网络游戏
unity 3d开发的大型网络游戏 一.总结 1.unity的官网上面应该有游戏列表 2.unity3D是很好的3d游戏引擎,也支持2d,也能做很多画面精良的3A级游戏 3.范围:电脑游戏,手机游戏, ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新
本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...
- Siki_Unity_4-4_丛林战争_Socket/TCP网络游戏开发
Unity 4-4 丛林战争(Socket/TCP网络游戏开发) 任务1:素材.演示.Prerequisite 使用c#的有关TCP的底层API进行服务器端的开发(直接通过socket进行通信) 功能 ...
- 喵的Unity游戏开发之路 - 推球:游戏中的物理
很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...
- 关于Unity游戏开发方向找工作方面的一些个人看法
这是个老生常谈,却又是谁绕不过去的话题,而对于每个人来说,所遇到的情况又不尽相同,别人的求职方式和路线不一定适合你,即使是背景很相似的两个人,有时候机遇也很重要. 我本人的工作经验只有一年,就业方式 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一)
引言 现在做游戏开发的没有几个不用Excel的,用的最多的就是策划.尤其是数值策划,Excel为用户提供强大的工具,各种快捷键,各种插件,各种函数.但是作为程序来说其实关注的不是Excel而是它最终形 ...
随机推荐
- PHP过滤
1.过滤是不是URL(后台过滤) $url = "https://www.baidu.com"; if(!filter_var($url,FILTER_VALIDATE_URL)) ...
- C#中如果用await关键字来await一个为null的Task对象会抛出异常
await & async模式是C#中一个很重要的特性,可以用来提高异步程序(多线程程序)的执行效率.但是如果尝试用await关键字来await一个为null的Task对象,会导致程序抛出Nu ...
- Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:5
jsp页面出现如下异常: Stacktrace: at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServle ...
- [iOS]CIDetector之CIDetectorTypeFace人脸识别
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- 前端基础-HTTP协议
一. HTTP协议简介 二. HTTP协议之请求Request 三. HTTP协议之响应Response 四. HTTP协议完整工作流程 五. HTTP协议关键性总结 六.自定义套接字分析HTTP协议 ...
- Redis底层数据类型
Redis主要数据结构:简单动态字符串(SDS).双端链表.字典.跳跃表.整数集合.压缩列表和快速列表: 一.简单动态字符串(SDS): Redis没有直接使用C语言中的传统的字节数组保存字符串,而是 ...
- CentOS 7.2搭建xl2tp服务器
## 1.下载xl2tpd.tar.gz源码包 ```wget http://pkgs.fedoraproject.org/repo/pkgs/xl2tpd/xl2tpd-1.3.8.tar.gz/d ...
- [转]IA64与X86-64的区别
原文:https://www.cnblogs.com/sunbingqiang/p/7530121.html 说到IA-64与x86-64可能很多人会比较陌生.不知道你在下载系统的时候有没有注意过,有 ...
- (杭电 2054)A==B?(这真是个巨坑)
A == B ? Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- Java编码算法和摘要算法
编码算法 编码算法是将一种形式转换成等价的另外一种形式.主要是为了方便某种特定场景的处理. 字母如何在计算机中表示呢? 用ASCII编码 那中文字符如何在计算机中表示呢? 用Unicode编码 如何同 ...