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

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

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

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

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

相关推荐
zhchyun200812 小时前
【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(05)
ui·unity·游戏引擎
_ZHOURUI_H_15 小时前
不做完整 ECS,只优化数据布局:Unity EasyECS 到底是什么
unity·性能优化·游戏引擎
郝学胜-神的一滴2 天前
Horse3D 游戏引擎研发笔记(七):Clydesdale——从流式日志到多输出订阅
c++·qt·unity·游戏引擎·图形渲染·unreal engine·opengl
江上闲人.2 天前
Wardogs战犬\战狗Beta测试启动报错UE崩溃卡顿?解决方法来了
游戏·游戏引擎·虚幻·战犬·战狗·wardogs
小贺儿开发3 天前
Unity 程序员编曲花絮:汪峰《河流》细节修复
科技·学习·unity·程序员·音乐·demo·写代码
598866753@qq.com3 天前
Unity UniText笔记
unity·unitext
杨丰玮4183 天前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(五)
java·python·游戏·游戏引擎·图形渲染·动画·贴图
鼎艺创新科技3 天前
不依赖 UE/Unity:我们如何从零搭建一套国产三维 GIS 渲染引擎
人工智能·算法·unity·游戏引擎·三维电子沙盘
huihui3613 天前
校友网管理软件技术选型框架:基于功能核验与系统架构的量化评估
unity·系统架构·游戏引擎