Есть также сценарий Player Network, который я обычно отключаю, потому что он мне сейчас не нужен. Однако, когда я пытаюсь включить его, когда клиент появляется, скрипты по-прежнему отсутствуют, но я также получаю эти две ошибки:
[Netcode] NetworkBehaviour index 3 был вне границы для Player(Clone). NetworkBehaviours должно быть одинаковым и в одном и том же порядке на сервере и клиенте.
и
[Netcode] Сообщение о разнице сетевой переменной, полученное для несуществующее поведение. NetworkObjectId: 2, NetworkBehaviourIndex: 3
За этими ошибками следует еще текст, который, как я полагаю, указывает на источник возникновения ошибок, но они являются частью некоторых включенных скриптов или функций. я думаю в пакете Netcode? Дайте мне знать, если вам нужны полные ошибки.
Возможно, это не связано с моей первой проблемой, но, вероятно, показывает, что сценарий PlayerNetwork также не работает. Честно говоря, при его создании я следовал руководству и мало что из него понимаю.
Вот скрипты:
Игрок:
Код: Выделить всё
using System.Collections;
using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;
public class Player : NetworkBehaviour
{
private Rigidbody playerRb;
public GameObject camHolderPrfb;
public GameObject camHolder;
public float speed;
public float jumpForce;
public float gravityMod;
private bool onGround = true;
void Start()
{
camHolder = Instantiate(camHolderPrfb, transform.position, Quaternion.identity);
playerRb = GetComponent();
Physics.gravity *= gravityMod;
}
void Update()
{
//Makes sure player can only control its character
if (!IsOwner) {enabled = false;}
//Calculates player movement
float forwInput = Input.GetAxis("Vertical");
float horzInput = Input.GetAxis("Horizontal");
Vector3 direction = camHolder.transform.forward * forwInput + camHolder.transform.right * horzInput;
//Applies movement to player
if (direction.magnitude > 1) {direction.Normalize();}
playerRb.AddForce(direction * speed);
//Allows player to jump
if(Input.GetKeyDown(KeyCode.Space) && onGround) {
onGround = false;
playerRb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
//Ensures player can only jump if it's touching the ground
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Ground")) {
onGround = true;
}
}
}
Код: Выделить всё
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using Unity.Netcode;
public class CamController : NetworkBehaviour
{
public float rotationSpeed;
public float lerpSpeed;
public GameObject camHolder;
private Camera playerCamComp;
private GameObject playerCam;
public Player PlayerScr;
void Start()
{
camHolder = PlayerScr.camHolder;
playerCamComp = camHolder.GetComponentInChildren();
playerCam = playerCamComp.gameObject;
}
void FixedUpdate()
{
//Camera is rotatable with left and right keys
float camInput = Input.GetAxis("MoveCam");
camHolder.transform.Rotate(Vector3.up, camInput * Time.deltaTime * rotationSpeed);
//Camera moves and looks at the player
camHolder.transform.position = Vector3.Lerp(camHolder.transform.position, transform.position, lerpSpeed * Time.deltaTime);
playerCam.transform.LookAt(this.transform);
}
}
Код: Выделить всё
using System.Collections;
using System.Collections.Generic;
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(BufferSerializer serializer) where T : IReaderWriter
{
serializer.SerializeValue(ref Position);
serializer.SerializeValue(ref Rotation);
}
}
public class PlayerNetwork : NetworkBehaviour
{
[SerializeField] private bool usingServerAuth;
private NetworkVariable
playerState;
private Rigidbody playerRb;
private void Awake()
{
playerRb = GetComponent();
var permission = usingServerAuth ? NetworkVariableWritePermission.Server : NetworkVariableWritePermission.Owner;
playerState = new NetworkVariable(new PlayerNetworkState {Position = Vector3.zero, Rotation = Vector3.zero}, NetworkVariableReadPermission.Everyone, permission);
}
public override void OnNetworkSpawn()
{
if (!IsOwner) {
Destroy(transform.GetComponent());
Destroy(transform.GetComponent());
}
}
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
}
Подробнее здесь: https://stackoverflow.com/questions/788 ... layer-game