Unity多人游戏报错:UnityTransport未找到且脚本无法挂载
Unity多人游戏开发问题:UnityTransport找不到 + 脚本无法挂载
问题现象
- 完成多人功能初步开发后,出现找不到UnityTransport类型或命名空间的编译错误
- 尝试修复后,又出现所有相关脚本无法挂载到任意GameObject的问题,编辑器提示未包含MonoBehaviour或名称不匹配
相关脚本
1. Player.cs
using System.Collections; using System.Collections.Generic; using Unity.Netcode; using UnityEngine; public class Player : NetworkBehaviour { private Rigidbody playerRb; public float speed; void Start() { playerRb = GetComponent<Rigidbody>(); } void Update() { if (!IsOwner) { return; } float forwInput = Input.GetAxis("Vertical"); float horzInput = Input.GetAxis("Horizontal"); Vector3 direction = Vector3.forward * forwInput + Vector3.right * horzInput; if (direction.magnitude > 1) { direction.Normalize(); } MoveServerRpc(direction); } [ServerRpc] void MoveServerRpc(Vector3 direction) { playerRb.AddForce(direction * speed); } }
2. PlayerNetwork.cs
using System.Collections; using System.Collections; using UnityEngine; using Unity.Netcode; using Unity.Netcode.Transports.UTP; [System.Serializable] public struct PlayerNetworkState : INetworkSerializable { public Vector3 Position; public Vector3 Rotation; public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter { serializer.SerializeValue(ref Position); serializer.SerializeValue(ref Rotation); } } public class PlayerNetwork : NetworkBehaviour { [SerializeField] private bool usingServerAuth; private NetworkVariable<PlayerNetworkState> playerState; private Rigidbody playerRb; private void Awake() { playerRb = GetComponent<Rigidbody>(); var permission = usingServerAuth ? NetworkVariableWritePermission.Server : NetworkVariableWritePermission.Owner; playerState = new NetworkVariable<PlayerNetworkState>(new PlayerNetworkState {Position = Vector3.zero, Rotation = Vector3.zero}, NetworkVariableReadPermission.Everyone, permission); } public override void OnNetworkSpawn() { if (!IsOwner) Destroy(transform.GetComponent<Player>()); } private void Update() { if (IsOwner) TransmitState(); else ConsumeState(); } #region Transmit State private void TransmitState() { var state = new PlayerNetworkState { Position = playerRb.position, Rotation = transform.rotation.eulerAngles }; if (IsServer || !usingServerAuth) { playerState.Value = state; } else { TransmitStateServerRpc(state); } } [ServerRpc(RequireOwnership = false)] private void TransmitStateServerRpc(PlayerNetworkState state) { playerState.Value = state; } #endregion #region Consume State private void ConsumeState() { transform.position = playerState.Value.Position; transform.rotation = Quaternion.Euler(playerState.Value.Rotation); } #endregion }
3. NetworkButtons.cs
using System.Collections; using System.Collections.Generic; using Unity.Netcode; using UnityEngine; public class NetworkButtons : MonoBehaviour { void OnGUI() { GUILayout.BeginArea(new Rect(10,10,300,300)); if (!NetworkManager.Singleton.IsClient && !NetworkManager.Singleton.IsServer) { if (GUILayout.Button("Host")) NetworkManager.Singleton.StartHost(); if (GUILayout.Button("Server")) NetworkManager.Singleton.StartServer(); if (GUILayout.Button("Client")) NetworkManager.Singleton.StartClient(); } GUILayout.EndArea(); } private void OnAwake() { GetComponent<UnityTransport>().SetDebugSimulatorParameters( packetDelay: 120, packetJitter: 5, dropRate: 3); } }
已尝试的操作
- 将Netcode for GameObjects更新至1.5.2版本,Unity Transport更新至2.3.0版本
- 在需要的脚本中已引入
Unity.Netcode.Transports.UTP命名空间 - 另外两个从其他项目导入的脚本在原项目中可正常运行,本人为开发新手,暂无相关经验
内容的提问来源于stack exchange,提问作者Bobcat
相关产品推荐
相关产品推荐

