Скрипты исчезают у второго игрока в многопользовательской игре UnityC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Скрипты исчезают у второго игрока в многопользовательской игре Unity

Сообщение Anonymous »

Я создаю многопользовательскую игру в Unity, используя Netcode для GameObjects. После реализации камеры для каждого игрока, следующего за ним, я понял, что при присоединении клиента скрипт, позволяющий игроку управлять своим персонажем, просто исчезает. Поэтому игрок не может двигаться. Скрипт Camera Controller делает то же самое. Я также не получаю никаких ошибок.
Есть также сценарий 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
}
Интернет просто не дал мне ничего по теме, поэтому решение может быть не очень простым. Дайте мне знать, если вам нужна дополнительная информация, например, конфигурация Network Manager или что-то в этом роде. Еще есть скрипт, который создает только кнопки для входа в игру в качестве хоста или клиента, но я не думаю, что это актуально.


Подробнее здесь: https://stackoverflow.com/questions/788 ... layer-game
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Скрипты исчезают у второго игрока в многопользовательской игре Unity
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Изменение скорости игрока приводит к резким движениям в многопользовательской игре Unity Photon Fusion.
    Anonymous » » в форуме C#
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous
  • Синхронизация дверей на сервере в многопользовательской игре Unity с помощью зеркала
    Anonymous » » в форуме C#
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous
  • Определите лучшего хоста в многопользовательской игре на iOS
    Anonymous » » в форуме IOS
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Ошибка jsondecode в многопользовательской игре в pygame
    Anonymous » » в форуме Python
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»