在Unity3d中为VR 360度图像应用更改焦点的材质

时间:2015-12-28 10:27:06

标签: c# android unity3d google-cardboard virtual-reality

我正在为谷歌纸板创建一个应用程序,像360度图像的应用程序。 我创造了一个球体,我用不同的360度图像制作了62种材质。 我创建了2个按钮,下一个和上一个,当我专注于下一个按钮时,它会根据需要更改为下一个素材。但是当我专注于前一个按钮时,它会改变为我不想要的最后一种材料。我想要的只是以前的材料。

这是我的代码。看到并告诉我我做错了什么。感谢。

using UnityEngine;
using System.Collections;

public class next : MonoBehaviour {

    public CardboardHead head;
    public Material[] myMaterials = new Material[60];
    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 updateMaterials(){
        if (collider.gameObject.tag == "next") {
            if (arrayPos == maxMaterials){
                arrayPos = 0;
            }else{

                arrayPos++;
                Sphere.renderer.material = myMaterials [arrayPos];
            }
        }
         if (collider.gameObject.tag == "previous") {
            if (arrayPos == 0){
                arrayPos = maxMaterials;
            }else{
                arrayPos--;
                Sphere.renderer.material = myMaterials [arrayPos];

            }
        }


    }


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

        if (collider) {

            bool isLookAt = collider.Raycast (head.Gaze, out hit, Mathf.Infinity);
            if (isLookAt == true) {
                if(wait == false){
                    StartCoroutine (RadialProgress (timeToCompleteLoading));

                    updateMaterials();
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

你描述的内容有些不对劲。有60种材料,因此maxMaterial应该是59(0到59是60个点)。但你说它显示61和60,那应该是超出限制。此外,由于maxMaterial为59(60 -1),当您的索引为60或61时,您的if语句不会。

你可以这样评论:

 void updateMaterials(){
    if (collider.gameObject.tag == "next") {
        if (++arrayPos == myMaterials.Length){
            arrayPos = 0;
        }
    }
    else if (collider.gameObject.tag == "previous") {
        if (--arrayPos < 0){
            arrayPos = myMaterials.Length - 1;
        }
    }
    Sphere.renderer.material = myMaterials [arrayPos];
}

P.S。:正如我在评论中提到的,你的协程中的while循环不会做任何延迟的过程:

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

while循环在单帧内运行。

    while (i < 1)
    {
        i += Time.deltaTime * rate;
        gameObject.renderer.material.SetFloat("_Progress", i);
        yield return null;
    }

现在while循环遍历几个帧。