基于 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];
}
}
}
}
}
}
请帮忙。谢谢
如果你在 Update 中 StartCoroutine 它不会在下一帧再次停止调用 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];
}
}
}
}
}
}
}
我正在尝试在 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];
}
}
}
}
}
}
请帮忙。谢谢
如果你在 Update 中 StartCoroutine 它不会在下一帧再次停止调用 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];
}
}
}
}
}
}
}