Coroutine随机被卡住?

时间:2017-10-10 15:58:47

标签: c# loops unity3d coroutine

这个问题说明了一切,我有一个Coroutine,我正在使用它创建一些旋转动画。问题是它突然随机停止(在不同的时间)。我不知道是什么原因造成这种情况,因为它在PC上大部分时间(10次中有8次)都有效。我也建立了游戏,并在Android手机上试用,但它只能工作(10次中有3次)。知道可能导致这种情况的原因吗?

这是我的剧本:

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

public class SpinWheelScript : MonoBehaviour {

    public CanvasGroup spinWheelCanvas;

    public GameObject[] rewards;
    public GameObject[] pointerDir;
    public GameObject[] ringDir;
    public GameObject pointer;
    public GameObject ring;

    private Quaternion pointerTargetRotation;
    private Quaternion ringTargetRotation;

    private bool spinIsEnabled = false;
    private bool isSpinning = false;
    private bool lastSpin = false;
    private bool animationIsEnabled = false;

    private float time;
    private float pSpeed;
    private float rSpeed;
    private float pointerRotateFloat;
    private float ringRotateFloat;

    private int rewardEnabler = 0;
    private int randomReward;
    private int pRandomDir;
    private int rRandomDir;
    private int plastRandomDir = 0;
    private int rlastRandomDir = 0;

    private void Update()
    {
        if (spinIsEnabled == false)
        {
            // Do Nothing
        }

        else if (spinIsEnabled == true && isSpinning == false)
        {
            // Select reward
            if (rewardEnabler == 0)
            {
                RewardSelector();
                rewardEnabler = 1;
            }

            StartCoroutine(Spin());
        }

        if (lastSpin == true)
        {
            Debug.Log(randomReward);

            pointerRotateFloat = ((360 - (randomReward * 60)) - 30);
            ringRotateFloat = ((360 - (randomReward * 60)) - 30);

            if (pointerRotateFloat > ringRotateFloat)
            {
                pSpeed = (pointerRotateFloat);
                rSpeed = (pointerRotateFloat / ringRotateFloat) * (ringRotateFloat);
            }
            else
            {
                rSpeed = (ringRotateFloat);
                pSpeed = (ringRotateFloat / pointerRotateFloat) * (pointerRotateFloat);
            }

            Quaternion pointerTargetRotation = Quaternion.Euler(new Vector3(0, 0, pointerRotateFloat));
            pointer.transform.rotation = Quaternion.RotateTowards(pointer.transform.rotation, pointerTargetRotation, pSpeed * Time.deltaTime);
            Quaternion ringTargetRotation = Quaternion.Euler(new Vector3(0, 0, ringRotateFloat));
            ring.transform.rotation = Quaternion.RotateTowards(ring.transform.rotation, ringTargetRotation, rSpeed * Time.deltaTime);

            if ((pointer.transform.rotation == pointerTargetRotation) && (ring.transform.rotation == ringTargetRotation))
            {
                lastSpin = false;
                isSpinning = false;
                spinIsEnabled = false;
                animationIsEnabled = true;
            }
        }
    }

    IEnumerator Spin()
    {
        isSpinning = true;
        pSpeed = 0;
        rSpeed = 0;
        time = 0;

        while (time < 15)
        {
            pRandomDir = PointerRandomDirection();    // Function to pick a random number.
            rRandomDir = RingRandomDirection();    // Function to pick a random number.

            for (;;)
            {
                pointerRotateFloat = (((pRandomDir + 1) * 60) - 30) - pointer.transform.rotation.z;
                ringRotateFloat = (((rRandomDir + 1) * 60) - 30) - ring.transform.rotation.z;

                if (pointerRotateFloat > ringRotateFloat)
                {
                    pSpeed = (pointerRotateFloat);
                    rSpeed = (pointerRotateFloat / ringRotateFloat) * (ringRotateFloat);
                }
                else
                {
                    rSpeed = (ringRotateFloat);
                    pSpeed = (ringRotateFloat / pointerRotateFloat) * (pointerRotateFloat);
                }

                pointerTargetRotation = Quaternion.Euler(new Vector3(0, 0, pointerRotateFloat));
                pointer.transform.rotation = Quaternion.RotateTowards(pointer.transform.rotation, pointerTargetRotation, pSpeed * Time.deltaTime);
                ringTargetRotation = Quaternion.Euler(new Vector3(0, 0, ringRotateFloat));
                ring.transform.rotation = Quaternion.RotateTowards(ring.transform.rotation, ringTargetRotation, rSpeed * Time.deltaTime);

                Debug.Log("Before the if");

                if ((pointer.transform.rotation == pointerTargetRotation) && (ring.transform.rotation == ringTargetRotation))
                    break;

                yield return null;
            }

            time++;
        }

        lastSpin = true;
    }

    private int RewardSelector()
    {
        randomReward = Random.Range(0, rewards.Length);

        return randomReward;
    }

    private int PointerRandomDirection()
    {
        int pRandomDir = plastRandomDir;

        if (pointerDir.Length <= 1)
            return 0;

        while (pRandomDir == plastRandomDir)
        {
            pRandomDir = Random.Range(0, pointerDir.Length);
        }

        plastRandomDir = pRandomDir;
        return pRandomDir;
    }

    private int RingRandomDirection()
    {
        int rRandomDir = rlastRandomDir;

        if (ringDir.Length <= 1)
            return 0;

        while (rRandomDir == rlastRandomDir)
        {
            rRandomDir = Random.Range(0, ringDir.Length);
        }

        rlastRandomDir = rRandomDir;
        return rRandomDir;
    }

    public void OnSpinButtonClick()
    {
        if(spinIsEnabled == false && isSpinning == false)
            spinIsEnabled = true;

        spinWheelCanvas.interactable = false;
    }
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您没有使用现有的解决方案找到答案,这里有一个您可能会欣赏的替代解决方案,可以说更简单。

实现旋转效果并以随机角度停止的更简单方法: 制作2个动画(在动画/动画制作窗口中),0-180度动画和180-360度动画,然后让它们相互转换。

只制作一个0-360的动画很可能看起来很麻烦,因此我建议将它分成两部分。

然后,您可以通过代码调整动画速度和动画制作参数(控制正在播放的动画)来决定此动画的速度。

要让旋转轮以随机角度停止,你可以在动画师中使用一个名为&#34; Speed&#34;的浮动值,速度越高,停止动画所需的时间越长,因此随机停止角度是实现。

当速度达到0时,也将动画速度设置为0,这应该以指定的角度停止动画。

如果你不明白我的意思,请随时提问。