Unity使用Mirror制作局域网的同步
1.脚本布置.参考tank那个demo制作
1.新建空物体,为管理脚本的物体:manager,挂载NetworkManager,kcpTransport,NetworkManagerHud.
2.设置玩家出生点,spawnPoint,设置好初始化的position的位置(*),挂载NetworkStartPosition的脚本
3.新建Player的预制体,挂载NetworkIdentity,NetworkTransform(unreliable)的脚本,还有自己的自定义脚本,注意自定义脚本需要继承NetworkBehaviour,这个在编辑的时候需要改改.下面是主玩家的移动代码MainPlayerControll.cs.
4.新建turret的预制体,挂载rigibody, NetworkIdentity, TurretMove,“rigibody需要关闭重力”.
using Mirror;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;public class MainPlayerControll : NetworkBehaviour
{public float speed = 5;public float Rspeed = 25;public GameObject turretPrefab;public Transform firepoint;[SyncVar] public int health = 10;int lastHealth = 0;public TextMesh nameTxt;public override void OnStartLocalPlayer(){base.OnStartLocalPlayer();Camera.main.transform.SetParent(transform);Camera.main.transform.localPosition = new Vector3(0, 0.5f, 0);Camera.main.transform.localRotation = Quaternion.identity;}public override void OnStopLocalPlayer(){base.OnStopLocalPlayer();Camera.main.transform.SetParent(null);}void Update(){if (health != lastHealth){nameTxt.text = $"{gameObject.name} <color=red>{health}</color>";lastHealth = health;}if (!isLocalPlayer) return;float horizontalInput = Input.GetAxis("Horizontal");float verticalInput = Input.GetAxis("Vertical");Vector3 movement = transform.forward * verticalInput * speed * Time.deltaTime;Vector3 rotation = new Vector3(0f, horizontalInput * Rspeed * Time.deltaTime, 0f);transform.Translate(movement, Space.World);transform.Rotate(rotation);if (Input.GetKeyDown(KeyCode.Space)){CmdFire();}}[Command]void CmdFire(){GameObject projectile = Instantiate(turretPrefab, firepoint.position, firepoint.rotation);NetworkServer.Spawn(projectile);}[ServerCallback]void OnTriggerEnter(Collider other){if (other.GetComponent<TurretMove>() != null){--health;if (health == 0)NetworkServer.Destroy(gameObject);}}
}
using Mirror;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;public class TurretMove : NetworkBehaviour
{public float destroyAfter = 2;public Rigidbody rigidBody;public float force = 1000;public override void OnStartServer(){Invoke(nameof(DestroySelf), destroyAfter);}void Start(){rigidBody.AddForce(transform.forward * force);}// destroy for everyone on the server[Server]void DestroySelf(){NetworkServer.Destroy(gameObject);}[ServerCallback]void OnTriggerEnter(Collider co) => DestroySelf();
}
2.注意:在manager的NetworkManager中,需要给PlayerPrefab赋值,拖入制作的player预制体,transport中拖入同物体的kcpTransport组件.playerspawnMethod选择RoundRobin.
player预制体的MainPlayerControll脚本需要拖入子弹的预制体,还要拖入一个开火点,开火点:就是创建一个空物体放在player上作为开火点.
子弹只需要把自己的的rigibody拖进去到TurretMode.cs脚本里
主玩家脚本里的广播的字段 需要这样声明写 [SyncVar] public int health = 10;
一些被动碰撞,触发的方法也要加上 [ServerCallback]
[ServerCallback]void OnTriggerEnter(Collider other){if (other.GetComponent<TurretMove>() != null){--health;if (health == 0)NetworkServer.Destroy(gameObject);}}
主动触发 如开火:需要加 [Command]
[Command]void CmdFire(){GameObject projectile = Instantiate(turretPrefab, firepoint.position, firepoint.rotation);NetworkServer.Spawn(projectile);}
总结:
[Command]:用于在客户端调用服务器上的方法。客户端可以使用该标记调用服务器上的方法,并将其作为命令进行处理。方法名称必须以 “Cmd” 开头。
[ClientRpc]:用于在服务器上调用并在所有连接的客户端上执行的方法。服务器可以使用该标记调用方法,并在所有连接的客户端上执行。方法名称可以任意命名。
[TargetRpc]:用于在服务器上调用并在特定客户端上执行的方法。服务器可以使用该标记调用方法,并在特定的客户端上执行。方法名称可以任意命名。
[ServerCallback]:用于指示方法只在服务器上执行,不在客户端上执行。该标记用于在服务器上定义特定逻辑或处理服务器端的事件。方法名称可以任意命名。
注意事项:
[Command]、[ClientRpc] 和 [TargetRpc] 方法必须在继承自 NetworkBehaviour 的脚本中使用,并且需要正确配置网络连接和同步设置。
[Command] 方法只能从客户端调用,并且只在服务器上执行。
[ClientRpc] 方法只能在服务器上调用,并在所有连接的客户端上执行。
[TargetRpc] 方法只能在服务器上调用,并且只在特定的客户端上执行。
[ServerCallback] 方法只在服务器上执行,不在客户端上执行。
方法开头规则:
[Command] 标记的方法名称必须以 “Cmd” 开头。
[ClientRpc]、[TargetRpc] 和 [ServerCallback] 标记的方法名称可以任意命名。
相关文章:
Unity使用Mirror制作局域网的同步
1.脚本布置.参考tank那个demo制作 1.新建空物体,为管理脚本的物体:manager,挂载NetworkManager,kcpTransport,NetworkManagerHud. 2.设置玩家出生点,spawnPoint,设置好初始化的position的位置(*),挂载NetworkStartPosition的脚本 3.新建Player的预制体,挂载NetworkIdentity,Ne…...
算法 N皇后问题-(递归回溯)
牛客网 BM59. 解题思路: 行列、斜叉不在一条直线上。 命令行为 row, 列为col, row 从0开始递归直到最后一行,列从0开始遍历,直到最后一列,中间每一步记录或清除位置状态,状态分为 m1[col] 1, m2[row-col] 1, m3[r…...
个人博客搭建记录
个人博客地址:www.jiasun.top 使用github pagehexo搭建,主题为fluid,搭建步骤参照:Github hexo 实现自己的个人博客、配置主题(超详细) 主题:https://hexo.fluid-dev.com/ 搭建时的问题&…...
下载vscode 更新
将下载地址的主地址加入一下镜像网址 http://vscode.cdn.azure.cn下面是访问页面 http://vscode.cdn.azure.cn/stable/abd2f3db4bdb28f9e95536dfa84d8479f1eb312d/VSCodeUserSetup-x64-1.82.2.exe...
std::async简单使用
std::async介绍并使用 std::async是C11引入的一个用于异步执行函数或函数对象的工具。它可以用于并行地执行函数,并在需要时获取函数的返回值。下面是一个简单的示例,演示了如何使用std::async: #include <iostream> #include <fu…...
【编程实践】在VS studio中配置Eigen库
1 介绍 Eigen库是C标准模板库,能够进行向量运算、矩阵运算、矢量运算、数值分析等操作,并且包含相应的运算算法。 Eigen官方地址: 地址 可在官网下载指定版本的压缩包,将压缩包解压至后面配置的“附件包含目录”中。 2 配置 2.1 VS studi…...
SQLite 3.43 发布,性能大提升!
前言 SQLite是一种被广泛运用的嵌入式关系型数据库管理系统,最新发布的SQLite 3.43版本带来了一个重要的改进,大幅提升了对JSON数据的处理性能,达到了之前的两倍。 主要更新 添加对 Contentless-Delete FTS5 索引的支持。这是 FTS5 全文搜索…...
数据中心液冷服务器详情说明
目录 前言 何为液冷服务器? 为什么需要液冷? 1.数据中心降低PUE的需求 2.政策导向 3.芯片热功率已经达到风冷散热极限 4.液冷比热远大于空气 液冷VS风冷,区别在哪? 1.液冷服务器跟风冷服务器的区别 2.液冷数据中心跟风冷…...
Openresty(二十二)ngx.balance和balance_by_lua终结篇
一 灰度发布铺垫 ① init_by_lua* init_by_lua init_by_lua_block 特点: 在openresty start、reload、restart时执行,属于master init 阶段机制: nginx master 主进程加载配置文件时,运行全局Lua VM级别上的参数指定的Lua代码场景: …...
Docker注入环境变量且设置多个环境变量
方式一 运行docker命令修改 在运行docker时,直接使用-e或–env,输入需要改变的变量 例如:springboot配置文件如下,可注入环境变量启动端口SERVER_PORT,以及启动配置文件NODE_ENV:dev server:port: ${SERVER_PORT:8400} spring…...
代码随想录二刷Day 15
102. Binary Tree Level Order Traversal vector<int>() it is basically constructor of std::vector class and will create a new empty vector. You can also mention the size of required vector in brackets. 访问二维vector的元素: 如果指定外层和内层向量的大…...
Node.js环境安装与服务设置,结合内网穿透随时随地公网访问!
文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation࿰…...
八、数据类型转换
数据类型转换 1.数据类型转换1.1.隐式类型转换1.2.显式类型转换1.3.训练11.4.训练2 —————————————————————————————————————————————————— 1.数据类型转换 类型转换是将一个值从一种类型更改为另一种类型的过程。例如&…...
2023数学建模研赛华为杯E题思路-出血性脑卒中临床智能诊疗建模
E 题 出血性脑卒中临床智能诊疗建模 三、请建模回答如下问题 1血肿扩张风险相关因素探索建模。 a)请根据“表1”(字段:入院首次影像检查流水号,发病到首次影像检查时间间隔),“表2”(字段:各时…...
Windows Server 2012 R2系统远程桌面的数字证书算法SHA1升级到SHA256
问题描述: 最近项目进行密评的时候,Windows Server 2012 R2发现了以下证书问题: Windows Server 2012 R2系统远程桌面的TLS 1.2协议使用SHA1算法数字证书,且证书有效日期截止23年10月,建议注意证书到期时间ÿ…...
windows进程管理相关命令
windows进程管理相关命令 根据进程名找到进程 例如python进程 PS C:\Users\27467> tasklist | findstr python python.exe 7088 Console 2 3,364 K python.exe 1580 Console 2 41,…...
Flutter快速入门学习(一)
目录 前言 新建项目 项目入口 Dart的入口(项目的入口) 布局 视图组件 Container(容器) Text(文本) Image(图片) Row(水平布局)和Column(…...
网站排名下降的原因和解决方法(SEO优化失误可能导致网站排名下降)
SEO优化是网站推广的重要环节,它可以提升网站的访问量和排名。但是,SEO优化不当也可能会导致网站排名下降。本文将分析SEO优化失误可能导致网站排名下降的原因,并提供相应的解决方法。 一:标题——SEO优化过度 SEO优化的目的是为…...
爱看小说手机网源码全站带数据带自动采集程序/ThinkPHP内核小说网站源码+书库数据库带自动采集
爱看小说手机网源码全站带数据带自动采集程序,爱看小说程序源码2W条数据全站打包,自动采集程序网站源码,后台已经更新5个采集规则可以采集小说30万本大概约10G。 分享的这一款自带2w数据爱看小说网源码全站带数据打包,ThinkPHP内核小说网站源码带听书等全部插件&am…...
《Java8实战》
《Java实战》学习整理 文章目录 一、Lambda1.1 基础概念1.1.1 [Lambda表达式](https://baike.baidu.com/item/Lambda表达式/4585794?fromModulelemma_inlink)定义 1.2 引入Lambda1.3 Lambda1.3.1 函数式接口1.3.2 Lambda表达式:(参数) -> 表达式1.3.3 在哪里使…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
