模块一:静态类、静态变量
相信大家一定对于类不陌生
我们一般在建立一个类的时候,常用到:
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适用于一些需要保存的信息比如聊天记录等。