Unity UGS官方例子BossRoom,NetCode部分的读代码笔记

适配

  1. 项目引用了navMesh库,2022版本已经内置到引擎,因此升级后要删掉库引用
  2. auth库的2.4.0有bug,编辑器环境下profile检查会抛异常,导致编辑器环境不能使用lobby,仿照官方,降到2.3.1版本
  3. 不清楚为什么打出来的包不能跟编辑器联机,貌似编出来的是release版,没找到改参数的地方,多人调试只能用parrelSync

参考文档

知乎其他人经验 这个人的代码老旧,部分已经对不上,如角色网络对象和显示分离做法已经变了

官方项目代码介绍,更复杂,看起来累,但避免了货不对板

同步方式很重要,先看官方这个才能看懂代码

初始化

在StartUp做游戏初始化,然后再到开始场景
切换场景不销毁的对象,都用了DontDestroyOnLoad
NetworkManager是NetCode的控制器,挂在全局对象上
ConnectionManager是BossRoom自己写的组件,声明并且注入了游戏状态机,游戏状态改变时调ChangeState
ClientConnectingState 进入这个状态会起一个异步任务,连接服务器ConnectClientAsync
玩家连接,断开服务器,都通过这个管理
GameDataSource 里存行为列表

using Action = Unity.BossRoom.Gameplay.Actions.Action;
[Tooltip("All Action prototype scriptable objects should be slotted in here")]
[SerializeField]
// 这就是BossRoom的所有技能,都做成asset配置,存到这里了
private Action[] m_ActionPrototypes;

SceneLoader里SceneLoaderWrapper是BossRoom实现的类
NetCode自带了一个场景管理NetworkSceneManager,并且官方希望刚开始用NetCode的人都要用这个场景管理
OnSceneEvent附带挺多事件的,加载过程根据这几个状态做进度可视化,直到SynchronizeComplete才做逻辑初始化,可避免掉虚空

玩家

对服务器而言玩家只是个网络连接,对客户端而言玩游戏玩的是输入控制
玩家不等于游戏角色,只不过玩家的输入控制,影响了游戏角色
每个网络连接会绑定一个永久的玩家Prefab,BossRoom里叫PersistentPlayer,它拥有NetworkObject组件,定义在NetworkManager里面,这个东西不销毁

Startup场景初始化游戏,没有角色也不需要输入控制
MainMenu场景已经初始化了游戏,需要指定服务器,输入控制实际上控制的是配置和网络连接,没角色
CharSelect场景连上了服务器,但是也不需要角色,输入控制就是组队的UI交互
BossRoom场景才真正有了游戏角色,根据网络连接创建角色通知客户端,客户端再判断是不是玩家,是不是自己,如果是自己,就绑定输入控制

void OnLoadEventCompleted(string sceneName, LoadSceneMode loadSceneMode, List<ulong> clientsCompleted, List<ulong> clientsTimedOut)
{
   
    if (!InitialSpawnDone && loadSceneMode == LoadSceneMode.Single)
    {
   
        InitialSpawnDone = true;
        // 为每个网络连接创建游戏角色并初始化位置
        foreach (var kvp in NetworkManager.Singleton.ConnectedClients)
        {
   
            //ServerBossRoomState定义了PlayerPrefab,创建玩家角色的时候就创建这个prefab
            SpawnPlayer(kvp.Key, false);
        }
    }
}

// 上面的SpawnPlayer常规执行创建,关键是最后
// NetworkObject创建好,要调用SpawnWithOwnership,把自己注册进NetworkSpawnManager,注册完成会回调各个组件的OnNetworkSpawn做初始化,游戏就可以开始了
// spawn players characters with destroyWithScene = true
newPlayer.SpawnWithOwnership(clientId, true);

角色信息的传递

guid不是guide,不是引导!!!!是职业ID
NetworkAvatarGuidState的作用根据guid初始化角色信息,因此它专门建了个asset配置AvatarRegistry,管理所有的角色配置

