Unity网络基础_2

必须建立的五个网路思维

1,这个对象由谁创建

2,这个状态由谁拥有

3,谁可以修改他

4,它是"持续状态"还是"一次性事件"?

5,新玩家加入时,是否需要看到它

此篇真正创建主角并且设置在不同客户端下角色的颜色显示

第一步创建调试场景

将场景和摄像机架设好后开始制作主角的预制体用以自动生成

首先在场景中创建一个胶囊体用来代表角色

联机游戏中,角色除了在主机本地存在还需要在网络中存在以便调用

想要在网络中存在需要在下面添加组件NetWorkObject代表这是一个网络角色

分配NetWork后在FishWork中才会给他分配身份

注意:NetWorkObject应该放在玩家根节点

创建角色显示脚本用于玩家初始化后分配身份以及颜色

完整脚本:

cs 复制代码
using FishNet.Object;
using UnityEngine;

public class PlayerOwnershipView : NetworkBehaviour
{
    [SerializeField]
    private Color ownerColor = Color.green;

    [SerializeField]
    private Color remoteColor = Color.gray;

    public override void OnStartClient()
    {
        base.OnStartClient();

        Renderer playerRenderer = GetComponent<Renderer>();

        if (playerRenderer != null)
        {
            playerRenderer.material.color =
                IsOwner ? ownerColor : remoteColor;
        }

        Debug.Log(
            $"玩家客户端初始化:" +
            $"Name={gameObject.name}," +
            $"IsOwner={IsOwner}"
        );
    }
}

代码分解:

public class PlayerOwnershipView : NetworkBehaviour:继承至NetworkBehaviour和传统的MonoBehaviour不一样,增加了以下功能

  • IsOwner
  • IsServerInitialized
  • IsClientInitialized
  • RPC
  • SyncVar
  • 网络生命周期

ownerColor:自身颜色

remoteColor:其余玩家角色

OnStartClientp:初始化时调用,这个方法在游戏启动时,会进行调用,场景中每个被检测到的角色都会进来一次,打破了传统单机游戏一个角色一次分配的固有思想,每个角色在进入这个主角的场景时都会进入一次OnStartClientp的调用,进入的角色身上会根据身份不同带有自己的变量,比如是否为主机角色,然后加载对应的方法用以控制

为什么不用start改为OnStartClientp:start是在游戏开始的时候进行直接的调用,而那个时候网络服务器不一定初始化完成,而OnStartClientp是在服务器初始化完成后进行调用

base.OnStartClient();加载父类的方法,也是所有角色进入场景后不论身份都会调用的基础方法

复制代码
Renderer playerRenderer = GetComponent<Renderer>();

这是得到被调用玩家自身的材质渲染组件,用于后续分配颜色

复制代码
 playerRenderer.material.color =
                IsOwner ? ownerColor : remoteColor;

这一段设置材质,意思是这个角色是否为主角也就是IsOwner是否为True,然后选择将 ownerColor :或者remoteColor赋值给该角色的材质组件

这样子进来的角色的身份就全被初始化完成了

总结:生成的角色都会带有该脚本,并在不同的电脑上被调用,而后根据身上的网络组件在电脑本地判断是否为主角,在不同的电脑上设置为不同的身份

下一步,将玩家制作为预制体

想要让玩家自动生成就需要将玩家预制起来,在特定的地方进行赋值,这样才可以完成一个网络游戏中自动生成角色的功能

下一步,配置主角

将玩家作为预制体后进行角色配置以及出生点配置

点击之前拖入的NetworkManager物体,在右侧找到

将玩家预制体拖入PlayerPrefab

在场景中新建两个空物体作为出生点,注意不要让两个空物体重叠

将两个空物体拖入Spawns,第一个是先加载完毕的物体,也就是主角的位置

Add To Default Scene保持默认勾选即可,它可以让Fish知道客户端正在观测哪个网络场景,如果不分配的话会出现服务器生成的玩家,但是客户端看不到

全部拖入后保存,然后重新构建

再次打开两个客户端后主机依次点击两个按钮

再打开客户端点击第二个按钮,可以看到两个屏幕的的角色被成功生成了,并且根据的设置的颜色,在双方的视角中自身和对方的颜色都不一样

这样,两个不同客户端的角色就实现身份的判定了

相关推荐
暴走约伯11 小时前
【VFX工具链源码拆解 09】终极工业化闭环:基于 ID 规则驱动的全自动场景建档、骨骼挂载与男转女场景迁移
unity·c#·游戏引擎·材质
寂寞的船2 天前
【Unity知识速递】第13期 Unity 内存泄漏排查实战:从 Memory Profiler 到 Lua 引用泄漏的生产级全链路诊断
unity·junit·c#·游戏引擎·lua
寂寞的船2 天前
【Unity Bug挑战】第12期 Awaitable 二次 await 死锁之谜 —— 为什么同一个异步操作等两次就卡死?
unity·c#·游戏引擎·bug
探求虚无4 天前
用 AI 在 Unity 里做一款 RTS:最难的不是生成代码,而是证明它真的能玩
人工智能·unity·游戏引擎
17岁的勇气5 天前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
寂寞的船5 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
Martina_03216 天前
AI生成3D场景的霓虹灯一开就糊成光团?用6步检查Emissive、Bloom与曝光
人工智能·3d·ai·自然语言处理·游戏引擎·材质·贴图
寂寞的船8 天前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互
寂寞的船8 天前
【Unity知识速递】第5期 Unity 6.2 深度解析:AI Assistant 登场,World Space UI 与 Sentis 全面升级
人工智能·ui·unity
寂寞的船8 天前
【Unity知识速递】第4期 MCP for Unity:用 AI 自然语言控制编辑器
人工智能·unity·编辑器