【发布时间】: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