Unity бесконечная петля движущихся спрайтов (барабан игрового автомата)


Я пытаюсь сделать прототип игрового автомата. Моя цель-имитировать(программно) движение символов. Я хочу, чтобы мои символы двигались вниз, и когда каждый символ выходит из игрового поля, он должен быть снова перемещен в верхнюю часть кадра. Вот мой код:

public class Reel : MonoBehaviour {

    public int reelHeight = 3;

    public int symbolWidth = 3;
    public int symbolHeight = 3;

    public float reelSpeed = 1000;

    [SerializeField]
    public GameObject symbol;

    public List<GameObject> symbols = new List<GameObject>();

    private bool inSpin = false;

    void Start () {
        // reel predefined symbols
        int[] reelSymbols = new int[] { 0, 0, 0, 0, 1, 2, 1, 3, 4, 5}; //{0,0,0,0,1,1,1,2,2,3,3,3,4,4,4,4,1,5,5,5,5,2,2,6,6,6,6,3,7,7,7,7};

        // instantiating symbols on reel
        for (int i = 0; i < reelSymbols.Length; i++) {
            symbol = Instantiate (symbol, new Vector3 (0, i*symbolHeight, 0), Quaternion.identity);
            symbol.GetComponent<Symbol>().symbolType = reelSymbols [i];
            symbols.Add (symbol);
        }
    }

    public void SpinReel () {
        inSpin = !inSpin;
    }

    void Update () {
        // infinite spin
        if (inSpin) {
            foreach (GameObject symbol in symbols) {
                // moving symbols down
                float currentReelSpeed = reelSpeed * Time.deltaTime;
                symbol.transform.Translate(Vector3.down * currentReelSpeed);

                // move symbol up to the top if it's go down and no longer vidible
                if (symbol.transform.position.y <= -3.0f) {
                    float newY = ((symbols.Count - 1) * symbolHeight) + transform.position.y;
                    symbol.transform.position = new Vector3 (transform.position.x, symbols.Count*symbolHeight, transform.position.z);
                }
            }
        }
    }
}

Мой символ-обычный игровой объект:

public class Symbol : MonoBehaviour {

    public Sprite [] sArray;

    public int symbolType;

    // Use this for initialization
    void Start () {
        GetComponent<SpriteRenderer> ().sprite = sArray [symbolType];
    }

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

    }
} 

Итак, мои символы движутся, но после того, как самый низкий символ снова поднимается, разрыв между символами не тот же самый.

смотрите изображение жука

Если у кого-нибудь есть опыт в создании слота машины, пожалуйста, поделитесь им со мной. Спасибо и хорошего вам дня

1 2

1 ответ:

Ваша проблема здесь:

if (symbol.transform.position.y <= -3.0f) 
{
    float newY = ((symbols.Count - 1) * symbolHeight) + transform.position.y;
    symbol.transform.position = new Vector3 (transform.position.x, symbols.Count*symbolHeight, transform.position.z);
}

Вы проверяете, прошел ли символ через контрольную точку, поэтому давайте предположим, что он transform.position.y равен -3.1f, а затем вы пытаетесь сбросить его сверху, добавив 3.0f ( symbolHeight ) вместо фактического изменения положения (3.1f ). Это только пример, и, конечно, значения могут меняться.


Чтобы исправить это, я бы предложил сделать что-то вроде:

if (symbol.transform.position.y <= -3.0f) 
{
    Vector3 currentPosition = symbol.transform.position;
    currentPosition.y = (currentPosition.y + 3.0f) + (symbols.Count - 1) * symbolHeight;
    symbol.transform.position = currentPosition;
}

Попробуйте это онлайн