В мультиплеере не шарю практически совсем, вот пытаюсь разобраться.
Смысл в том, что этот самый Game Controller получает данные хода от первого игрока и от второго игрока (здесь можно привести Hearthstone как аналогию, но ходы одновременные, а не поочередные), должен рассчитать урон, который они друг другу нанесли, установиться каждому игроку полагающееся ему значение здоровья и, собственно, начать следующий ход.
В синглплеере все работает, в том плане, что все алгоритмы и расчеты верные и рабочие, но только когда я создаю второго игрока, его присутствие никак не сказывается на игре.
Я прицепил GameController на NetworkManager, так хотя бы второй игрок может его найти.
Синтаксис:
Используется csharp
public class PlayerController : NetworkBehaviour
{
public GameController gameController;
public PlayerController currentOpponent;
public int currentHealth;
public bool endedTurn;
public string previousTurnIdentifier;
public string turnIdentifier;
// how much player will do damage next turn
public int nextTurnDamageIncrement;
// how much player will reduce damage next turn
public int nextTurnDamageReduction;
void Start()
{
previousTurnIdentifier = "---";
turnIdentifier = "---";
gameController = NetworkManager.singleton.GetComponent<GameController>();
if (gameController.firstPlayer == null)
gameController.firstPlayer = this;
else if (gameController.secondPlayer == null)
{
gameController.secondPlayer = this;
currentOpponent = gameController.firstPlayer;
gameController.firstPlayer.currentOpponent = this;
gameController.StartTurn();
}
}
void Update()
{
if (isLocalPlayer == false)
return;
if (Input.GetKeyDown(KeyCode.Return))
{
endedTurn = true;
}
}
public void GetDamage(int damage)
{
if (damage > 0)
currentHealth -= damage;
}
public void OnTurnStart()
{
previousTurnIdentifier = turnIdentifier;
turnIdentifier = "---";
}
}
{
public GameController gameController;
public PlayerController currentOpponent;
public int currentHealth;
public bool endedTurn;
public string previousTurnIdentifier;
public string turnIdentifier;
// how much player will do damage next turn
public int nextTurnDamageIncrement;
// how much player will reduce damage next turn
public int nextTurnDamageReduction;
void Start()
{
previousTurnIdentifier = "---";
turnIdentifier = "---";
gameController = NetworkManager.singleton.GetComponent<GameController>();
if (gameController.firstPlayer == null)
gameController.firstPlayer = this;
else if (gameController.secondPlayer == null)
{
gameController.secondPlayer = this;
currentOpponent = gameController.firstPlayer;
gameController.firstPlayer.currentOpponent = this;
gameController.StartTurn();
}
}
void Update()
{
if (isLocalPlayer == false)
return;
if (Input.GetKeyDown(KeyCode.Return))
{
endedTurn = true;
}
}
public void GetDamage(int damage)
{
if (damage > 0)
currentHealth -= damage;
}
public void OnTurnStart()
{
previousTurnIdentifier = turnIdentifier;
turnIdentifier = "---";
}
}
Синтаксис:
Используется csharp
public class GameController : MonoBehaviour
{
public NetworkManager networkManager;
public PlayerController firstPlayer, secondPlayer;
private void Update()
{
if (firstPlayer != null && secondPlayer != null)
if (firstPlayer.endedTurn == true && secondPlayer.endedTurn == true)
{
DealDamage();
StartTurn();
}
}
public void StartTurn()
{
firstPlayer.endedTurn = false;
secondPlayer.endedTurn = false;
firstPlayer.OnTurnStart();
secondPlayer.OnTurnStart();
}
public void DealDamage()
{
int damageToFirstPlayer = CalculatePlayer(secondPlayer, secondPlayer.turnIdentifier, secondPlayer.previousTurnIdentifier, firstPlayer, firstPlayer.turnIdentifier, firstPlayer.previousTurnIdentifier);
int damageToSecondPlayer = CalculatePlayer(firstPlayer, firstPlayer.turnIdentifier, firstPlayer.previousTurnIdentifier, secondPlayer, secondPlayer.turnIdentifier, secondPlayer.previousTurnIdentifier);
print(damageToFirstPlayer);
print(damageToSecondPlayer);
firstPlayer.GetDamage(damageToFirstPlayer);
secondPlayer.GetDamage(damageToSecondPlayer);
}
...
{
public NetworkManager networkManager;
public PlayerController firstPlayer, secondPlayer;
private void Update()
{
if (firstPlayer != null && secondPlayer != null)
if (firstPlayer.endedTurn == true && secondPlayer.endedTurn == true)
{
DealDamage();
StartTurn();
}
}
public void StartTurn()
{
firstPlayer.endedTurn = false;
secondPlayer.endedTurn = false;
firstPlayer.OnTurnStart();
secondPlayer.OnTurnStart();
}
public void DealDamage()
{
int damageToFirstPlayer = CalculatePlayer(secondPlayer, secondPlayer.turnIdentifier, secondPlayer.previousTurnIdentifier, firstPlayer, firstPlayer.turnIdentifier, firstPlayer.previousTurnIdentifier);
int damageToSecondPlayer = CalculatePlayer(firstPlayer, firstPlayer.turnIdentifier, firstPlayer.previousTurnIdentifier, secondPlayer, secondPlayer.turnIdentifier, secondPlayer.previousTurnIdentifier);
print(damageToFirstPlayer);
print(damageToSecondPlayer);
firstPlayer.GetDamage(damageToFirstPlayer);
secondPlayer.GetDamage(damageToSecondPlayer);
}
...
Синтаксис:
Используется csharp
public class UIButtonEndTurn : NetworkBehaviour, IPointerDownHandler
{
public PlayerController player;
public int actionTypeIndex, firstDamageTypeIndex, secondDamageTypeIndex;
public void OnPointerDown(PointerEventData eventData)
{
List<PlayerController> players = FindObjectsOfType<PlayerController>().Where(p => p.isLocalPlayer == true).ToList();
if (players != null && players.Count > 0)
for (int i = 0; i < players.Count; i++)
if (players[i].isLocalPlayer == true)
player = players[i];
if (player != null && player.endedTurn == false)
{
player.turnIdentifier = actionTypeIndex.ToString() + firstDamageTypeIndex.ToString() + secondDamageTypeIndex.ToString();
Debug.LogError("Player " + player.GetInstanceID() + " ended turn, turn identifier: " + player.turnIdentifier);
player.endedTurn = true;
}
}
}
{
public PlayerController player;
public int actionTypeIndex, firstDamageTypeIndex, secondDamageTypeIndex;
public void OnPointerDown(PointerEventData eventData)
{
List<PlayerController> players = FindObjectsOfType<PlayerController>().Where(p => p.isLocalPlayer == true).ToList();
if (players != null && players.Count > 0)
for (int i = 0; i < players.Count; i++)
if (players[i].isLocalPlayer == true)
player = players[i];
if (player != null && player.endedTurn == false)
{
player.turnIdentifier = actionTypeIndex.ToString() + firstDamageTypeIndex.ToString() + secondDamageTypeIndex.ToString();
Debug.LogError("Player " + player.GetInstanceID() + " ended turn, turn identifier: " + player.turnIdentifier);
player.endedTurn = true;
}
}
}
Вот основные скрипты, они работают у каждого игрока раздельно, и ни второй игрок не оказывает влияния на первого, ни первый на второго, как это исправить, куда копать и что сделать?
P.S.: да, мне юнити уже 9999 раз сказал, что это устарело все, но нибейти пж я по-другому не умею