练习时长两月半的游戏制作人,关于unity中Photun的使用总结
观前导引
你好! 这是我第一次使用 CSDN 来发表我的技术文档,希望在以后日子里能够经常与你相遇。仅用文档来记录一下工作之余的一些零散收获, 也希望能够给找到这篇文章并阅读的朋友们解决一点点相关疑惑,若有不妥之处万望留言指正。那么废话不多说,让我们一起进入程序猿的世界,这篇文章主要包含了一些我在使用unity中的Photon组件的时候遇到的一些问题。
Photon2的下载与导入及初步使用
已经有很多大佬对于photon组件的下载与导入做出了很详细的教程了,这里只将官网地址贴出并对流程进行简述,可以自行下载与操作:
- 申请Photon账号 ,链接: https://www.photonengine.com/;
- 登录账号,创建你的应用与服务器,需要记住你的应用标识 ;
- 导入Photon组件 到你的unity项目的Assets下;
- 修改Photon组件的配置项,路径Assets/Photon/PhotonUnityNetworking/resources,修改PhotonServerSettings文件,在里面填入之前在Photon中记下的应用标识;
- 简单构建一个NetworkingLauncher对象来验证是否能够正常连接入Photon的服务器;
- 参考脚本Launcher.cs
代码如下
.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class Launcher : MonoBehaviourPunCallbacks
{
void Start()
{
PhotonNetwork.ConnectUsingSettings();
}
public override void OnConnectedToMaster()
{
base.OnConnectedToMaster();
Debug.Log("Connected to master!!!!!!!!!!");
PhotonNetwork.JoinOrCreateRoom("Room", new Photon.Realtime.RoomOptions { MaxPlayers = 2 }, default);
}
public override void OnJoinedRoom()
{
base.OnJoinedRoom();
PhotonNetwork.Instantiate("Player", new Vector3( 1, 1, 0), Quaternion.identity, 0);
}
}
- 编辑保存运行后,去unity中查看打印信息**Connected to master!!!**显然成功接入服务器;
- 值得注意的是这部分代码运行成功表示的是能够成功接入服务器并且在加入服务器是初始化了Player的对象,理解这段话很重要,具体的后面涉及这部分我们再做讨论。
- 到这里你已经能够使用Photon实现初步的网络同步了,下面是在笔者进行网络化过程中的一些问题与解决。
PhotonNetwork.Instantiate的使用
- 按照官网中的解释如下:
PhotonNetwork.Instantiate是一个方法,用于在Unity中使用Photon Engine创建网络化的GameObject。它类似于Unity的Object.Instantiate,但它还可以在房间内的所有客户端之间同步对象。
PhotonNetwork.Instantiate("MyPrefabName", new Vector3(0, 0, 0), Quaternion.identity, 0);
- PhotonNetwork.Instantiate的第一个参数是一个字符串,用于定义要实例化的预制体的名称。预制体必须有一个PhotonView组件,并且必须位于Resources文件夹中。第二和第三个参数是创建对象的位置和旋转。最后两个参数是可选的,可以用来指定一个组号和一些自定义数据。值得注意的是每个联网游戏对象必须有一个 PhotonView 组件(和一个 ViewID)作为通过网络的标识符。
- 按照以上内容我们默认已经通过脚本Launcher.cs连接了房间。以下是使用 PhotonNetwork.Instantiate 实例化一个 GameObject 的代码示例:
using UnityEngine;
using Photon.Pun;
public class MyScript : MonoBehaviourPunCallbacks
{
public GameObject prefab;
void Start()
{
if (PhotonNetwork.IsConnected)
{
PhotonNetwork.Instantiate(prefab.name, Vector3.zero, Quaternion.identity);
}
}
}
- 在此示例中,prefab是要实例化的对象。调用PhotonNetwork.Instantiate时会在网络上创建一个新对象,并同步其状态到所有客户端。每个客户端都在自己的计算机上生成该对象副本。值得注意的是此示例是你已经加入了房间并连接到了Photon 服务器。如果你没有这样做,请确保先通过 PhotonNetwork.ConnectUsingSettings() 或类似方法连接到服务器。
- 在使用时可能出现你添加了对象来进行初始化,那个脚本运行后也确定你是进入了服务器,但是还是不能成功将对象同步到客户端,这个时候你要查看脚本运行的先后顺序,可能你创建对象的脚本先执行了,而你加入房间的脚本后执行,这些我们也能在报错信息中查看到。
6.在PhotonNetwork连接到NameServer之前,无法使用PhotonNetwork.Instantiate方法实例化对象。常用的解决方法是等待连接成功后再进行实例化操作。可以在PhotonNetwork.ConnectToRegion或PhotonNetwork.ConnectUsingSettings调用后添加事件侦听器,以在成功连接后执行实例化代码。例如:
void Start() {
PhotonNetwork.ConnectUsingSettings();
PhotonNetwork.ConnectToRegion("us");
// 为成功连接到Master服务器添加侦听器
PhotonNetwork.NetworkingClient.StateChanged += OnStateChanged;
}
void OnStateChanged(Photon.Realtime.ClientState state) {
if (state == Photon.Realtime.ClientState.ConnectedToMasterServer) {
// 连接成功后进行实例化代码
PhotonNetwork.Instantiate("PrefabName", new Vector3(0, 0, 0), Quaternion.identity);
}
}
关于PhotonNetwork.Instantiate实例的生存周期
- 默认情况下,只要创建者在房间内,使用创建的游戏对象就存在。交换房间时,对象不会延续,就像在 Unity 中切换场景一样。值得注意的是客户端离开房间时其余玩家将销毁离开玩家创建的游戏对象。但是这个功能可以使用RoomOptions.CleanupCacheOnLeave来禁用。
- RoomOptions.CleanupCacheOnLeave是用来清理玩家缓存的。是一个bool类型的属性,用于指定当玩家离开房间时是否清空缓存,缓存是指在房间中创建的所有对象和资源,包括玩家、物品等。以下是示例:
RoomOptions options = new RoomOptions();
options.CleanupCacheOnLeave = true;
//如果将 CleanupCacheOnLeave 设置为 true,则当房间中的最后一个玩家离开时,Photon服务器会自动删除该房间,并释放所有与该房间相关的缓存。这可以防止缓存持续占用内存,从而提高应用程序的性能。
PhotonNetwork.JoinOrCreateRoom("roomName", options, TypedLobby.Default);
PhotonNetwork.Instantiate的使用注意事项
- PhotonNetwork.Instantiate的第一个参数是一个字符串,用于定义要实例化的预制体的名称。预制体必须有一个PhotonView组件,并且必须位于Resources文件夹中。
- PhotonNetwork.Instantiate必须在连接到Photon服务器并加入房间后才能使用。可以使用PhotonNetwork.ConnectUsingSettings或类似方法连接到服务器,并使用PhotonNetwork.NetworkingClient.StateChanged事件监听器检测连接状态。
- PhotonNetwork.Instantiate会在网络上创建一个新对象,并同步其状态到所有客户端。每个客户端都在自己的计算机上生成该对象副本。如果客户端离开房间,其余玩家将销毁离开玩家创建的游戏对象。这个功能可以使用RoomOptions.CleanupCacheOnLeave来禁用。
以上是我在这段时间使用Photon中对PhotonNetwork.Instantiate的一些经验与总结。感谢阅读!!!