Esta é uma pergunta de acompanhamento para Captura de codificação em Go. Eu tenho isso com sucesso trabalhando. Tenho certeza de que não estou repositando, essa é uma pergunta completamente diferente que tenho que é o mesmo projeto. O jogo está completo, exceto para contar o território no remaining. Atualmente, meu código conta parte do território, mas não tudo, por uma questão de simplicidade, codifiquei para detectar se uma coleção de espaços vazios conectados é inteiramente cercada por pedras de uma cor e se assim o marca como território. Aqui está um jogo acabado para referência.
Minha pergunta é: como permito que o jogador clique ou clique com o botão direito do mouse em parte da placa sem estar dentro do loop de atualização? Não está dentro do loop de atualização porque a atualização chama uma função chamada checkVictory, que chama uma função chamada Endgame.

O que estou tentando implementar é permitir que os jogadores marquem os territórios onde as pedras estão mortas, clicando à esquerda para adicionar um destaque .SsetActive (True) e um ponto, ou clicando com o botão direito para ocultar um destaque. O objetivo é que o Black possa marcar seu território e depois clicar em Passar a volta para permitir que o White marque seu território. Atualmente, não há destaque para alguns dos territórios de Black no canto superior direito e inferior da placa
Aqui está o meu código atual.
personal bool?(,) countExtraTerritory(bool?(,) currentTerritory)
{
Debug.Log("It's black's flip to say territory not counted by the code. Click on Cross Flip if you end up finished. Click on to make territory, proper click on to undo clicking territory.");
bool?(,) newTerritory = new bool?(19, 19);
//Counts the territory that black claims by clicking.
whereas (passCounter < 3)
{
if (Enter.GetMouseButtonDown(0))
{
RaycastHit hit;
if (Physics.Raycast(Digital camera.foremost.ScreenPointToRay(Enter.mousePosition), out hit, 25.0f, LayerMask.GetMask("BoardMask")))
{
mouseOver.x = ((float)Spherical(9 * (hit.level.x - goBoardOffset.x))) / 9;
mouseOver.y = ((float)Spherical(9 * (hit.level.y - goBoardOffset.y))) / 9;
if (currentTerritory((int)(9*mouseOver.x), (int)(9*mouseOver.y)) == null)
{
newTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) = true;
TerritoryHighlight.Occasion.HighlightTerritory(newTerritory);
}
}
else
{
mouseOver.x = -1;
mouseOver.y = -1;
}
}
if (Enter.GetMouseButtonDown(1))
{
RaycastHit hit;
if (Physics.Raycast(Digital camera.foremost.ScreenPointToRay(Enter.mousePosition), out hit, 25.0f, LayerMask.GetMask("BoardMask")))
{
mouseOver.x = ((float)Spherical(9 * (hit.level.x - goBoardOffset.x))) / 9;
mouseOver.y = ((float)Spherical(9 * (hit.level.y - goBoardOffset.y))) / 9;
if (currentTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) == true)
{
newTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) = null;
TerritoryHighlight.Occasion.HighlightTerritory(newTerritory);
}
}
else
{
mouseOver.x = -1;
mouseOver.y = -1;
}
TerritoryHighlight.Occasion.hideHighlights(newTerritory);
}
}
Debug.Log("It's white's flip to say territory not counted by the code. Click on Cross Flip if you end up finished. Click on to make territory, proper click on to undo clicking territory.");
whereas (passCounter < 4)
{
if (Enter.GetMouseButtonDown(0))
{
RaycastHit hit;
if (Physics.Raycast(Digital camera.foremost.ScreenPointToRay(Enter.mousePosition), out hit, 25.0f, LayerMask.GetMask("BoardMask")))
{
mouseOver.x = ((float)Spherical(9 * (hit.level.x - goBoardOffset.x))) / 9;
mouseOver.y = ((float)Spherical(9 * (hit.level.y - goBoardOffset.y))) / 9;
if (currentTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) == null)
{
newTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) = false;
TerritoryHighlight.Occasion.HighlightTerritory(newTerritory);
}
}
else
{
mouseOver.x = -1;
mouseOver.y = -1;
}
}
if (Enter.GetMouseButtonDown(1))
{
RaycastHit hit;
if (Physics.Raycast(Digital camera.foremost.ScreenPointToRay(Enter.mousePosition), out hit, 25.0f, LayerMask.GetMask("BoardMask")))
{
// Have to Math.spherical() after which divide by 9 I feel. (As a substitute of (int) solid as in Checkers tutorial).
mouseOver.x = ((float)Spherical(9 * (hit.level.x - goBoardOffset.x))) / 9;
mouseOver.y = ((float)Spherical(9 * (hit.level.y - goBoardOffset.y))) / 9;
if (currentTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) == false)
{
newTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) = null;
TerritoryHighlight.Occasion.HighlightTerritory(newTerritory);
}
}
else
{
mouseOver.x = -1;
mouseOver.y = -1;
}
TerritoryHighlight.Occasion.hideHighlights(newTerritory);
}
}
return newTerritory;
}
Algumas notas: a posição MouseOver.x é ajustada à escala das linhas na placa e, em seguida, é convertida novamente em um INT, o que deve dar um valor de 0 a 18 em qualquer lugar da placa. Não preciso de ajuda para solucionar isso, também a classe Destaques recebe uma matriz bool (19,19), se o valor dela for nulo, não haverá destaque, se o valor for verdadeiro, há um destaque preto e, se houver um valor falso, há um destaque branco.
O PassCounter incrementa sempre que o botão é clicado. O problema é o meu, enquanto os loops são loops infinitos, porque enquanto eles estão executando nem o botão Passturn funciona, nem a capacidade de clicar em um determinado ponto e gerar um objeto de destaque. Tentei ler o problema e parece que preciso ligar para a atualização novamente, usar uma declaração de rendimento ou uma declaração de invocar, mas eles não parecem exatamente o que estou procurando.
Uma declaração de rendimento atrasa o código para um limite de tempo especificado, mas o que eu quero fazer é continuar checando um clique no mouse na placa até que o botão Passar o retorno seja clicado.
Geralmente, na virada de um jogador, a função de atualização permite que eles cliquem em sua pedra colorida no lado direito da placa e arrastá -la para o lugar, mas agora não quero que eles possam fazer isso e só capaz de clicar em um espaço na placa e adicionar um objeto de destaque ou clicar no botão Passar.
Também tentei substituir as instruções do Whereas por IF, mas o jogo executa todo o código e termina o jogo sem permitir que você clique. Atualmente, termino o jogo imprimindo uma mensagem dizendo quem venceu ou se os jogadores empataram e, em seguida, usando isso.enabled = false;
Qualquer ajuda seria muito apreciada.