从本章开始,系统学习Photon的网络编程。PUN作为Photon对Unity定制化的网络编程方案,得到了开发者的一致好评,因此,根据官方教程系统学习PUN是必要的,这样可以加深对Unity网络编程的理解,从而使用起来游刃有余。
文 / 丁建雄
图 /
小白是单纯为兴趣而写作的独立创作人,如果您喜欢小白的文章,欢迎关注、交流、分享(引用请链接到本文)。
创建AppId,可以通过官网免费申请。这样,我们就得到了一个可以同时容纳20人的云应用服务空间。
连接服务器、房间访问和创建。这是联网的基础内容,可以通过一个空对象挂载Launcher脚本实现。其中,Launcher脚本包含了版本、链接、回调函数等基础内容,可以作为标准化的对象嵌入到任何新的网络应用中。
创建UI系统,从简单的UI系统中,学会用户交互,通过用户输入控制网络。
使用简单数据存储PlayerPrefs系统,通过UI控件,对玩家的基本信息进行存储交互。
通过LoadScene()可以进行多场景之间的调用,这种调用可以通过场景号码或者场景名称来调用。
场景管理器:用于管理场景之间的连接、切换、交互等功能,是一个比较通用的模块,可以作为一个预制件处理。
自定义的脚本可以看成一个自定义的组件,通过组件挂靠到具体的实例(Object)的方法,可以将脚本发挥作用;有些单纯的脚本发挥作用的可以通过挂载在空对象上实现功能。
网络编程需要对各种网络操作流程有较深的理解,比如一个简单的流程:连接服务器 - 将本机作为主机设置游戏空间网络 - 在网络建好之后的回调函数中执行创建并进入房间的方法 - 在进入房间之后的回调函数中加载游戏场景 - 游戏场景切换逻辑与进出房间的脚本挂靠。这样以后,就完成了单纯的基本网络架构。
建立玩家系统:首先考虑的是模型,然后是动画逻辑,然后是控制语句,接着是场景优化(包括相机跟随,姿态优化等),后面还有对战交互系统等更复杂逻辑的构建。
这里面都是很深入的部分,学习的基本思路是先在本地实现,然后加入网络编程,这样可以快速定位bug,提高效率。
代码注意点1
- 习惯于用log来确保每一个可能的错误都被提取到,虽然很枯燥,但是却有利于长远打算。
-
Time.deltaTime
是使得FixedUpdate
真正活起来的幕后方法,如果要脱离帧率存在,可以在Update中使用这个方法定制新功能。 - Trigger与Collision的区别与联系:都可以检测碰撞,只不过Trigger方法不发生物理行为,而Collision方法可以实现全部的物理属性。
- 联网同步:变换同步组件+动画同步组件,同时可以设置同步帧率特性(与本机帧率不同)。
- 加上
PhotonNetwork.Connected == true
作为判断条件,可以允许用户本地测试而不影响联网效果。
代码注意点2
- 使用
IpunObservable.OnPhotonSerializeView
重构方法可以实现对本地 / 网络玩家实时数据的分离、同步等功能。 - 所有Application的内容都过时了,使用
SceneManager
新方法可以管理,具体查找Standard Events的示例。 - 使用Static方法可以保证本地玩家的唯一性,同时需要使用this指针将实例连接到static变量中。
-
DontDestroyOnLoad(this.gameObject)
方法可以保证有玩家退出时不对场景内其他玩家造成销毁的影响。