2015-12-28 3 views
1

Я создаю приложение для Google-картона, приложение, как изображение на 360 градусов. Я создал сферу, и я сделал 62 материала с различным 360-градусным изображением. Я создал 2 кнопки, следующий и предыдущий, когда я фокусируюсь на следующей кнопке, меняя ее на следующий материал, как я хочу. но когда я фокусируюсь на предыдущей кнопке, это меняется на последний материал, который я не хочу. Я хочу только предыдущий материал.Измените материал сферы на Focus для VR 360 Degree Image App в Unity3d

Вот мой код. Смотрите и расскажите мне, что я делаю неправильно. Благодарю.

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(); 
       } 
      } 
     } 
    } 
} 
+0

При первом запуске он будет прыгать до последнего, но если вы сначала посмотрите на следующий, а затем на предыдущий, он должен перейти к предыдущему. Но вы имеете в виду, что когда вы смотрите на следующее, а затем на предыдущее, оно прыгает до последнего? – Everts

+0

По другой проблеме код в то время как сопрограмма не будет делать то, что вы ожидаете. Вам нужно вернуть значение null из цикла while, чтобы он возвращал управление программе. В этой ситуации он будет делать все движение в одном кадре. – Everts

+0

В первом запуске, когда я фокусируюсь на предыдущем, он меняется на последний [61], как и должно быть. потому что исходная позиция равна [0], но когда я фокусируюсь на следующем ее переходе на [1]. он должен перейти к [0], но при первом запуске, когда я сосредоточусь на следующем его рабочем штрафе. например [0], [1], [2] ...... так далее после того, как я сосредоточусь на предыдущем, прыгает на [60]. @fafase –

ответ

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

PS: Как я уже говорил в комментариях, ваш цикл в то время как в сопрограммы не будет делать какой-либо замедленный процесса:

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

это время запускает цикл в пределах одного кадра.

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

Теперь цикл while пробегает несколько кадров.

+0

Извините, я сменил на 61 контрольную панель @fafase –

+0

Сэр, я запутался ... могу написать полный код. теперь я понимаю. @fafase –

+0

Это полный код, который я предполагаю, сначала метод UpdatePanel, вторая часть заменяет цикл while в сопрограмме coroutine (не связанной с вопросом происхождения). – Everts