Programación de juegos 3D y segunda asignación de diseño

Programación de juegos 3D y segunda asignación de diseño

Respuesta corta

  • Explique la diferencia y la conexión entre los objetos del juego (GameObjects) y los recursos (Assets).

    responder:

    • GameObjects , cosas en el espacio del programa del juego, pueden ser Empty (vacío, lo más útil), 2D, 3D, light, camera, etc.
    • Recursos del juego (activos) , construir objetos del juego, decorar objetos del juego, configurar objetos y datos del juego. Objetos o datos del juego en formato serializado o de almacenamiento

    El objeto del juego se refiere al objeto creado, así como a la luz y la cámara durante la inicialización. Los recursos del juego se pueden crear objetos de juego o imágenes importadas desde el exterior.

    Los dos también están relacionados. Cuando arrastramos el objeto del juego al recurso del juego, se convierte en un recurso del juego; cuando instanciamos el recurso del juego, se convierte en un objeto del juego.

  • Descargue varios casos de juegos y resuma la estructura de recursos y organizaciones de objetos (refiriéndose a la estructura de organización de directorios de recursos y la estructura jerárquica del árbol de objetos del juego)

    responder:

    Hay muchas muestras de juegos para estudiar y descargar en el catálogo de aprendizaje en el centro de unidad. Elegí dos de ellos para el análisis.

    • Inserte la descripción de la imagen aquí

      Después de abrir a través de Unity, puede ver su directorio de Activos de la siguiente manera:

      Inserte la descripción de la imagen aquí

      En la figura, puede ver la estructura del directorio de Activos, que es la estructura de atributos. La carpeta principal contiene varias subcarpetas, y los mismos archivos o archivos similares se almacenan en la misma carpeta. Cada subcarpeta también tiene varios subarchivos. De esta estructura jerárquica se puede concluir que la carpeta de recursos coloca recursos con atributos similares en la misma carpeta.

      Inserte la descripción de la imagen aquí

      Después de abrir BlankScene de la escena del proyecto , puede ver la estructura jerárquica de los objetos, no es difícil ver que varios objetos tienen sus propios subobjetos y estos subobjetos tienen sus propios subobjetos. Los objetos principales se componen de sus objetos secundarios. Todos los objetos están organizados en forma de árbol.

    • Descargué varios casos de juegos y descubrí que la jerarquía de los objetos y la jerarquía de los activos son similares a los casos anteriores. No expandiré la explicación aquí y colocaré las capturas de pantalla de su estructura directamente debajo:

      • introducción del juego:

      Inserte la descripción de la imagen aquí

      • La estructura de Activos es la siguiente:
      Inserte la descripción de la imagen aquí
      • La jerarquía de objetos es la siguiente:
      Inserte la descripción de la imagen aquí
  • Escriba un código que use declaraciones de depuración para verificar el comportamiento básico de MonoBehaviour o las condiciones desencadenadas por eventos

    • El comportamiento básico incluye Awake () Start () Update () FixedUpdate () LateUpdate ()
    • Los eventos comunes incluyen OnGUI () OnDisable () OnEnable ()

    responder:

    Primero agregue un recurso de código C #, el contenido del código verificado es el siguiente:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Test : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
            Debug.Log("Start");
        }
    
        // Update is called once per frame
        void Update()
        {
            Debug.Log("Update");
        }
    
        void FixedUpdate()
        {
            Debug.Log("FixedUpdate");
        }
    
        void LateUpdate()
        {
            Debug.Log("LateUpdate");
        }
    
        void Awake()
        {
            Debug.Log("Awake");
        }
    
        void OnGUI()
        {
            Debug.Log("OnGUI");
        }
    
        void OnDisable()
        {
            Debug.Log("OnDisable");
        }
    
        void OnEnable()
        {
            Debug.Log("OnEnable");
        }
    }
    
    

    Luego abra el guardado, haga clic en reproducir en la unidad para ejecutar, el resultado se muestra en la siguiente figura:

    Inserte la descripción de la imagen aquí

    La siguiente es una explicación del comportamiento o evento:

    • Start (): se llama una vez antes de que se llame a la función de actualización
    • Awake (): se utiliza cuando la instancia carga el script
    • Update (): se llamará una vez en cada fotograma
    • FixedUpdate (): se llama una vez por intervalo de tiempo fijo
    • LateUpdate (): se llama después de llamar a la función de actualización
    • OnGUI (): se llamará al dibujar la GUI
    • OnDisable (): la función se llama cuando el objeto deja de estar disponible
    • OnEnable (): la función se llama cuando el objeto está disponible
  • Busque el manual de secuencias de comandos para obtener más información sobre GameObject, Transform, Component objects

    • Traducir respetuosamente la descripción oficial de los tres objetos (Descripción)
    • Describa las propiedades del objeto de tabla (entidad), las propiedades de la transformación de la tabla y los componentes de la tabla en la figura siguiente.
      • El requisito de este tema es asociar la interfaz de programación gráfica visual con la API de Unity. Cuando vea cada contenido en el panel Inspector, debe conocer la API correspondiente.
      • Por ejemplo: el objeto de la tabla es GameObject y el primer cuadro de selección es la propiedad activeSelf.
    • Utilice diagramas UML para describir la relación entre los tres (utilice la versión independiente UMLet 14.1.1 para dibujar)

    responder:

    1. GameObject : clase base para todas las entidades en Unity Scenes (es la clase base de todas las entidades en Unity Scenes).

      Transformar : posición, rotación y escala de un objeto (posición, rotación y tamaño del objeto)

      Componente : clase base para todo lo adjunto a GameObjects (es la clase base para todos los adjuntos a GameObjects)

    2. Inserte la descripción de la imagen aquí

