2017-10-17 7 views
0

IEnumeratorを使用して、リセット可能なタイマーとして機能しています。私はウェイポイントシステムをセットアップして、そこにテレポートするためのn秒間のウェイポイントを注視します。私はIEnumeratorをその時間を制御する方法として使用し、偶発的なテレポートを止めさせる。それはうまくいきますが、レイキャストアイテムを注視すると、どこかでロジックが壊れてしまい、ウェイポイントを見直して再びすべてをバックアップする必要があります。この失敗は、私のウェイポイントのすべてのインスタンスでも実行され、1つを見て離れて見ると、別のものをテレポートすることができません。私はGVRレーザーポインターとGVRレティクル1.70(1.100ビルドに失敗)ビルドからGVRレクチルです。IEnumeratorを使ったUnity GVR Gazeイベント

コード:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class Gaze_Waypoints : MonoBehaviour { 

public int gazeTime = 3; //the amount of time needed to look to teleport 
public GameObject playerCam; //the players camera 
private Vector3 waypointPosition; //the position of the current waypoint 
private Vector3 playerCamPosition; //the current position of the players camera used for height information 
private IEnumerator waypointEnumerator; //my co-routine 
private bool startCoRoutine; //is the co-routine running 

void Start() { 
    waypointPosition = transform.position; //get the position of the owners waypoint 
    waypointEnumerator = waypointTimerEvent(); //set the ienumerator to the relevant function below 
    startCoRoutine = true; //testing this out as true or false 
} 

void Update() { 
    playerCamPosition = playerCam.transform.position; //keep track of the players camera, mainly for height info 
} 

// when I gaze a waypoint 
public void PointerEnter() { 
    Debug.Log("I entered."); 
    if (startCoRoutine) { 
     StartCoroutine (waypointEnumerator); 
    } else { 
     StopCoroutine (waypointEnumerator); 
    } 
    startCoRoutine = !startCoRoutine; 
} 

// when I look away 
public void PointerExit() { 
    Debug.Log("I exited."); 
    StopCoroutine (waypointEnumerator); 
} 

// if I look for 3 seconds teleport the user, if I look away reset the timer 
IEnumerator waypointTimerEvent() { 
    yield return new WaitForSeconds (gazeTime); 
    playerCam.transform.position = new Vector3 (waypointPosition.x, waypointPosition.y + playerCamPosition.y, waypointPosition.z); 
    StartCoroutine(waypointEnumerator); 
} 
} 

答えて

0

がMonoBehaviour.StartCoroutine

  1. 公共コルーチンStartCoroutine(IEnumeratorをルーチン)の異なる呼び出しを参照。
  2. public Coroutine StartCoroutine(文字列methodName、オブジェクト値= null)。

ケース1 - テストしていないが、明らかに あなたは

while (true){ 
    yield return new WaitForSeconds(waitTime); 
    debug.Log("WaitAndPrint"); 
} 

ケース2と同様にコルーチンでループを使用する必要があります - sligthly修正が、テストOK

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class Gaze_Timer : MonoBehaviour { 

    public int gazeTime = 3; //the amount of time needed to look to teleport 
    public GameObject playerCam; //the players camera 
    private Vector3 startingPosition; 
    private Vector3 changePosition; 

    private bool startCoRoutine; //is the co-routine running 

    void Start() { 
     startingPosition = transform.localPosition; 
     changePosition = startingPosition; 
     startCoRoutine = false; //testing this out as true or false 
    } 

    void Update() { 
     //... 
    } 

    // when I gaze 
    public void PointerEnter() { 
     Debug.Log("I entered."); 
     if (startCoRoutine) { 
      StopCoroutine("waypointTimerEvent"); 
     } else { 
      StartCoroutine("waypointTimerEvent", gazeTime); 
     } 
     startCoRoutine = !startCoRoutine; 
    } 

    // when I look away 
    public void PointerExit() { 
     Debug.Log("I exited."); 
     if (startCoRoutine) { 
      StopCoroutine("waypointTimerEvent"); 
      startCoRoutine = false; 
     } 
    } 

    IEnumerator waypointTimerEvent(float waitTime) { 
     yield return new WaitForSeconds(waitTime); 
     Debug.Log("I waited " + waitTime + " seconds"); 
     GetComponent<Renderer>().material.color = Color.blue; 
     changePosition.y += 0.1f; 
     transform.localPosition = changePosition; 
    } 
} 
関連する問題