Не двигается второй игрок по сети в игре пинг понг на юнити 2D C#
первый игрок на хосте и на клиенте двигается, а второй игрок не двигается! Помогите пожалуйста!!! Завтра защита проекта)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Netcode;
public class Paddle : NetworkBehaviour
{
public bool isPlayer1;
public float speed;
public Rigidbody2D rb;
public Vector3 startPosition;
public NetworkVariable<float> movement = new NetworkVariable<float>(default,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Owner);
private void Start()
{
startPosition = transform.position;
}
private void Update()
{
if (!IsOwner)
return;
if (isPlayer1)
{
if (IsServer)
{
movement.Value = Input.GetAxisRaw("Vertical");
}
}
else
{
if (IsClient)
{
movement.Value = Input.GetAxisRaw("Vertical2");
}
}
rb.velocity = new Vector2(rb.velocity.x, movement.Value * speed);
}
public void Reset()
{
if (!IsServer) return;
rb.velocity = Vector2.zero;
transform.position = startPosition;
}
}
using System.Collections.Generic;
using TMPro;
using Unity.Netcode;
using UnityEngine;
public class NetworkPlayerSpawner : NetworkBehaviour
{
private Dictionary<ulong, NetworkPlayer> _idToPlayerMap = new Dictionary<ulong, NetworkPlayer>();
public GameObject player1Prefab;
public GameObject player2Prefab;
public override void OnNetworkSpawn()
{
if (!IsServer)
return;
NetworkManager.OnClientConnectedCallback += OnClientConnected;
base.OnNetworkSpawn();
}
public NetworkPlayer GetPlayerById(ulong id)
{
return _idToPlayerMap[id];
}
private void OnClientConnected(ulong playerId)
{
GameObject prefab = GetPrefabForPlayer(playerId);
if (prefab == null)
return;
GameObject playerObject = Instantiate(prefab);
NetworkObject networkObject = playerObject.GetComponent<NetworkObject>();
playerObject.transform.position = GetSpawnPosition(playerId);
playerObject.transform.localScale = new Vector3(1f, 3f, 1f);
networkObject.SpawnWithOwnership(playerId);
_idToPlayerMap.Add(playerId, playerObject.GetComponent<NetworkPlayer>());
}
private GameObject GetPrefabForPlayer(ulong playerId)
{
if (playerId == 0)
return player1Prefab;
else if(playerId == 1)
return player2Prefab;
return null;
}
private Vector3 GetSpawnPosition(ulong playerId)
{
if (playerId == 0)
return new Vector3(-6.75f, -2.87f, 0f);
else if (playerId == 1)
return new Vector3(6.75f, -2.87f, 0f);
return Vector3.zero;
}
}
using System;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class NetworkPlayer : NetworkBehaviour
{
private static NetworkVariable<bool> _limitCount = new NetworkVariable<bool>();
private NetworkPlayerSpawner _spawnManager;
private Paddle _paddle;
public float speed;
public Rigidbody2D rb;
// public bool isPlayer1;
public override void OnNetworkSpawn()
{
if (IsHost)
{
_spawnManager = FindObjectOfType<NetworkPlayerSpawner>();
_paddle = GetComponent<Paddle>();
}
base.OnNetworkSpawn();
}
private void Awake()
{
// _scoreText = GameObject.FindGameObjectWithTag("scoreHost").GetComponent<TextMeshProUGUI>();
// _clientText = GameObject.FindGameObjectWithTag("textClient").GetComponent<TextMeshProUGUI>();
}
private void Start()
{
if (IsServer)
{
Ball ball = FindObjectOfType<Ball>();
ball.Launch(); // Запуск мяча на сервере
}
if (IsOwner)
{
Ball ball = FindObjectOfType<Ball>();
ball.Launch(); // Запуск мяча на клиенте*/
}
}
private void OnScoreChanged(int previousValue, int newValue)
{
if (_limitCount.Value)
return;
// _hostText.text = "Host:" + newValue;
if (newValue >= 10)
{
MyGlobalServerRpc(OwnerClientId);
}
}
private void OnScoreChanged2(int previousValue, int newValue)
{
if (_limitCount.Value)
return;
// _clientText.text = "Client:" + newValue;
if (newValue >= 10)
{
MyGlobalServerRpc(OwnerClientId);
}
}
[ServerRpc(RequireOwnership = false)]
public void MyGlobalServerRpc(ulong winnerId)
{
NetworkPlayer winnerPlayer = _spawnManager.GetPlayerById(winnerId);
if (winnerPlayer != null)
{
string winnerName = winnerPlayer.gameObject.name;
ShowWinnerIdClientRpc(winnerName);
}
}
[ClientRpc]
private void ShowWinnerIdClientRpc(string winnerId)
{
_limitCount.Value = true;
}
}
в Input managerе у меня стоит за vertical - s и w, а за vertical2 - down и up На рисунке видно как я двигаю первым игроком а второй вообще стоит
Источник: Stack Overflow на русском