/// <summary>
/// NetworkBehaviour component to send/receive GUIDs from server to clients.
/// </summary>
public class NetworkAvatarGuidState : NetworkBehaviour
{
   
    //这个GUID会随机初始化,然后选角色的后更新
    [FormerlySerializedAs("AvatarGuidArray")]
    [HideInInspector]
    public NetworkVariable<NetworkGuid> AvatarGuid = new NetworkVariable<NetworkGuid>();
    [SerializeField]
    AvatarRegistry m_AvatarRegistry;
}

//它被声明在PersistentPlayer里面,先是初始化随机一个值
[RequireComponent(typeof(NetworkObject))]
public class PersistentPlayer : NetworkBehaviour
{
   
    [SerializeField]
    PersistentPlayerRuntimeCollection m_PersistentPlayerRuntimeCollection;
    [SerializeField]
    NetworkNameState m_NetworkNameState;
    [SerializeField]
    NetworkAvatarGuidState m_NetworkAvatarGuidState;
    public NetworkNameState NetworkNameState => m_NetworkNameState;
    public NetworkAvatarGuidState NetworkAvatarGuidState => m_NetworkAvatarGuidState;
}
// 选角色完成的时候会把角色信息存进去,由此可见,这个persistentPlayer,就是用来玩家数据并传递的
void SaveLobbyResults()
{
   
    foreach (NetworkCharSelection.LobbyPlayerState playerInfo in networkCharSelectioLobbyPlayers)
    {
   
        var playerNetworkObject = NetworkManager.Singleton.SpawnManageGetPlayerNetworkObject(playerInfo.ClientId)
        if (playerNetworkObject && playerNetworkObject.TryGetComponent(ouPersistentPlayer<
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity Starter Assets是Unity官方提供的一些基础模型、贴图、声音和场景,用于帮助开发者快速搭建游戏原型或者学习Unity。 而NetcodeUnity官方推出的一款多人游戏开发工具,可以帮助开发者快速搭建基于云服务的多人游戏系统,支持多种网络连接方式和游戏类型。 将Unity Starter Assets与Netcode结合可以让开发者快速搭建一款基于云服务的多人游戏原型。开发者可以使用Unity Starter Assets中的基础模型、贴图、声音和场景,通过Netcode将多个玩家连接起来,实现多人游戏的基础功能,如玩家之间的同步、交互、碰撞检测等。同时,开发者可以根据自己的需要添加更多的游戏元素和功能,实现自己的游戏想法。 总之,将Unity Starter Assets与Netcode结合可以让开发者快速搭建多人游戏原型,节省开发时间和精力,加速游戏开发进程。 ### 回答2: Unity Starter Assets是Unity官方提供的一套通用的游戏素材和脚本库,旨在帮助开发者快速构建游戏原型。而NetcodeUnity官方的一款网络多人游戏开发工具,提供了可靠且高效的网络通信功能。 将Unity Starter Assets与Netcode结合使用,可以帮助开发者更轻松地创建基于网络的多人游戏。首先,Unity Starter Assets提供了各种有用的游戏资源,如模型、贴图、声音等,可以用来构建游戏场景和角色。这些资源可以与Netcode的网络功能结合,使得多个玩家可以在同一个场景中进行互动。 其次,Unity Starter Assets中的一些脚本库可以与Netcode的网络同步系统配合使用,确保游戏的物理属性、玩家输入和逻辑状态在多个客户端之间同步。比如,通过使用Netcode的服务器和客户端架构,可以确保玩家在不同设备上进行的操作能够实时同步,实现多人协作或对战模式。 此外,Unity Starter Assets还提供了一些示例项目和教程,使得开发者能够更快地理解和使用Netcode的功能。这些示例项目可以帮助开发者了解如何实现多人游戏中常见的功能,如玩家之间的交互、聊天功能、战斗系统等。 综上所述,将Unity Starter Assets与Netcode相结合,可以加快多人游戏的开发速度,提高开发效率。通过利用Unity Starter Assets提供的资源和脚本库,结合Netcode的网络通信功能,开发者可以轻松地构建出高质量的网络多人游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值