Unity3d no llama a la función si no la necesita

  
                  

La optimización más simple y la mejor de todas es la ejecución de menos esfuerzo. Por ejemplo, cuando un enemigo está lejos y el momento perfecto es aceptable cuando el enemigo se queda dormido. No se hace nada hasta que el jugador se acerca. Esta es una forma lenta de manejar: la función Actualizar () {//Al principio si el jugador está demasiado lejos. Si (Vector3.Distance (transform.position, target.position) > 100) regresa; realice un trabajo real …} Esto no es una buena idea, porque Unity debe llamar a la función de actualización mientras realiza cada marco de trabajo. Una mejor solución es deshabilitar el comportamiento hasta que el jugador esté cerca. Hay 3 formas de hacer esto: 1. Use OnBecameVisible y OnBecameInvisible. Estas devoluciones de llamada están vinculadas al sistema de renderizado. Siempre que cualquier cámara pueda ver el objeto, se llamará a OnBecameVisible, y cuando ninguna cámara vea a nadie, se llamará a OnBecameInvisible. Este método es muy útil en muchas situaciones, pero generalmente no es particularmente útil en la IA, ya que no estará disponible siempre y cuando deje la cámara alejada de ellas. Función OnBecameVisible () {enabled = true;} función OnBecameInvisible () {enabled = false;} 2. Utilice un disparador. Un simple gatillo esférico funcionará muy bien. Una vez que salga de esta bola de efecto, recibirá una llamada OnTriggerEnter /Exit. Función OnTriggerEnter (c: Collider) {if (c.CompareTag (" Player ")) enabled = true;} función OnTriggerExit (c: Collider) {if (c.CompareTag (" Player ")) enabled = false;} 3. Utilice un programa colaborativo. El problema con las llamadas de actualización es que suceden todos los cuadros. Es probable que solo necesite verificar la distancia al jugador cada 5 segundos. Esto debería ahorrar muchos ciclos de procesamiento.

Programa colaborativo: un tipo especial de programación funcional que permite evitar su ejecución hasta que se cumplan algunas de sus propias condiciones. Función MyCoroutine () {DoSomething (); yield; //Stay one frame DoSomethingElse ();} Cuando llame a esta función (inicie la rutina), se comportará como cualquier otra función normal hasta que se alcance la salida. La instrucción de producción interpreta: como la salida de la instrucción en este sentido, detiene la función y retorna el control para ejecutar el código, llamando a la función para devolver el trabajo declarado. La principal diferencia es que la instrucción de rendimiento le permite retrasar la ejecución del código, después de (en el último ejemplo, la instrucción DoSomethingElse ()). Función MyCoroutine () {DoSomething (); //Inmediatamente ejecute este rendimiento; //Devuelva el control a la persona que llama DoSomethingElse (); //Esto se ejecutará después de un cuadro} void Start () {MyCoroution ();} Si tiene ¿Qué sucede cuando MyCoroutine pide más código? Veamos algunos ejemplos de impresión: function MyCoroutine () {print (" This se imprime en segundo lugar "); //; el control vuelve a la función de inicio print (" Esto se imprime una cuarta parte, exactamente un cuadro después del tercero y ");} void Start () {print (" Esto se imprime primero "); MyCoroutine (); print (" This is imprimible tercero ");} Cuando pueda controlar la instrucción, se ejecutará el código de rendimiento. Esto depende del parámetro de instrucción de rendimiento, de acuerdo con la siguiente tabla. No hay nada: esperará a que un cuadro llame a otra rutina: esperará hasta que la computadora llamada finalice la ejecución. Objeto WaitForSeconds: ¿esperará un rato? Aquí hay un ejemplo: function MyCoroutine () {DoSomething (): //Inmediatamente ejecute el rendimiento WaitForSeconds (2); //El control regresa a la persona que llama DoSomethingElse (); //Esto se ejecutará después de 2 segundos} void Start () { Función MyCoroutine ();} Función MyCoroutine () {DoSomething (): //Ejecutar inmediatamente el rendimiento MyOtherCoroutine (); //¡Ir a MyOtherCoroutine! DoSomethingElse (); //Esto se ejecutará después de la ejecución de la función MyOtherCoroutine} MyOtherCoroutine () {DoStuff (): //Ejecute inmediatamente el rendimiento WaitForSeconds (2); //El control regresa al llamador de la función de inicio en este caso () DoMoreStuff (); //Esto se ejecutará después de 2 segundos //MyOtherCoroutine se hace aquí} void Start () {MyCoroutine ();}

Coroutines &Yield Al escribir el código del juego, a menudo Necesito lidiar con una serie de eventos. Esto puede llevar a un código como el de abajo. Private var state = 0; función Update () {if (state == 0) {//Do step 0 state = 1; return;} if (state == 1) {//Do step 1 state = 2; return; } //…} Es más conveniente usar la declaración de rendimiento. La declaración de rendimiento es un tipo especial de devolución, que garantiza que la función continúe ejecutándose desde la declaración de rendimiento en la próxima llamada. Si bien (verdadero) {//realizar el rendimiento del paso 0; //esperar un cuadro //hacer el rendimiento del paso 1; //esperar un marco //…} También puede pasar un valor específico a la declaración del rendimiento para retrasar la ejecución de la función Actualizar. Hasta que ocurra un evento específico. //Haga algo que produzca WaitForSeconds (5.0); //Espere 5 segundos //Haga más cosas y, por supuesto, puede apilar y conectar coroutines. Este ejemplo ejecuta Do y continúa inmediatamente después de la llamada. Do (); print (" Esto se imprime inmediatamente y "); función Do () {print (" Do now "); produce WaitForSeconds (2); print (" Do 2 segundos después ");) Este ejemplo Ejecute Do y espere hasta que finalice antes de continuar ejecutándose. //link coroutine yield StartCoroutine (" Do "); print (" Alsafter 2 seconds "); print (" Esto es después de que Do coroutine haya finalizado la ejecución de la función "); Do () {print (" Do Ahora "); produce WaitForSeconds (2); print (" Do 2 segundos después ");} Cualquier controlador de eventos puede ser una rutina. Tenga en cuenta que no puede usar el rendimiento en Update o FixedUpdate, pero puede usar StartCoroutine para iniciar una Funcion Para obtener más información sobre el uso de rendimiento, consulte YieldInstruction, WaitForSeconds, WaitForFixedUpdate, Coroutine y MonoBehaviour.StartCoroutine.

Copyright © Conocimiento de Windows All Rights Reserved