【问题标题】:Unity Netcode (MLAPI) Host Moving And Client Connecting, But Client Not MovingUnity Netcode (MLAPI) 主机移动和客户端连接,但客户端不移动
【发布时间】:2021-11-09 18:54:14
【问题描述】:

最近开始使用 Unity Netcode (MLAPI) 尝试制作多人赛车游戏,但遇到了一些麻烦。这是我第一次制作多人游戏,所以我对这些东西还很陌生。

发生了什么: 客户端完美地连接到主机,车轮像汽车一样移动,但客户端根本无法移动。主机可以很好地移动,并且能够与客户端发生碰撞,并且客户端可以查看所有内容,但客户端只是没有移动。我认为这与 NetworkTransforms 有关,但我现在真的不确定。

以下是我附加的车辆移动脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Netcode;

public class VehicleMovement : NetworkBehaviour
{
    private const string HORIZONTAL = "Horizontal";
    private const string VERTICAL = "Vertical";

    private float horizontalInput;
    private float verticalInput;
    private float currentSteerAngle;
    private bool isBraking;
    private float currentBrakeForce;

    [SerializeField] private float motorForce;
    [SerializeField] private float brakeForce;
    [SerializeField] private float maxSteeringAngle;

    [SerializeField] private WheelCollider frontLeftWheelCollider;
    [SerializeField] private WheelCollider frontRightWheelCollider;
    [SerializeField] private WheelCollider rearLeftWheelCollider;
    [SerializeField] private WheelCollider rearRightWheelCollider;

    [SerializeField] private Transform frontLeftWheelTransform;
    [SerializeField] private Transform frontRightWheelTransform;
    [SerializeField] private Transform rearLeftWheelTransform;
    [SerializeField] private Transform rearRightWheelTransform;
    private void FixedUpdate()
    {
        if (IsLocalPlayer)
        {
            GetInput();
            HandleMotor();
            HandleSteering();
            UpdateWheels();
        }
    }

    private void HandleMotor()
    {
        frontLeftWheelCollider.motorTorque = verticalInput * motorForce;
        frontRightWheelCollider.motorTorque = verticalInput * motorForce;
        currentBrakeForce = isBraking ? brakeForce : 0f;
        ApplyBraking();
    }

    private void ApplyBraking()
    {
        frontRightWheelCollider.brakeTorque = currentBrakeForce;
        frontLeftWheelCollider.brakeTorque = currentBrakeForce;
        rearRightWheelCollider.brakeTorque = currentBrakeForce;
        rearLeftWheelCollider.brakeTorque = currentBrakeForce;
    }

    private void HandleSteering()
    {
        currentSteerAngle = maxSteeringAngle * horizontalInput;
        frontLeftWheelCollider.steerAngle = currentSteerAngle;
        frontRightWheelCollider.steerAngle = currentSteerAngle;
    }
    private void GetInput()
    {
        horizontalInput = Input.GetAxis(HORIZONTAL);
        verticalInput = Input.GetAxis(VERTICAL);
        isBraking = Input.GetKey(KeyCode.Space);
    }

    private void UpdateWheels()
    {
        UpdateSingleWheel(frontLeftWheelCollider, frontLeftWheelTransform);
        UpdateSingleWheel(frontRightWheelCollider, frontRightWheelTransform);
        UpdateSingleWheel(rearLeftWheelCollider, rearLeftWheelTransform);
        UpdateSingleWheel(rearRightWheelCollider, rearRightWheelTransform);

    }

    private void UpdateSingleWheel(WheelCollider wheelCollider, Transform wheelTransform)
    {
        Vector3 pos;
        Quaternion rot;
        wheelCollider.GetWorldPose(out pos, out rot);
        wheelTransform.rotation = rot;
        wheelTransform.position = pos;
    }
}

我的预制件由 Transform、Rigidbody、[上面的脚本]、NetworkObject、NetworkTransform 和 NetworkRigidbody 组成。

Here 是一个不公开的 YouTube 视频,希望能直观地显示问题。

任何和所有的帮助将不胜感激!谢谢!

【问题讨论】:

  • 一般来说,如果您使用物理,则根本不要通过Transform 设置任何东西,而只能通过刚体进行设置,在这种情况下,您只希望同步刚体,而不是直接进行变换
  • 那么你会说我需要将我的变换修改为刚体吗?

标签: c# unity3d multiplayer


【解决方案1】:

原来在包管理器下有一个可选的导入“游戏对象的网络代码”隐藏在“样本”下,称为“客户端网络转换”。

这完全解决了问题。

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多