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知道客户端正在观测哪个网络场景,如果不分配的话会出现服务器生成的玩家,但是客户端看不到

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

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

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

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

相关推荐
音视频牛哥2 小时前
从数字孪生到机器人操控:Android Unity3D下RTMP/RTSP多路低延迟播放实践
android·unity·音视频·unity rtsp播放器·unity rtmp播放器·rtsp player·rtmp player
派葛穆3 小时前
Unity-原生 JsonUtility 实现 JSON 与TMP UI 交互实战
unity
chenzhou__5 小时前
独立游戏开发日志 ①:从信号博弈到涂色对战——一次玩法重构始
笔记·后端·学习·unity·go·独立游戏
五仁烧饼5 小时前
Unity Addressables 资源依赖治理:规则约束、自动修复与全链路防护
java·unity·游戏引擎
qq_3707730920 小时前
Unity游戏xLua逆向实战:从SO版本识别到Lua脚本热替换全链路
游戏·unity·lua
mxwin1 天前
Unity Shader 水面 Shader 教程 从 Gerstner 波浪到屏幕折射、焦散、泡沫的完整实现
unity·游戏引擎
噗噗夹的TA之旅1 天前
Shader 学习 21:自定义 Render Feature
学习·游戏·unity·c#·游戏引擎·图形渲染
zcmodeltech1 天前
化工装置沙盘模型多设备协同控制系统设计:基于STM32与Modbus RTU的装置-流程-安全联动方案
大数据·stm32·嵌入式硬件·安全·unity·制造
暗影凋落2 天前
Unity 射线检测优化:使用 Job System 实现高性能射线批处理
unity·游戏引擎·lucene