Стрельба по дополнительным шарам - ошибка игры Block Breaker (Unity 2D) - PullRequest
1 голос
/ 21 октября 2019

Я играю в игру "Разбиватель блоков", чтобы игрок мог получить дополнительные шары и стрелять в те шары, которые были в оригинале.

Кто-нибудь знает, что не так? Если нетдостаточно информации, просто скажите мне, и я могу предоставить ее здесь.

Спасибо

=========== ИЗМЕНЕН КОД, ЧТОБЫ БОЛЬШЕ ЧИСТИТЬ ===========

Создал собственную логику пула, чтобы получить больше контроля, и создал ExtraBallManager.cs для обработки только функций, связанных с этим.

Вот как это сейчас (также я подумалчто мне не пришлось использовать сопрограмму):

public class ExtraBallManager : MonoBehaviour

{

private Ball ballController;
private GameManager gameManager;
public float ballWaitTime;
private float ballWaitTimeSeconds;
public int numberOfExtraBalls;
public int numberOfBallsToFire;
public ObjectPool objectPool;
//public TextAlignment numberOfBallsText;

// Start is called before the first frame update
void Start()
{
    ballController = FindObjectOfType<Ball>();
    gameManager = FindObjectOfType<GameManager>();
    ballWaitTimeSeconds = ballWaitTime;
    numberOfExtraBalls = 0;
    numberOfBallsToFire = 0;

}

void Update() {
    if(ballController.currentBallState == Ball.ballState.fire || ballController.currentBallState == Ball.ballState.wait){
        if(numberOfBallsToFire > 0){
            ballWaitTimeSeconds -= Time.deltaTime;
            if(ballWaitTimeSeconds <= 0){
                GameObject tempBall = objectPool.GetPooledObject("Temp Ball");
                if(tempBall != null){
                    tempBall.transform.position = ballController.ballLaunchPosition;
                    tempBall.SetActive(true);
                    //It seems the error occurs in here
                    //sometimes it just don't add this tempBall to the
                    //list
                    gameManager.ballsInScene.Add(tempBall);
                    tempBall.GetComponent<Rigidbody2D>().velocity = ballController.initialBallVelocity;
                    ballWaitTimeSeconds = ballWaitTime;
                    numberOfBallsToFire--;
                }
                ballWaitTimeSeconds = ballWaitTime;
            }
        }
    }

    if(ballController.currentBallState == Ball.ballState.endShot){
        numberOfBallsToFire = numberOfExtraBalls;
    }

}

}

Моя часть Ball.cs, где переключается состояние шара:

   void Start()
{
    arrow.SetActive(false);
    currentBallState = ballState.aim;
    rigidBody = GetComponent<Rigidbody2D>();
    ballTransform = GetComponent<Transform>();
    lineRenderer = arrow.GetComponent<LineRenderer>();
    gameManager = FindObjectOfType<GameManager>();
    stoppedPosition = transform.position;
    currentBallState = Ball.ballState.aim;
    gameManager.ballsInScene.Add(this.gameObject);

}

// Update is called once per frame
void Update()
{

    switch(currentBallState) {
        case ballState.aim:
            if (Input.GetMouseButtonDown(0) && gameObject.tag == "Ball"){
                MouseClicked();
            }
            if(Input.GetMouseButton(0) && gameObject.tag == "Ball"){
                MouseDragged();
            }
            if(Input.GetMouseButtonUp(0) && gameObject.tag == "Ball"){
                ReleaseMouse();
            }

            break;
        case ballState.fire:
            break;
        case ballState.wait:
            stoppedPosition = transform.position;
            /*
            if(gameManager.IsThereAnyExtraBallOnScene()){
                currentBallState = ballState.endShot;
            }*/

            if(gameManager.ballsInScene.Count == 1){
                currentBallState = Ball.ballState.endShot;
            }

            break;
        case ballState.endShot:
            for(int i = 0; i < gameManager.blocksInScene.Count; i++){
                if(gameManager.blocksInScene[i]){
                    gameManager.blocksInScene[i].GetComponent<BlockMovementController>().currentState = BlockMovementController.blockState.move;
                } 
            }
            gameManager.level += 1;
            gameManager.SpawnBlocks();
            currentBallState = ballState.aim;
            break;
        default:
            break;

    }



}
...