紧接上篇 菜鸟养成记 2主服务 https://blog.csdn.net/u010294054/article/details/88077896
让我们赶快进入游戏的海洋吧
第一步 主机调用加载游戏场景 嗯? 为啥只有主机调用加载场景
PhotonNetwork.LoadLevel("DemoAsteroids-GameScene");
因为我们在一开始就设置了自动同步场景
PhotonNetwork.AutomaticallySyncScene = true;
主机调用PhotonNetwork.LoadLevel() 后,其他客户端都会收到切换场景的消息并在这里处理
public static partial class PhotonNetwork
{
public static void LoadLevel(int levelNumber)
{
if (PhotonNetwork.AutomaticallySyncScene)
{
SetLevelInPropsIfSynced(levelNumber);
}
PhotonNetwork.IsMessageQueueRunning = false;
loadingLevelAndPausedNetwork = true;
_AsyncLevelLoadingOperation = SceneManager.LoadSceneAsync(levelNumber,LoadSceneMode.Single);
}
}
爱找茬的小伙伴这时候就会发现问题了:
这个切换场景的方法和主机通知其他客户端切换场景的方法是一个方法
而且PhotonNetwork.AutomaticallySyncScene 也是 == true
这里会不会出现互相通知加载场景的死循环呢?
吭吭 这位小伙伴 大可放心 ,别人不会这么蠢的, SetLevelInPropsIfSynced 方法的第一行就判断了 非主机就直接return
internal static void SetLevelInPropsIfSynced(object levelId)
{
if (!PhotonNetwork.AutomaticallySyncScene || !PhotonNetwork.IsMasterClient || PhotonNetwork.CurrentRoom == null)
{
return;
}
}
主机已经切换好了场景了 现在要等待其他客户端进入游戏
private bool CheckAllPlayerLoadedLevel()
{
foreach (Player p in PhotonNetwork.PlayerList)
{
object playerLoadedLevel;
if (p.CustomProperties.TryGetValue(AsteroidsGame.PLAYER_LOADED_LEVEL, out playerLoadedLevel))
{
if ((bool) playerLoadedLevel)
{
continue;
}
}
return false;
}
return true;
}
其他客户端都进入场景之后通知 开始 进入游戏倒计时
Hashtable props = new Hashtable
{
{CountdownTimer.CountdownStartTime, (float) PhotonNetwork.Time}
};
PhotonNetwork.CurrentRoom.SetCustomProperties(props);
不墨迹了,我们快开始游戏吧!
开始游戏的第一件事 就是加载我们的雷霆战机
ennnn...不要太在意这个模型 我们来看一下如何同步加载物体
PhotonNetwork.Instantiate("Spaceship", Vector3.zero ,Quaternion.Euler(Vector3.zero), 0);
我们来模仿一下 试试加载一个自己创建的球体
在Resources文件夹下面创建一个名字为Sphere的预制体
我们来试试看
PhotonNetwork.Instantiate("Sphere", Vector3.zero ,Quaternion.Euler(Vector3.zero), 0);
报错了...
PhotonNetwork.Instantiate() can only instantiate objects with a PhotonView component. This prefab does not have one: Sphere
PUN同步加载的物体不能缺少这个组件,我们需要添加 PhotonView到这个预制体上
再运行一遍 ,恭喜你 现在能成功同步加载物体了!