Unity——Mirror学习(01)

news2024/9/23 17:17:46

1.下载

Mirror是一个简单高效的开源的unity多人游戏网络框架,Mirror在Unity商店中是免费的,因此直接加入自己的资源库并在导入即可。

官方API地址:https://mirror-networking.gitbook.io/docs

2.使用

1.创建场景的网络管理器

网络管理器是多人游戏的核心控制组件。网络管理器是多人游戏的核心控制组件。

在起始场景中创建一个空游戏对象,然后添加新创建的网络管理器组件。在起始场景中创建一个空游戏对象,然后添加新创建的网络管理器组件。

 注:如果没有获取到kcp transport组件,手动添加。

2.创建一个玩家

建立一个cube作为玩家。

添加networkIdentity作为在网络同步的唯一标识。

 

只有挂载了networkIdentity,网络中枢才能识别到这个物件,并对之进行同步。接下来将Cube作为一个预制体保存,并在场景中删除,后拖拽预制体到网络中枢的Player Prefab插槽中,以后它的产生就完全依靠网络中枢在连接到主机后自动生成。

注:如果角色预制体托不进player prefab栏,可能是没有挂在network identity组件

添加Network Transform,同步网络中联网游戏对象的位置、旋转和缩放。

 Mirror 目前提供2种Network Transform:

  • Reliable:低带宽,与Rpcs/Cmds/等相同的延迟。

  • Unreliable:高带宽,极低延迟

使用Reliable除非需要超低延迟。

 3.添加玩家初始生成位置

创建几个空物体作为玩家的初始生成位置,添加Network Start PositionNetwork,控制玩家的生成位置要控制玩家的生成位置。

根据Network Manager里面Player Spawn Method(玩家生成方法设置):

1.Random:生成为随机(可能相同的生成位置将被两个或更多玩家使用)

2.Round Robin:循环(使用每个可用位置,直到客户端数超过生成点数)。

4.玩家控制

网络同步需要注意的一些事情:

1.需要用到联网功能的脚本中都要添加using Mirror来使用相应API,并且继承NetworkBehaviour而不是MonoBehaviour。

2.涉及到玩家输入时,首先先要进行isLocalPlayer的判断

为控制游戏对象,添加一个脚本为PlayerControl.cs,继承NetworkBehaviour。

Start函数——>重写OnStartLocalPlayer函数。(OnStartLocalPlayer:仅在client执行,当脚本所在物体为玩家角色时调用,用来设置跟踪相机,角色初始化等)

    public override void OnStartLocalPlayer()
    {
        //摄像机与角色绑定
        Camera.main.transform.SetParent(transform);
        Camera.main.transform.localPosition = Vector3.zero;

        //player初始化
        //player 名称的位置,大小
        name.transform.localPosition = new Vector3(0, -0.3f, 0.6f);
        name.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);

        //随机生成颜色和名字
        ChangedColorAndName();
    }

数据同步:

当服务器的场景中的一个SyncVar的值发生变化时,就同步给其它所有客户端。

    //需要把name和颜色同步给其他玩家,添加同步变量的标记[SyncVar(hook=nameof(FunctionExecOnClient))]
    [SyncVar(hook = nameof(OnPlayerNameChanged))]
    private string playerName;
    [SyncVar(hook = nameof(OnPlayerColorChanged))]
    private Color playerColor;

    //申明OnPlayerNameChanged和OnPlayerColorChanged这两个方法
    //第一个变量(oldstr)是同步变量修改前的值,第二个(newstr)是同步变量修改后的值
    private void OnPlayerNameChanged(string oldstr,string newstr)
    {
        nameText.text = newstr;
    }
    private void OnPlayerColorChanged(Color oldCor,Color newCor)
    {
        nameText.color = newCor;

        playerMaterialClone = new Material(GetComponent<Renderer>().material);
        playerMaterialClone.SetColor("_EmissonColir", newCor);

        GetComponent<Renderer>().material = playerMaterialClone;
    }

