Почему я иногда получаю двукратное увеличение моего счета, когда ловлю звезду? - PullRequest
2 голосов
/ 03 июля 2019

Я сейчас работаю над видеоигрой, и проблема, с которой я сейчас сталкиваюсь, заключается в том, что, когда я тестирую игру, я часто получаю двойное или тройное увеличение счета, когда ловлю одну звезду. Кто-нибудь знает, почему это может происходить? Ниже вы найдете скрипт, который обрабатывает увеличение очков. Заранее спасибо

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StarCollision : MonoBehaviour
{

    int Score;
    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("White Ball")) // Change this from an update method that runs every frame to a method that only runs when things change (Score script score display method)
        {
            Score = ScoreScript.scoreValue;
            ScoreScript.scoreValue += 1;
            StartCoroutine(ChangeColor());
            Score = ScoreScript.scoreValue;

            if (Score == ScoreScript.scoreValue)
            {
                Debug.Log("My instance: " + GetInstanceID());
                Debug.Log("Other instance: " + other.gameObject.GetInstanceID());
            }

        }

    }

    private IEnumerator ChangeColor()
    {

        ScoreScript.score.color = Color.yellow;
        yield return new WaitForSeconds(0.1f);
        ScoreScript.score.color = Color.white;
        gameObject.SetActive(false);

    }
}

Оценка должна увеличиваться только на 1 для каждой пойманной звезды

1 Ответ

1 голос
/ 03 июля 2019

Один из вариантов - отключить столкновение на звезде сразу после столкновения с мячом.Чтобы использовать это для объединенной звезды, вам потребуется повторно включить столкновение при повторном включении звезды:

Collider2D myCollider;

private void Awake()
{
    myCollider = GetComponent<Collider2D>();
}

private void OnEnable() 
{
    myCollider.enabled = true;
}

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag("White Ball")) 
    {
        // Disable this collider immediately to prevent redundant scoring, sound cues, etc.
        myCollider.enabled = false;

        ScoreScript.scoreValue += 1;
        StartCoroutine(ChangeColor());
    }
}

Если вы решите, что вам нужно столкновение со звездой во время появления сопрограммы, вы можетедобавьте поле к StarCollision, которое гарантирует, что счет увеличится только один раз.Опять же, для объединенной звезды вам необходимо убедиться, что она сброшена в OnEnable:

private bool alreadyScored = false;    

private void OnEnable()
{
    alreadyScored = false;
}


private void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag("White Ball")) 
    {
        if (!alreadyScored) 
        {
            ScoreScript.scoreValue += 1;
            StartCoroutine(ChangeColor());

            alreadyScored = true;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...