2017-08-25 2 views
2

J'essaye de faire un prototype de machine à sous. Mon but est de simuler (par programmation) le mouvement des symboles. Je veux que mes symboles descendent et quand chaque symbole sort du champ de jeu, il devrait être de nouveau déplacé vers le haut du cadre. Voici mon code:Unity boucle infinie de sprites mobiles (bobine de machine à sous)

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); 
       } 
      } 
     } 
    } 
} 

Mon symbole est un gameobject régulier:

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() { 

    } 
} 

Alors, mes symboles se déplacent mais après le plus bas symbole remonte à nouveau, l'écart entre les symboles n'est pas le même.

see image of bug

Si quelqu'un a l'expérience dans la fabrication de machines à sous, s'il vous plaît le partager avec moi. Merci et une belle journée

+0

Au premier regarder votre problème semble être lié à la fonction 'Translate' car après beaucoup d'itérations vous allez sûrement perdre de la précision à l'inexactitude en virgule flottante - d'un autre côté, il semble un peu trop extrême pour être la seule explication, donc je ne suis pas encore sûr à 100%, je vais essayer de le reproduire. –

+0

Vous calculez 'newY' mais vous ne l'utilisez pas. Vous définissez toujours le y sur 'symbols.Count * symbolHeight'. Ça pourrait être ça. – Pluto

Répondre

3

Votre problème est ici:

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); 
} 

vous vérifiez si le symbole passé le point de contrôle donc nous supposons qu'il est transform.position.y est égal à -3.1f puis vous essayez de réinitialisez-le en ajoutant 3.0f (symbolHeight) au lieu du changement de position réel (3.1f). Ce n'est qu'un exemple et bien sûr les valeurs peuvent varier.


Pour résoudre ce problème, je vous conseille de faire quelque chose comme:

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; 
} 

Try this online

+0

Brillant, merci – Victor