我正在为谷歌纸板创建一个应用程序,像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();
}
}
}
}
}
答案 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循环遍历几个帧。