Я играю в игру "Разбиватель блоков", чтобы игрок мог получить дополнительные шары и стрелять в те шары, которые были в оригинале.
Кто-нибудь знает, что не так? Если нетдостаточно информации, просто скажите мне, и я могу предоставить ее здесь.
Спасибо
=========== ИЗМЕНЕН КОД, ЧТОБЫ БОЛЬШЕ ЧИСТИТЬ ===========
Создал собственную логику пула, чтобы получить больше контроля, и создал 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;
}
}