当前位置: 首页 > article >正文

Unity之NetCode多人网络游戏联机对战教程(10)--玩家动画同步

文章目录

    • 前言
    • NetworkAnimation
    • 服务端权威
    • 客户端权威

前言

这次的动画同步与位置同步,可以说实现思路是一样的,代码相似度也非常高

NetworkAnimation

如果直接挂载这个脚本只有Host(服务端)才可以同步,Client是没有权限同步的。


服务端权威

直接修改之前的PlayerSync.cs脚本。

using Unity.Netcode;
using UnityEngine;

public class PlayerSync : NetworkBehaviour
{
    private NetworkVariable<Vector3> _syncPos = new();
    private NetworkVariable<Quaternion> _syncRota = new();
    private Transform _syncTransform;
    private NetworkVariable<bool> _syncisIdle = new();
    private NetworkVariable<bool> _syncisRun = new();
    private Animator _syncAnimator;

    public void SetTarget(Transform player)
    {
        _syncTransform = player;
        _syncAnimator = player.GetComponent<Animator>();
    }

    private void Update()
    {
        if (IsLocalPlayer)
        {
            UploadTransform();
            UploadAnimation();
        }
    }

    private void FixedUpdate()
    {
        if (!IsLocalPlayer)
        {
            SyncTransform();
            SyncAnimation();
        }
    }

    private void SyncTransform()
    {
        _syncTransform.position = _syncPos.Value;
        _syncTransform.rotation = _syncRota.Value;
    }

    private void SyncAnimation()
    {
        _syncAnimator.SetBool("isIdle", _syncisIdle.Value);
        _syncAnimator.SetBool("isRun", _syncisRun.Value);
    }

    private void UploadTransform()
    {
        if (IsServer)
        {
            _syncPos.Value = _syncTransform.position;
            _syncRota.Value = _syncTransform.rotation;
        }
        else
        {
            UploadTransformServerRpc(_syncTransform.position, _syncTransform.rotation);
        }
    }

    [ServerRpc]
    private void UploadTransformServerRpc(Vector3 position, Quaternion rotation)
    {
        _syncPos.Value = position;
        _syncRota.Value = rotation;
    }

    private void UploadAnimation()
    {
        if (IsServer)
        {
            _syncisIdle.Value = _syncAnimator.GetBool("isIdle");
            _syncisRun.Value = _syncAnimator.GetBool("isRun");
        }
        else
        {
            UploadAnimationServerRpc();
        }
    }

    [ServerRpc]
    private void UploadAnimationServerRpc()
    {
        _syncisIdle.Value = _syncAnimator.GetBool("isIdle");
        _syncisRun.Value = _syncAnimator.GetBool("isRun");
    }
}


客户端权威

写个OwnerNetworkAnimator.cs挂载到角色身上即可

using Unity.Netcode.Components;

public class OwnerNetworkAnimator : NetworkAnimator
{
    protected override bool OnIsServerAuthoritative()
    {
        return false;
    }
}

脚本的Animator直接把角色拖进去即可读取。


http://www.kler.cn/a/146985.html

相关文章:

  • VMware 中 虚拟机【Linux系统】固定 ip 访问
  • 鸿蒙网络编程系列48-仓颉版UDP回声服务器示例
  • 如何使用正则表达式验证域名
  • vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果
  • 【HarmonyOS】鸿蒙系统在租房项目中的项目实战(二)
  • [241115] Debian 12.8 发布 | Mistral AI 推出批量 API,成本降低 50%
  • LabVIEW当鼠标悬停在图形曲线上时显示坐标
  • 蓝桥杯每日一题2023.11.26
  • 一个C++ string使用问题的分析及解决
  • Junos webauth_operation.php 文件上传漏洞复现(CVE-2023-36844)
  • yolov5检测(前向)输入视频输出(不在图上画标签形式的原)图片的方法,及设置每隔几帧保存的方式(不每帧保存减少重复)
  • HCIA-RS基础-RIP路由协议
  • 如何将mobi、awz3、epub格式转化为pdf
  • 一体化污水处理设备各种材质的优缺点
  • 排序篇(六)----排序小结(不用三连,混流量券)
  • 五、双向NAT
  • SAP创建ODATA服务-Structure
  • 什么是面向对象编程及面向过程编程,它们的异同和优缺点
  • 快速开发出一个公司网站
  • ES开启安全认证
  • 初识前后端数据交互(新手篇)
  • Nginx如何配置负载均衡
  • 《100 Java Mistakes and How to Avoid Them》笔记 2
  • 2023 极术通讯-Arm 发布合作产品Cortex-M52,专为AIoT应用设计
  • 利用STM32和蓝牙模块构建智能物联网设备的开发指南
  • laravel 重写批量添加,自动维护时间戳