En este momento estás viendo Cómo acceder a una variable definida dentro de un Coroutine desde otro script

 – Unity

Cómo acceder a una variable definida dentro de un Coroutine desde otro script – Unity

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

Deja una respuesta