Cómo acceder a una variable definida dentro de un Coroutine desde otro script
– UnityAssets3Free
bienvenido , soy kein y hoy os traigo
nueva pregunta
Como sugiere el título, estoy tratando de acceder a dos variables declaradas dentro de una rutina de otra clase para almacenarlas en un archivo .csv. Seguí este tema ¿Cómo acceder a una variable definida en un Coroutine de otra clase? pero fue en vano (ambas variables devuelven (0,0,0) como si no estuvieran pobladas).
Mi código:
using System.Collections;
using UnityEngine;
using UnityEngine.XR;
using UnityEngine.UI;
using Unity.XR.PXR;
using UnityEngine.SceneManagement;
public class ET_RayCast : MonoBehaviour
{
[HideInInspector]
public static float timerTarget, timerDistractor;
[HideInInspector]
public static string hitObjectName;
[SerializeField]
private Text targetTimeTxt, distractorTimeTxt, gazeDirTxt, gazeOriginTxt, currentFixatedObj;
[SerializeField]
private GameObject point;
Matrix4x4 matrix;
bool istargetFixated = false;
bool rTriggerValue;
Vector3 RealOriginOffset, DirectionOffset;
[HideInInspector]
public Vector3 realOriginOffset => RealOriginOffset;
[HideInInspector]
public Vector3 directionOffset => DirectionOffset;
void Start()
StartCoroutine(EyeRaycast(0.04f));
IEnumerator EyeRaycast(float steptime)
{
while (true)
{
if (Camera.main)
matrix = Matrix4x4.TRS(Camera.main.transform.position, Camera.main.transform.rotation, Vector3.one);
else
matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3.one);
bool result = (PXR_EyeTracking.GetCombineEyeGazePoint(out Vector3 Origin) && PXR_EyeTracking.GetCombineEyeGazeVector(out Vector3 Direction));
PXR_EyeTracking.GetCombineEyeGazePoint(out Origin);
PXR_EyeTracking.GetCombineEyeGazeVector(out Direction);
var RealOriginOffset = matrix.MultiplyPoint(Origin);
var DirectionOffset = matrix.MultiplyVector(Direction);
Ray ray = new Ray(RealOriginOffset, DirectionOffset);
RaycastHit hit;
if (result)
gazeDirTxt.text = DirectionOffset.ToString("F3");
gazeOriginTxt.text = RealOriginOffset.ToString("F3");
if (Physics.Raycast(ray, out hit, 20f))
currentFixatedObj.text = hit.collider.gameObject.name;
hitObjectName = hit.collider.gameObject.name;
if (hit.collider.CompareTag("target"))
timerTarget += Time.deltaTime;
targetTimeTxt.text = timerTarget.ToString("F3");
point.transform.position = hit.point;
istargetFixated = true;
if (istargetFixated && (InputDevices.GetDeviceAtXRNode(XRNode.RightHand).TryGetFeatureValue(CommonUsages.triggerButton, out rTriggerValue) && rTriggerValue))
timerTarget = 0f;
timerDistractor = 0f;
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
if (hit.collider.CompareTag("Untagged"))
timerDistractor += Time.deltaTime;
distractorTimeTxt.text = timerDistractor.ToString("F3");
point.transform.position = hit.point;
yield return new WaitForSeconds(steptime);
}
}
}
Las variables a las que me gustaría acceder desde otro script son var RealOriginOffset
y var DirectionOffset
. ¿Alguna idea?
Desde ya gracias.
1 respuesta 1
Convertir flujo de trabajo a Asynchronous
programación, con este método se pueden definir, por ejemplo, dos variables dentro de una función dependiente del tiempo.
public async Task<(Vector3, Vector3)> EyeRaycast(float stepTime)
var x = Vector3.one;
var y = Vector3.forward;
while (!Input.anyKey)
Debug.Log("New Loop Start");
await Task.Delay((int) stepTime*1000);
return (x, y);
Y así conseguirlo después de los cambios.
public async Task Start()
var Result = await EyeRaycast(1);
Debug.Log(Result); // ((1.0, 1.0, 1.0), (0.0, 0.0, 1.0))
nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias
eso es todo,espero que te funcione