繁体   English   中英

在Android中使用统一C#进行回合制游戏

[英]Turn Based Game in unity C# in android

美好的一天! 我有此代码,但有一个错误,例如(我设置了两个播放器,以及一台计算机)。 我先走一圈,然后骰子以4的值重生(仅作为示例),然后当我触摸屏幕时,游戏棋子从1st移到4th磁砖,当计算机转动时,它也从1st移到4th磁砖(因为我将结果设置为4仅作为示例)。 现在轮到我了,骰子再也不会重生, if (Input.GetMouseButtonDown(0))并再次移动4则它也不会等待触摸屏幕...

public class singlePlay : MonoBehaviour {
    //Player 
    public GameObject[] playerprefab;

    //Player Clone
    public GameObject[] playerprefabC;

    //Game Cards and Dice
    public GameObject[] situationCard;
    public GameObject dice;
    int diceresult;

    //Game Cards and Dice clone
    public GameObject diceclone;

    public int currentPlayer;
    public int compPlayer;
    public int playerTurn;
    public string compPlayerstring;
    public string playerTurnstring;

    //GUI Boolean
    bool play = false;

    //Game Boolean
    bool pieces = false;
    bool giveturn = false;
    bool myturn = false;
    bool diceSpawn = false;
    bool moving = false;
    bool routine = false;
    bool checking = false;  
    bool compturn = false;
    //icon1
    public GameObject[] icon;

    //population
    int[] population = new int[3];

    //Tile
    public GameObject[] Tile;
    int[] playerTile = new int[3]; //current location
    int[] playerTileUp = new int [3]; // updated location after dice roll

    bool endTurn = false;

    void Update () 
    {
        if (giveturn == true) {
            int h = 0;
            Giveturn(h);
            giveturn = false;
        }

        if (play == true) {

            if (pieces == true){
                SpawnPlayer();
                pieces = false;
            }

            if (myturn == true){
                compturn = false;
                if(diceSpawn == true) {
                    dice.transform.position = new Vector3(0,0,-1);
                    diceclone = Instantiate(dice, dice.transform.position, Quaternion.identity) as GameObject;
                    diceSpawn = false;
                }
                if (Input.GetMouseButtonDown(0))
                {
                    Debug.Log("click");
                    diceresult = 4;
                    Destroy(diceclone);
                    moving = true;
                    Updateposition(diceresult);
                }
            }
            else
            {
                Debug.Log("comp");
                myturn = false;
                diceresult = 4;
                moving = true;
                Updateposition(diceresult);
            }
        }
    }

    void Giveturn(int k) 
    {
        Debug.Log("" + k);
        currentPlayer = k;
        if (k == playerTurn) {
            Debug.Log("Yes");
            compturn = false;
            myturn = true;
            diceSpawn = true;
            moving = false;
        }
        else 
        {
            Debug.Log("No");
            compturn = true;
            myturn = false;
            moving = false;
        }
    }

    void Updateposition(int diceresult) 
    {
        if (moving == true) {
            playerTileUp[currentPlayer] = playerTile[currentPlayer] + diceresult;
            Debug.Log("" + playerTileUp[currentPlayer]+ " " +currentPlayer);
            routine = true;
            StartCoroutine(MyMethod()); 
        }
        moving = false;
    }

    IEnumerator MyMethod() 
    {
        if (routine == true) {
            if (myturn == true) {
                compturn = false;
            }
            else
            {
                myturn = false;
            }

            int f = playerTile[currentPlayer] + 1;
            Debug.Log(" " + currentPlayer );

            while (f <= playerTileUp[currentPlayer]) {
                Debug.Log("waiting");
                yield return new WaitForSeconds(1);
                Debug.Log(" " + Tile[f]);
                playerprefabC[currentPlayer].transform.position =  Tile[f].transform.position;
                Debug.Log(" " + currentPlayer);
                f++;
            }
            checking = true;
            TrapCheck();
        }
        routine = false;
    }

    void TrapCheck()
    {
        if (checking == true) {
            if (playerTileUp[currentPlayer] == 8) {
                Debug.Log("Trap spawning");
                Instantiate(situationCard[0], situationCard[0].transform.position, Quaternion.identity);
                population[currentPlayer] = population[currentPlayer] -1;
            }

            playerTile[currentPlayer] = playerTileUp[currentPlayer];
            Endturn();
            myturn = false;
            compturn = false;
            checking = false;
        }
    }

    void Endturn()
    {
        currentPlayer++;
        Debug.Log(" " + currentPlayer);
        if (currentPlayer > compPlayer) {
            currentPlayer = 0;
        }
        Giveturn(currentPlayer);
    }   
}

在那儿我几乎看不到什么错了。 首先,协程正在运行时,由于播放仍为真,因此您似乎并没有阻止更新运行。 在TrapCheck中,您调用EndTurn,后者调用GiveTurn并设置myTurn(true)和compTurn(false)布尔值。 但是在TrapCheck中将这两个重置,将myTurn设置回false。 您需要重新考虑班级的逻辑。

一种解决方案是使用委托。 这将删除您设置和重置的许多布尔值。 这是一个基本思路:

Action currentUpdate;
bool playerTurn = true;
void Start(){
    SetTurn();
}
void Update(){
    if(currentUpdate != null)currentUpdate();
}
void SetTurn(){
    // Prepare initial setting for moving
    if(playerTurn == true){ currentUpdate = PlayerTurn; } 
    else{ currentUpdate = CompTurn; } 
    playerTurn = !playerTurn;
}

void PlayerTurn(){
    // Check input
    // Get dice value
    currentUpdate = Move;
}

void CompTurn(){
    // Get dice value
    currentUpdate = Move;
}

void Move(){
    if(position != target){

    }else{
        SetTurn();
    }
}

这是相当简化的,但是一旦您掌握了委托的知识(也许您已经知道),这将使一切变得更加灵活。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM