c# - 移动 Sprite 的统一无限循环(老虎机卷轴)

标签 c# unity3d slot

我正在尝试制作老虎机原型(prototype)。 我的目标是模拟(以编程方式)符号运动。我希望我的符号向下移动,当每个符号离开游戏区域时,它应该再次移动到框架的顶部。这是我的代码:

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

如果谁有制作老虎机的经验,请与我分享。 谢谢,祝你有愉快的一天

最佳答案

你的问题在这里:

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

Try this online

关于c# - 移动 Sprite 的统一无限循环(老虎机卷轴),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45876539/

相关文章:

c# - 删除 k__BackingField XML 而不删除 [Serializable] 属性

c# - Gmail 是否支持 RFC 821?

c# - 创建具有常量唯一 ID 的可编写脚本的对象

c# - 如何从二进制数组作为资源在 C# 中将程序集加载并执行到内存中

Qt 信号与槽

C# 3.0 泛型类型推断 - 将委托(delegate)作为函数参数传递

c# - 我怎样才能用鼠标围绕播放器旋转相机?

c++ - 将信号和插槽关联到动态创建的 qcheckbox

c++ - 检查 QVariantAnimation 是否完成?

c# - 用于 msbuild 的自定义 IL 重写插件