Unity使用Mirror制作局域网的同步

这篇具有很好参考价值的文章主要介绍了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,unity文章来源地址https://www.toymoban.com/news/detail-850706.html

到了这里,关于Unity使用Mirror制作局域网的同步的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ubuntu系统安装chrony时间同步服务(局域网集群内同步)

    Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP)同步,因此让你的计算机保持精确的时间,Chrony也可以作为服务端软件为其他计算机提供时间同步服务。 Chrony由两个程序组成,分别是chronyd和chronyc chronyd是一个

    2024年02月08日
    浏览(32)
  • ubuntu使用ssh进行局域网和非局域网远程连接

           当想要用一台电脑远程连接另一台linux主机电脑时,可能会遇到不少问题,可分为局域网远程连接和非局域网远程连接。当让主机A远程连接主机B时,可以将主机A看为客户端,主机B看为服务器。我们需要对主机B进行一些允许远程连接的配置。        主机A与主机

    2024年02月08日
    浏览(32)
  • 局域网ntp服务器设置(windows时间同步服务器NetTime)(ubuntu systemd-timesyncd ntp客户端)123端口、ntp校时、ntp同步

    客户有个局域网,局域网里面有的设备,时间都不一致,导致交互的时候可能出现问题; 现在刚好有台主机,有两个以太网接口,其中一个可以连外网,能获取到网络时间,我们可以把这台主机做成ntp服务器,供局域网内其他主机做时间同步; 以下是相关操作方法步骤; 打

    2024年02月04日
    浏览(41)
  • 使用wireguard组建虚拟局域网

    创建个目录用于挂载docker 使用docker启动wg-easy 云厂商控制台的安全组/防火墙开启以下两端口 浏览器访问 http://服务端ip或域名:51821 ,创建配置并下载 安装wireguard 编辑 /etc/wireguard/wg0.conf 文件,将下载的配置内容拷贝进去 启动 停止 开机自启 取消开机自启 windows、mac、linux、安

    2024年02月13日
    浏览(62)
  • 局域网使用远程控制技巧图文详解

    局域网怎么远程控制对于新手来说是个难题,网上也很多方法教局域网怎么远程控制的,但大多都不是很实用,所以笔者在此献上经验,让网友真实解决局域网怎么远程控制问题,局域网内电脑远程控制,可以令网管或管理者的工作变的异常轻松。下文将主要介绍网络人局域

    2024年02月06日
    浏览(37)
  • 局域网搭建SSL,使用HTTPS服务教程

    1.1 .csr(证书请求文件) .csr 是证书请求文件(certificate signing request),是由 RFC 2986定义的PKCS10格式,包含部分/全部的请求证书的信息,比如,主题, 机构,国家等,并且包含了请求证书的公玥,这些被CA中心签名后返回一张证书。返回的证书是公钥证书(只包含公玥不含私钥)

    2024年02月02日
    浏览(29)
  • [保姆级]使用SoftEther搭建异地局域网(windows)

    最近在跟小伙伴进行一个前后端分离开发的项目(在各自家中进行), 但是我们都不在一个局域网, 那么怎么办呢? 当然是搭建自己的虚拟局域网啦! SoftEther 是什么? 该软件是一个能虚拟网卡和集线器(HUB)的工具,只要可以访问互联网,都可以使用它来组建远程局域网。-----百度

    2024年03月11日
    浏览(39)
  • Kali使用Netdiscover探测局域网中存活主机

    1、netdiscover介绍 Netdiscover 是一个主动/被动的ARP 侦查工具。使用Netdiscover工具可以在网络上扫描IP地址,检查在线主机或搜索为它们发送的ARP请求。 2、 主动模式:主动模式顾名思义就是主动的探测发现网络内主机,但是这种方式往往会引起网络管理员的注意。 打开Kali终端,使用

    2024年02月02日
    浏览(55)
  • 局域网ntp服务器设置(windows时间同步服务器NetTime)(ubuntu systemd-timesyncd ntp客户端)123端口、ntp校时、ntp同步(123端口UDP入站流量)

    客户有个局域网,局域网里面有的设备,时间都不一致,导致交互的时候可能出现问题; 现在刚好有台主机,有两个以太网接口,其中一个可以连外网,能获取到网络时间,我们可以把这台主机做成ntp服务器,供局域网内其他主机做时间同步; 以下是相关操作方法步骤; 打

    2024年01月23日
    浏览(39)
  • 使用ENSP完成虚拟局域网(VLAN)配置 的实验

            本实验模拟企业网络场景。公司内网是一个大的局域网,二层交换机LSW1放置在一 楼,在一楼办公的部门有市场部和技术部;二层交换机LSW2放置在二楼,在二楼办公的部门有市场部和人事部。由于交换机组成的是一个广播网,交换机连接的所有主机都能互相通信,

    2023年04月25日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包