Когда игрок являющиеся хостом нажимает кнопку то клиент удаляеться
У меня есть два скрипта - один висит на префабе кнопки(условной кнопке - это 2д обьект) , а второй на префабе игрока. Первый скрипт это синхронизация позиции кнопки а второй увелечение, синхронизация и выведение на екран очков. Мне нужно чтобы при вызове функции ClickButton() host игроком client игрок не удалялся из-за кучи ошибок.
Первый скрипт:
using System.Collections;
using System.Collections.Generic;
using Mirror;
using UnityEngine;
using Random = UnityEngine.Random;
public class Button : NetworkBehaviour
{
public List<float> Yposes = new List<float>();
private void Start()
{
StartCoroutine(Timer());
}
IEnumerator Timer()
{
yield return new WaitForSeconds(120f);
Destroy(gameObject);
}
[Server]
private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
NetworkIdentity playerNetworkIdentity = other.GetComponent<NetworkIdentity>();
if (playerNetworkIdentity != null)
{
ScoreManager playerScoreManager = playerNetworkIdentity.GetComponent<ScoreManager>();
if (playerScoreManager != null)
{
playerScoreManager.CmdIncreaseScore(playerNetworkIdentity);
}
}
if (isServer)
{
ClickButton();
}
}
}
[Server]
private void ClickButton()
{
float randomY = 0, randomX;
randomX = Random.Range(-27, 27);
while (Yposes.Contains(randomY))
{
randomY = Random.Range(-13, 13);
}
Yposes.Add(randomY);
Vector2 spawnPosition = new Vector2(randomX, randomY);
RaycastHit2D hit = Physics2D.Raycast(spawnPosition, Vector2.down);
if (hit.collider != null && hit.collider.CompareTag("Ground"))
{
float objectHeight = GetComponent<Collider2D>().bounds.extents.y;
RpcSpawnObjectOnSolidGround(new Vector2(hit.point.x, hit.point.y + objectHeight));
}
}
[ClientRpc]
private void RpcSpawnObjectOnSolidGround(Vector2 position)
{
transform.position = position;
}
}
Второй скрипт:
using System.Linq;
using Mirror;
using TMPro;
using UnityEngine;
public class ScoreManager : NetworkBehaviour
{
public SyncListPlayerScore playerScores = new SyncListPlayerScore();
public TextMeshProUGUI score;
private void Start()
{
score = GameObject.FindWithTag("ScoreText").GetComponent<TextMeshProUGUI>();
if (isServer)
{
UpdateScoreText();
}
}
[Command]
public void CmdIncreaseScore(NetworkIdentity player)
{
if (player != null && player.connectionToClient != null)
{
uint netId = player.netId;
PlayerScore playerScore = playerScores.Find(x => x.netId == netId);
if (playerScore == null)
{
playerScore = new PlayerScore { netId = netId, score = 0 };
playerScores.Add(playerScore);
}
playerScore.score++;
RpcUpdateScoreText(playerScores.ToArray());
}
}
[ClientRpc]
private void RpcUpdateScoreText(PlayerScore[] scores)
{
UpdateLocalScore(scores);
}
[Client]
private void UpdateLocalScore(PlayerScore[] scores)
{
playerScores.Clear();
playerScores.AddRange(scores);
UpdateScoreText();
}
private void UpdateScoreText()
{
string scoreText = "Scores:\n";
foreach (var entry in playerScores)
{
scoreText += $"Player {entry.netId}: {entry.score} очків\n";
}
score.text = scoreText;
}
}
[System.Serializable]
public class PlayerScore
{
public uint netId;
public int score;
}
public class SyncListPlayerScore : SyncList<PlayerScore> { }
Я мог некоректно описать вопрос, если что поправьте или спросите. Надеюсь на помощь