玩家名字、颜色的变化,以及远程控制:

    /// <summary>
    /// player 的随机名称和颜色
    /// </summary>
    private void ChangedColorAndName()
    {
        //随机名称和颜色
        var tempName = $"Player{Random.Range(1, 999)}";
        var tempColor = new Color(Random.Range(0, 1f), Random.Range(0, 1f), Random.Range(0, 1f), 1);

        //同步变量进行修改
        CmdSetupPlayer(tempName, tempColor);
    }
    //对于同步变量的修改,使用[Command]标记(针对方法的标记,方法名以Cmd开头)
    //通过这个方法同时对name和颜色进行修改
    [Command]
    private void CmdSetupPlayer(string name,Color color)
    {
        playerName = name;
        playerColor = color;
    }

 移动代码:

    private void Update()
    {
        if (!isLocalPlayer) 
        {
            name.transform.LookAt(Camera.main.transform);
            return; 
        }
        var movex = Input.GetAxis("Horizontal") * Time.deltaTime * 110f;
        var movez = Input.GetAxis("Vertical") * Time.deltaTime * 4f;

        transform.Rotate(0, movex, 0);
        transform.Translate(0, 0, movez);

        if (Input.GetKey(KeyCode.Space))
        {
            ChangedColorAndName();
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#,生信软件实践(03)——DNA数据库GenBank格式详解及转为FASTA序列格式的源代码

1 GenBank 1.1 NCBI——美国国家生物技术信息中心&#xff08;美国国立生物技术信息中心&#xff09; NCBI&#xff08;美国国立生物技术信息中心&#xff09;是在NIH的国立医学图书馆&#xff08;NLM&#xff09;的一个分支。它的使命包括四项任务&#xff1a;1. 建立关于分…

Linux操作系统CentOS7安装Nginx[详细版]

Linux操作系统CentOS7安装Nginx[详细版] Nginx安装 1. 官网下载 Nginx 2. 使用 XShell 和 Xftp 将压缩包上传到 Linux 虚拟机中 3. 解压文件 nginx-1.20.2.tar.gz 4. 配置nginx 5. 启动 nginx 6. 拓展&#xff08;修改端口和常用命令&#xff09; &#xff08;一&#xff09;修…

QProgressBar详解

QProgressBar详解 [1] QProgressBar详解1.QProgressBar简述2.常用方法3.示例&#xff0c;比较进度条4.设置样式表 [1] QProgressBar详解 原文链接&#xff1a;https://blog.csdn.net/wzz953200463/article/details/125530997 1.QProgressBar简述 QProgressBar提供了一个水平…

Spark大数据处理讲课笔记3.5 RDD持久化机制

文章目录 零、本讲学习目标一、RDD持久化&#xff08;一&#xff09;引入持久化的必要性&#xff08;二&#xff09;案例演示持久化操作1、RDD的依赖关系图2、不采用持久化操作3、采用持久化操作 二、存储级别&#xff08;一&#xff09;持久化方法的参数&#xff08;二&#x…

docker使用集锦

docker简介 docker是一个软件&#xff0c;作用是在任意安装docker软件的系统上虚拟一个容器&#xff0c;用户可以在容器上构建任何自定义环境。 容器与虚拟机的区别在于&#xff0c;虚拟机需要对硬件也虚拟化&#xff0c;分配给虚拟机一定的资源&#xff0c;包括网卡&#xf…

SpringBoot热部署插件原理分析及实战演练

目录 1、关于热部署&#xff08;Hot Deploy&#xff09;产生的背景 1&#xff09;热部署出现前 2&#xff09;热部署出现后 2、spring-boot-devtools插件原理 1&#xff09;解决变更文件自动加载到JVM中 2&#xff09;spring-boot-devtools重启速度比手动重启快 3、关于…

最优化理论(一)Fibonacci法(python实现)

最优化理论之Fibonacci法(python实现) 纯纯干货 刚过完五一假期&#xff0c;又要回归到课程多还要兼顾每天考研复习的生活的日常了&#xff0c;这不&#xff0c;最优化理论课程又需要编写一些代码&#xff0c;鉴于网上基于python实现的系列算法很杂很散&#xff08;基本没有&…

juc--三大接口

文章目录 juc一、为什么会有juc二、juc--三大接口1.lock2.condition3.ReadWriteLock 二、juc--的默认实现类1.ReentrantLock--lock的默认实现类公平锁,非公平锁 2. ReentrantReadWriteLock读写锁--ReadWriteLock的默认实现类读写锁和排它锁 总结 juc juc: java.util.concurren…

IT行业比较吃香的技能有哪些?

前言 在互联网IT行业中&#xff0c;虽然只有短短几十年时间&#xff0c;但是技术革新一直都在&#xff0c;而且各类前沿技术层出不穷&#xff0c;不断迭代和创新。作为一个程序员&#xff0c;在互联网行业竞争很激烈的当下&#xff0c;更应该通过学习来应对日新月异的前沿技术。…

【IDEA Sprintboot】简单入门:整合SpringSecurity依赖、整合Thymeleaf框架

目录&#xff1a; 1、【IDEA】简单入门&#xff1a;请求数据库表数据_水w的博客-CSDN博客 目录 三、 1、整合SpringSecurity依赖 2、整合Thymeleaf框架 解决css样式等静态资源访问不到的问题 三、 1、整合SpringSecurity依赖 Spring Security是一个能够为基于Spring的企业…

正则表达式学习贴

1. 前言 1.1 为什么要学习正则表达式 1.1.1 极速体验正则表达式威力 /*** 体验正则表达式的威力&#xff0c;给我们文本处理带来哪些便利*/ public class Regexp_ {public static void main(String[] args) {//假定&#xff0c;编写了爬虫&#xff0c;从百度页面得到如下文本…

网络计算模式复习(二)

网格 由于B/S架构管理软件只安装在服务器端上&#xff0c;网络管理人员只需要管理服务器就行了&#xff0c;用户界面主要事务逻辑在服务器端完全通过WWW浏览器实现&#xff0c;极少部分事务逻辑在前端&#xff08;Browser&#xff09;实现&#xff0c;所有的客户端只有浏览器&…

李沐深度学习环境安装(包括pytorch和d2l)

李沐深度学习环境安装&#xff08;包括pytorch和d2l&#xff09; 目录一、安装Anaconda3二、安装GPU版本的pytorch三、使用jupyter notebook运行李沐书籍的源码 目录 一、安装Anaconda3 进入Anaconda官网下载&#xff1a;https://www.anaconda.com/distribution/ 安装细节不在…

小程序上车,车载小程序的信息安全是否可靠?

随着智能交通和车联网技术的快速发展&#xff0c;越来越多的车载应用程序&#xff08;APP&#xff09;进入人们的视野&#xff0c;从而推动了车载业务生态的不断发展。然而&#xff0c;车载应用程序的安全问题也引起了人们的广泛关注。为此&#xff0c;小程序容器技术作为一种有…

centos7.5 从0-1安装mysql以及基本的增删改查

系列文章目录 文章目录 系列文章目录前言一、mysql安装二、mysql客户端操作总结 前言 MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。 什么是…

Kubernetes(K8S)的基础概念

目录 1.Kubernetes介绍 1. 什么是Kubernetes&#xff1f; 2.为什么要用K8S? 3.k8s的特性 2.k8s集群架构与组件 1.Master组件 2.配置存储中心 — etcd 3.Node组件 3.Kubernetes 核心概念 1.Pod 2.Pod 控制器 3.Label 4.Label 选择器&#xff08;Label selector&am…

21.面向削峰填谷的电动汽车多目标优化调度策略

说明书 MATLAB代码&#xff1a;面向削峰填谷的电动汽车多目标优化调度策略 关键词&#xff1a;电动汽车 削峰填谷 多目标 充放电优化 参考文档&#xff1a;店主自己整理的说明文档&#xff0c;公式、约束、数据齐全&#xff0c;可联系我查看 仿真平台&#xff1a;MATLAB YA…

java单链表反转

我们都知道在 Java中&#xff0c;如果要创建一个对象&#xff0c;我们可以通过创建一个空的对象来实现。如果创建一个空的对象&#xff0c;我们会很容易实现&#xff0c;但是如果创建一个链表的话&#xff0c;我们就需要利用到反链表技术。 在 Java中&#xff0c;反转链表有两种…

解锁音视频开发技巧,投身新时代的互联网浪潮

前言 音视频应用范围广泛&#xff0c;涵盖了许多不同的领域和行业。下面列出一些常见的音视频应用&#xff1a; 通信&#xff1a;音视频通讯是当今普遍使用的一种方式&#xff0c;包括互联网电话、视频会议、视频聊天应用等。娱乐&#xff1a;音视频内容在娱乐行业中应用广泛…

五一去淄博只撸串?用VR云游看看隔壁这个的宝藏地

卷饼、小葱、烤肉串…… 最近的淄博真是火出圈了 全网刷屏 吸引了全国各地网友的味蕾 有多少人铆足了劲 准备趁着五一小长假“进淄赶烤”的&#xff1f; 五一山东行&#xff0c; 当然不能只“炫”一顿烧烤 美食美景不止淄博 在淄博隔壁&#xff0c;还有这么一座宝藏城市…