Estoy tratando de hacer que TestGrab encuentre el script PlatformStateMachine y ejecute el método LoadChaptersMenu, pero la línea a continuación con el comentario tiene el error: El objeto no tiene una definición para LoadChaptersMenu, y ningún método de extensión acepta un primer argumento del objeto, bla, bla, error común. Sin embargo, no sé cómo no pude seleccionar o exponer el método.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { public void TestGrab () { UnityEngine.Debug.Log("triggered"); object psm = Object.FindObjectOfType<PlatformStateMachine>(); psm.LoadChaptersMenu();// error shows up here }PlatformStateMachine.cs:
using System; using System.Collections.Generic; using UnityEngine; using System.IO; public class PlatformStateMachine : MonoBehaviour { public static void LoadChaptersMenu() { UnityEngine.Debug.Log("executed"); } }Probablemente alguien pueda encontrar dónde se responde esto en otro lugar, pero con mi conocimiento limitado del problema, no pude encontrar esa solución en mis búsquedas. No puedo ejecutar el código en Unity para la depuración si hay un error sintáctico. No sé qué paso de solución de problemas tomar aparte de preguntar aquí.
Prueba.cs
using UnityEngine; public class Test : MonoBehaviour { public void TestGrab() { Debug.Log("triggered"); var psm = FindObjectOfType<PlatformStateMachine>(); psm.LoadChaptersMenu(); } }PlatformStateMachine.cs
using UnityEngine; public class PlatformStateMachine : MonoBehaviour { public void LoadChaptersMenu() { Debug.Log("executed"); } }En Test.cs, convirtió implícitamente PlatformStateMachine en un objeto, y el objeto es la superclase de todo y no tiene el método LoadChaptersMenu.
Dado que obtiene una instancia de PlatformStateMachine cuando usa FindObjectOfType, no desea usar un método estático, por lo que eliminé el modificador estático en PlatformStateMachine.cs. Si desea que el método sea estático, invóquelo de forma estática, como:
PlatformStateMachine.LoadChaptersMenu();Estaría bien hacer una verificación después o antes de buscar el objeto. Por ejemplo:
var psm = FindObjectOfType<PlatformStateMachine>(); if(psm == null) throw new System.Exception("Object of type " + typeof(PlatformStateMachine) + " not found!"); psm.LoadChaptersMenu()Pero recomiendo hacer una referencia pública, para guardar de memoria. Porque FindObjectOfType consume mucha memoria cuando se llama. Perdón por mal inglés!!!