Los atributos del objeto de la tabla: atributo activeSelf, el nombre del objeto y el atributo Static. A continuación se muestran los atributos de Tap, Layer, Prefab, Transform, etc.

Propiedades de transformación: la posición representa la posición del objeto en el eje XYZ, la rotación representa el ángulo de rotación del objeto en la dirección XYZ y la escala representa el tamaño del objeto en la dirección XYZ.

Componentes de la tabla: Transformar, Filtro de malla, Colgador de cuadros, Renderizador de malla

La relación entre los tres es que GameObject y el componente son uno a muchos, es decir, un GameObject puede tener varios componentes; GameObject y Transform son una relación uno a uno, lo que significa que un GameObject corresponde a un Transform; un componente es un Transform La clase padre, Transform es solo una especie de componente

  • Ajustes preestablecidos de recursos (prefabricados) y clones de objetos (clon)

    • ¿Cuáles son los beneficios de los prefabricados?
    • ¿Cuál es la relación entre el preestablecido y la clonación del objeto (clonar o copiar o crear una instancia del objeto Unity)?
    • Haga una mesa prefabricada, escriba un fragmento de código para instanciar el recurso prefabricado de mesa en un objeto de juego

    responder:

    1. Los ajustes preestablecidos pueden instanciar rápidamente muchos de los mismos objetos, lo que puede reducir la carga de trabajo, y la modificación del ajuste preestablecido es equivalente a la modificación de todos los objetos creados por el ajuste preestablecido, por lo que no es necesario modificar uno por uno, lo que también reduce la carga de trabajo.

    2. Crear un objeto con un preset es equivalente a un objeto clonado del preset. Todas las modificaciones al preset modificarán todos los objetos creados por él. Pero si se trata de un objeto clonado, dado que los objetos clonados son relativamente independientes, no hay conexión entre sí y no se afectarán entre sí, por lo que cambiar un objeto clonado no hará que cambien otros objetos clonados.

    3. Primero crea el objeto Tabla, y el resultado final es el siguiente:

      Inserte la descripción de la imagen aquí

      Una vez que haya terminado, arrastre la tabla a Activos para convertirla en un recurso prefabricado

      Inserte la descripción de la imagen aquí

      Después de convertirse en un recurso prefabricado, elimine el objeto de juego creado originalmente para que solo haya dos objetos en la escena: luz y cámara, y luego cree un recurso C # para escribir el código:

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class NewBehaviourScript : MonoBehaviour
      {
          // Start is called before the first frame update
          public GameObject table;
      
          void Start()
          {
              Instantiate(table);
          }
      
          // Update is called once per frame
          void Update()
          {
              
          }
      }
      

      Agregue el código C # escrito a las partes del objeto recién creado y luego haga clic en reproducir para comenzar a ejecutar, el resultado es el siguiente:

      Inserte la descripción de la imagen aquí

      Puede ver que el recurso se instancia correctamente en un objeto

Práctica de programación, minijuegos

  • Contenido del juego: Tic-tac-toe o calculadora de préstamos o calculadora simple, etc.

  • Limitaciones técnicas: solo permite que IMGUI cree la interfaz de usuario

  • Objeto de la cesión:

    • Comprender los eventos de OnGUI () y mejorar la capacidad de depuración
    • Mejorar la capacidad de leer documentos API

    Estudié e hice el proyecto Tic Tac Toe. La captura de pantalla del experimento es la siguiente:

