Photon的进阶用法

模块一:静态类、静态变量

相信大家一定对于类不陌生

我们一般在建立一个类的时候,常用到:

ClassA a = new ClassA();

此时计算机会新分配一段空间,并将类的一部分定义的属性拷贝到这段空间,这个空间存放的类被称为一个实例,然后这个实例可以通过a这个变量为媒介来访问属性和方法。

但是在建立一个实例的时候,对于类的定义中有static修饰的变量不会被拷贝到实例,只会存放在计算机对于类的定义的区域,所以,对于每一个类的实例,其静态变量是一致的,或者说类的实例变量不可以访问静态的内容

如下面有一个类

class A{
int b;
static int c;
}

//若要访问b的值需要
A a = new A();
Debug.Log(a.b);
//而不能写成
Debug.Log(A.b);

//若要访问c的值则直接
Debug.Log(A.c);

同样一个静态类也是不可以被复制的,访问它的方法或者参数,直接类名称.类属性/类方法()

模块二:Photon Network类

PhotonNework是管理Photon连接的一个大脑级别的静态类,除了上次的那个视频,它还有以下重要的属性:

PhotonNetwork.GetPing();
//获得延时值,返回整数,单位毫秒

PhotonNetwork.localPlayer;
//返回一个Player,代表当前玩家,其中Player是所有连接到服务器上的玩家的唯一标识符

PhotonNetwork.Time;
//返回服务器同步时间戳,用于同步游戏时间

PhotonNetwork.IsConnected;
//返回是否连接

PhotonNetwork.CurrentRoom;
//返回当前房间信息;

PhotonNetwork.IsMasterClient;
//返回是否为主机,主机是具有可以控制场景切换、踢人、生成销毁物体权限的玩家客户端

模块三:PhotonView、PhotonTransformView、PhotonRigidbody(2D)View

PhotonView是维持一个物体和在另外一个客户端克隆的连接的重要的一个组件,当一个客户端生成物体,那么在另一个客户端也会同样生成一个物体,这个物体叫做它的克隆,而PhotonView通过与物体的克隆形成一个连接来同步两个物体的状态、调用方法、发送信息等。

【补充】什么叫做State Authority?

你在打多人游戏的时候,肯定不能操控别人的角色,所以别人的角色出现在你的游戏世界,只是被网络信号操控的一个傀儡而已,此时你对其没有State Authority

在Photon中,因为对于玩家对象,在联机的时候需要先生成,而主动生成(比如切入这个场景后调用start函数中立刻PhotonNetwork.Instantiate)这个对象的客户端默认有State Authority

首先PhotonView是一个非静态物体,所以要控制它必须获得它的引用

//你可以
private PhotonView pv;
void Start(){
pv=GetComponent<PhotonView>();
}
//但是这里为了提醒你要放置PhotonView组件,可以在类定义前面加一句
[RequireComponent(typeof(PhotonView))]

//也可以
public PhotonView pv;
//然后通过编辑器选择框获得其引用即可

然后讲解如何判断它拥有State Authority的玩家

pv.IsMine;
//判断你是否对物体有操控权利

pv.Owner;
//获得物体对应的操控玩家,在对战的时候,可以通过获得Owner来给对应玩家造成伤害

然后对于Photon Transform View和Photon Rigidbody(2D)View

添加了Transform View可以同步游戏物体的位置

添加了RigidbodyView适用于模拟真实的物理情景

【如何获得组件】

游戏物体Inspector中

AddComponent/Photon Network/

就可以找到这些东西了

其中PhotonRigidbodyView依赖一个PhotonView和一个RigidBody组件

它其实是通过之前说的在组件类定义前添加一个标签实现的

[RequireComponent(typeof(Dependency))]

编辑器会自动在加入这些组件时添加依赖组件,如果不慎移除了依赖组件,编辑器会自动报错

这一点如果你在自制插件、编辑器拓展的时候,需要组件时可以加上这一个标签来增加用户友好性

模块四:RPC

设想一个场景,如果你在打王者,你打一个敌人,在每个人的客户端都能看到,如果涉及到暴击,每个人的设备随机数发生器系统都不一样,有些人判定暴击有些人判定不暴,这个游戏怎么玩?!

所以,必须要有一台统一的机器将伤害广播到所有客户端消除争议,一般商家使用服务器来计算伤害广播,但是Photon的联机功能十分简陋,房间只是作为一个转发的作用,所以需要指定一台设备充当游戏逻辑服务器的功能,一般我们默认选择之前提到的Master Client

当检测技能满足触发条件,我们会将攻击请求提交到主客户端,然后主客户端向所有人广播返回请求,这就涉及到远程过程调用(RPC)的问题。

远程过程调用就是调用另外的/自己的客户端的方法

首先,对于远程过程调用的函数,函数前要加"[PunRPC]"

[PunRPC]
void shakeScreen(){

}

然后pv.RPC()来调用

下图是函数两种写法参数的说明

第一种写法要求第一个参数填写方法名,比如之前的shakeScreen

第二个参数则填写对应的玩家唯一身份标识,后面的只要按照PunRPC函数参数的顺序一次填入参数并两个参数之间用逗号隔开就好了

一个完整的案例

void rpc(){
pv.RPC("func1",PlayerA,1,2,3);
}

[PunRPC]
void func1(int a,int b,int c){

}

第二种区别在第二个参数上,而是用一个枚举RpcTarget来标识玩家

这是枚举的所有情况

All、Others当然就是所有人和除了自己以外的人

MasterClient就是主机

AllBuffered要重点讲解一下

buffer就是缓冲的意思,你打开qq的时候,你也可以看到你不在线的时候的聊天记录对不对,所以那些聊天记录被存在了一个缓冲的区域,然后等你登陆在释放到你的界面里面,所以缓冲这个词很形象,就是不是立即的,先缓一缓,大家可以则会么理解,其实这个游戏也是一个像qq一样可以互发、私法消息的房间,但是它发的比qq快多了,一秒能发好几十个来回,而且都是加密过的位置、请求信息。这种buffered适用于一些需要保存的信息比如聊天记录等。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值