基于 VR 的应用程序中的十字准线进度圈

Crosshair Progress Circle in VR Based Application

我正在尝试在 unity3d 中制作 360 度图像 GoogleCardoard 应用程序。

我创建了一个球体并制作了 5 个 material 并在 material 中应用了 360 度图像。我正在通过 Raycast 交换 material 及其工作,但问题是当十字线接触箭头时(在箭头和十字线上应用光线投射以交换 material),material 变化非常快。我应用了一个径向进度条,但它不起作用。我想要的是每次 material 更改

时十字准线加载动画

这是我的 C# 代码

using UnityEngine;
using System.Collections;

public class next : MonoBehaviour {

    public CardboardHead head;
    public Material[] myMaterials = new Material[5];
    int maxMaterials;
    int arrayPos = 0;
    public GameObject Sphere;
    public int timeToCompleteLoading = 3;

    void Start ()
    {
        head = Camera.main.GetComponent<StereoController> ().Head;
        maxMaterials = myMaterials.Length-1;

    }

    public void ToggleVRMode() 
    {
        Cardboard.SDK.VRModeEnabled = !Cardboard.SDK.VRModeEnabled;
    }

    IEnumerator RadialProgress(float time)
    {
        yield return new WaitForSeconds(time);
        float rate = 1 / time;
        float i = 0;
        while (i < 1)
        {
            i += Time.deltaTime * rate;
            gameObject.renderer.material.SetFloat("_Progress", i);

        }
    }

    void Update ()
    {
                RaycastHit hit;
                Collider collider = GetComponent<Collider> ();

                if (collider) {
                        bool isLookAt = collider.Raycast (head.Gaze, out hit, 6.0f);
                        if (isLookAt == true) {

                            if (collider.gameObject.tag == "next") {
                                StartCoroutine (RadialProgress (timeToCompleteLoading));
                                if (arrayPos == maxMaterials){

                                    arrayPos = 0;
                                }else{

                                    arrayPos++;
                                    Sphere.renderer.material = myMaterials [arrayPos];
                            }
                    }
            }
    }
}
}

请帮忙。谢谢

如果你在 UpdateStartCoroutine 它不会在下一帧再次停止调用 StartCoroutine .您不能延迟更新功能。但是您可以使用布尔标志来关闭 运行 部分代码:

using UnityEngine;
using System.Collections;

public class next : MonoBehaviour {

    public CardboardHead head;
    public Material[] myMaterials = new Material[5];
    int maxMaterials;
    int arrayPos = 0;
    public GameObject Sphere;
    public int timeToCompleteLoading = 3;
    bool wait = false;

    void Start ()
    {
        head = Camera.main.GetComponent<StereoController> ().Head;
        maxMaterials = myMaterials.Length-1;

    }

    public void ToggleVRMode() 
    {
        Cardboard.SDK.VRModeEnabled = !Cardboard.SDK.VRModeEnabled;
    }

    IEnumerator RadialProgress(float time)
    {
        wait = true;
        yield return new WaitForSeconds(time);

        float rate = 1 / time;
        float i = 0;
        while (i < 1)
        {
            i += Time.deltaTime * rate;
            gameObject.renderer.material.SetFloat("_Progress", i);

        }
        wait = false;
    }

    void Update ()
    {
                RaycastHit hit;
                Collider collider = GetComponent<Collider> ();

                if (collider) {
                        bool isLookAt = collider.Raycast (head.Gaze, out hit, 6.0f);
                        if (isLookAt == true) {
                            if(wait == false){
                                if (collider.gameObject.tag == "next") {
                                    StartCoroutine (RadialProgress (timeToCompleteLoading));
                                    if (arrayPos == maxMaterials){

                                        arrayPos = 0;
                                    }else{

                                        arrayPos++;
                                        Sphere.renderer.material = myMaterials [arrayPos];
                                }
                        }
                    }
            }
    }
}
}