2017-08-25 20 views
2

私はスロットマシンプロトタイプを作ろうとしています。 私の目標は、(プログラム的に)シンボルの動きをシミュレートすることです。私のシンボルが下に移動し、各シンボルがゲームフィールドから外に出るとき、それは再びフレームのトップに移動する必要があります。ここに私のコードは次のとおりです。移動スピリットのユニティ無限ループ(スロットマシンリール)

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

    } 
} 

だから、私のシンボルが移動するが、最低のシンボルが再び上がった後、シンボル間のギャップは同じではありません。

see image of bug

誰もがスロットマシンを作るの経験を持っている場合は、私と一緒にそれを共有してください。 おかげで、持っている素敵な一日

+0

をあなたは浮動小数点の不正確さに対していくらかの精度を失うことに縛られています - 一方で、私は100%確実ではないので、それを再現しようとします。 –

+0

あなたは 'newY'を計算しますが、あなたはそれを使用しません。 yを 'symbols.Count * symbolHeight'に設定します。それかもしれない。 – Pluto

答えて

3

あなたの問題はここにある:

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.1f)ではなく、3.0fsymbolHeight)を追加して先頭にリセットしてください。これはほんの一例であり、もちろんその値は変わることがあります。この問題を解決するには


私が何かやって示唆している:あなたの問題は、反復の多くの後以来 `Translate`機能に関連すると思わ一見

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

華麗な、ありがとう – Victor