Inserte la descripción de la imagen aquí

  • Proceso del juego : El juego se divide en dos jugadores. El primer jugador es 'X' y el segundo jugador es 'O'. Si las tres piezas de un determinado jugador están conectadas en una línea, se mostrará que el jugador gana. Si el tablero está lleno y ningún jugador gana, se mostrará "Jugar par (empate)". Puedes reiniciar durante el juego o después de que el juego termine. Simplemente haz clic en el botón de reinicio a la izquierda, y el tablero se reiniciará a cero y comenzará un nuevo juego.

  • Marco del juego : el juego se compone principalmente de un tablero de ajedrez compuesto por 9 botones, una imagen de fondo insertada, un botón de reinicio compuesto por botones, un nombre de juego compuesto por etiquetas y una conclusión que se muestra al final del juego.

  • Descripción del código : Primero configure dos variables globales, la matriz de tablero de tipo int representa un tablero de ajedrez 3 * 3, si el valor es 0, la posición está vacía, si el valor es 1, significa que el jugador 1 jugó ajedrez aquí, si es 2 significa el jugador 2 Aquí se juega al ajedrez, y la variable de paso de tipo int se usa para registrar cuántas posiciones del tablero de ajedrez actual se han jugado

    Inserte la descripción de la imagen aquí

    Luego está la función start (), incluida la función init () para inicializar la placa, que es borrar la matriz de la placa y establecer el paso en 0

    Inserte la descripción de la imagen aquí

    El siguiente es isWin (), la función se usa para determinar si alguien gana y devuelve el ganador, si nadie gana, devuelve 0

    Inserte la descripción de la imagen aquí

    El siguiente paso es la función OnGUI (), que se utiliza para llamar a la inicialización anterior o determinar si alguien gana, y realizar cada movimiento de ajedrez y mostrar el nombre y el trasfondo del juego. El código específico es el siguiente:

    Inserte la descripción de la imagen aquí

    Inserte la descripción de la imagen aquí

  • Resumen del experimento : A través de este experimento, aprendí la finalización de la función OnGUI y el proceso de definición de botones y etiquetas. También me familiaricé con el orden de ejecución y los tiempos de ejecución de cada función cuando el juego se está ejecutando. También encontré la conveniencia de la unidad para jugar.

  • Código de experimento completo : portal

Preguntas de pensamiento [opcional]

  • El objeto Game del motor Microsoft XNA protege los detalles del bucle del juego y utiliza un conjunto de métodos virtuales para permitir que el sucesor los complete. A este diseño lo llamamos "patrón de método de plantilla".

    • ¿Por qué es el modo "método de plantilla" en lugar del "modo de estrategia"?

    responder:

Modo de método de plantilla: define el esqueleto de un algoritmo en funcionamiento y retrasa algunos pasos hasta la subclase. El método de plantilla permite a la subclase redefinir algunos pasos específicos del algoritmo sin cambiar la estructura de un algoritmo. Es un modo de comportamiento.
Modo de estrategia: defina una serie de algoritmos, encapsule cada algoritmo y deje que se reemplacen entre sí. El modelo de estrategia permite que el algoritmo cambie independientemente de los clientes que lo utilicen. Es un modo de comportamiento del objeto.

Desventajas del modo de estrategia:

  • El número de clases de estrategia puede ser grande.

  • Todas las clases de estrategias deben estar expuestas.

Tanto el patrón de método de plantilla como el patrón de estrategia se pueden utilizar para separar algoritmos de alto nivel y detalles de implementación de bajo nivel. Ambos permiten la reutilización de algoritmos de alto nivel independientemente de sus detalles de implementación específicos. Además, el modo de estrategia también permite que los detalles de implementación específicos sean independientes de la reutilización de algoritmos de alto nivel, pero a costa de cierta complejidad, memoria y tiempo de ejecución adicionales.

Referencia : modo de método de plantilla y modo de estrategia de patrones de diseño

  • Los objetos del juego están organizados en una estructura de árbol y cada nodo es un objeto del juego (o número).

    • Intente explicar el patrón compuesto (patrón compuesto / un patrón de diseño).
    • Utilice el método BroadcastMessage () para enviar un mensaje al objeto secundario. ¿Puedes escribir el pseudocódigo para BroadcastMessage ()?

    responder:

    1. El patrón compuesto (patrón compuesto), también llamado patrón general parcial, se usa para tratar un grupo de objetos similares como un solo objeto. El modo de combinación combina objetos de acuerdo con una estructura de árbol, que se utiliza para representar los niveles total y parcial. Este tipo de patrón de diseño es un patrón estructural que crea una estructura de árbol de grupos de objetos. Este patrón crea una clase que contiene su propio grupo de objetos. Esta clase proporciona una forma de modificar el mismo grupo de objetos.

    2. // father
      void Start () {
         	this.BroadcastMessage("Mes");
      }
      
      // son
      void Mes(){
         	Debug.Log ("Son");
      }
      
  • Un objeto de juego usa muchas partes para describir las características de diferentes aspectos. Diseñamos el objeto del juego Tank para que no herede del objeto GameObject, sino para agregar un conjunto de componentes de comportamiento al GameObject.

    • ¿Qué patrón de diseño es este?
    • ¿Por qué no heredar y diseñar objetos de juego especiales?

    responder:

    1. Modo de combinación
    2. Agregue directamente la falta, puede ajustar fácilmente las propiedades del objeto, de lo contrario, puede causar desperdicio

Supongo que te gusta

Origin blog.csdn.net/qq_43267773/article/details/108725590
Recomendado
Clasificación