Ciudad lista para unreal motor 4

  • Desarrollo de juegos
  • Saludos Habr! Me gustaría presentarles un proyecto relativamente pequeño que hice desde cero en aproximadamente 150 horas (50 ejecuciones de aproximadamente 3 horas cada una) en Unreal Engine 4. Hice el proyecto en vivo solo en transmisiones una vez a la semana (en total, tomó un año), respondiendo preguntas de los usuarios a lo largo del camino.

    El proyecto en sí no pretendía ser comercial. Mi objetivo era mostrar en la práctica la complejidad del desarrollo de juegos, concretamente problemas como:

    • Planificación de proyectos y creación de prototipos.
    • Pensar e implementar la arquitectura del proyecto y sus componentes individuales.
    • Implementación de la interfaz de usuario
    • Depuración y corrección de errores.
    • Trabajar con recursos y gráficos

    Al final de toda la serie de transmisiones, terminamos con un prototipo jugable de un shooter de “supervivencia”. Aquellos con el vaso medio lleno podrían incluso llamarlo pre-alfa sin argumento.

    Si está interesado en los detalles del proyecto, transmisiones de grabaciones, fuentes, etc., siga leyendo.

    Todo el proyecto se implementó en un sistema de programación visual llamado Blueprints. Y, por supuesto, muchos especialistas pueden considerarlo infantil; incluso un proyecto relativamente grande se puede desarrollar fácilmente en él. Además, esto se puede hacer con relativa rapidez, como ya hemos podido demostrar.

    Quiero responder la pregunta de inmediato: " ¿Por qué Blueprints y no C++?". Bueno, en primer lugar, cuando comencé la serie, casi no conocía las ventajas. Aunque todavía haría un sencillo así con una fuente de alimentación. En segundo lugar, las fuentes de alimentación son casi tan buenas como las ventajas en nuestro caso, pero al mismo tiempo ofrecen una serie de posibilidades: no permiten cometer muchos errores, son posibles con ventajas, no hay que distraerse entre BP y C++, es más fácil de entender para principiantes. En nuestro caso no son mucho más lentos, dado que casi toda la lógica se basa en eventos.

    También logramos trabajar un poco en los gráficos. Desafortunadamente, no tuvimos tiempo para crear recursos, por lo que dejamos algunos como ficticios, otros se crearon directamente en el editor a partir de primitivos y parte del contenido se tomó prestado de demostraciones gratuitas de Epic Games. Sin embargo, logramos hacer algunas cosas nosotros mismos, por ejemplo, un sistema diurno y nocturno, posprocesamiento para agua y algunos materiales para los objetos de la escena.

    Los planes para mis transmisiones también incluían problemas que pudieran surgir durante el desarrollo. Los resolví específicamente en vivo para no solo mostrar lo que los desarrolladores jóvenes podrían encontrar, sino también cómo depurar su código, buscar errores y escribir su código para que todo pudiera hacerse dos veces más rápido. Por supuesto, no tengo décadas de experiencia en programación, y esto afectó los errores a veces estúpidos que cometí. Y estoy seguro de que muchos desarrolladores pueden cuestionar muchos puntos en el proceso de escribir un juego.

    Naturalmente, esto difícilmente puede considerarse un juego completo, ya que no hay trama ni objetivo en el juego, sólo mecánica pura. Sin embargo, creo que el resultado es algo de lo que estar orgulloso y que refleja plenamente para qué estaba pensado todo el proyecto.

    Lista de todo lo que logramos implementar en nuestro juego.

    Personaje

    • Control de personajes
    • Sistema de estadísticas vitales (Caderas, armadura, resistencia, hambre, sed)
    • Cambio de vista (primera persona y tercera persona)
    • Modelo (realizado en Fuse, animaciones tomadas de Mixamo)
    • Animaciones personalizadas de movimiento y uso de armas.
    • Interacción universal con objetos.

    Sistema de inventario de objetos

    • Componente de inventario (incrustar en cualquier objeto que desee)
    • Sistema de jaula con soporte para artículos de diferentes tamaños.
    • Tamaño del inventario por celdas por página y por peso.
    • Una clase de artículos que se pueden poner en el inventario. Los artículos se almacenan como objetos.
      • Peso, tamaño, información, estado del artículo.
      • Funcionalidad para apilar (cuando hay muchos artículos en una celda)
      • Capacidad de agregar lógica para usar un elemento
      • Bajando del inventario
    • Interfaz para interactuar con el inventario.
    • Interfaz de intercambio entre otro componente y el suyo propio.
    • Manipulación Drag&Drop de objetos entre inventarios y dentro de uno.
    • Menú contextual para elementos
    • Consejos al señalar elementos en el inventario y en el mundo.
    • Lista de elementos generados al crear un objeto con un componente/iniciar el juego.
    • Lista de elementos iniciales al crear un objeto con un componente/iniciar el juego.
    • Sistema de comercio entre otros inventarios.
      • Interfaz comercial
      • Componente de gestión de dinero (requerido para que el trading funcione)

    Sistema de equipamiento

    • Equipa varios tipos de artículos: sombreros, top, pantalones, botas, armas.
    • Sincronización esquelética del Top, pantalón y botas. (Sombreros y armas por encajes)
    • Ventana cómoda para equipos con soporte Drag&Drop
    • Soporte para la lógica modificadora al vestirse.
    Arma
    • armas a distancia
      • Recargar
      • Usar elementos de munición del inventario
      • Soporte para clases de proyectiles/balas.
      • Fuego automático/fuego único
      • Retroceso con extensión (propio + dependiendo de factores, por ejemplo, correr o ponerse en cuclillas)
    • Armas cuerpo a cuerpo (con varios tipos de controles de daño para elegir)
    • El estado del arma se deteriora con el uso.
    Sistema de elaboración
    • Elaboración según una receta (elegí una receta, la elaboré, como Fallout)
    • Elaboración por elementos (arrojó los elementos necesarios, los creó, al estilo Minecraft)
    • Interfaz de usuario solo para el segundo tipo de elaboración.
    Mobs agresivos
    • Mobs cuerpo a cuerpo (si los ven, correrán y comenzarán a golpear)
    • Mobs de tipo mixto (disparan, pero si están lo suficientemente cerca correrán para atacar)
    • Los tiradores de largo alcance sortean obstáculos si no pueden disparar.
    • Hay un inventario incorporado para el botín después de una muerte.
    • Zona de aparición
    • Lista de clases
    • oportunidad de generación
    PNJ
    • NPC de la ciudad patrullando su zona de generación
    • PNJ únicos
    • Controlador de programación básico para NPC únicos
    • Reacción al daño (huir o usar armas existentes)
    • Inventario incorporado para botín después de matar.
    • Sistema de diálogo de objetos
      • árbol de diálogo
      • Cada respuesta es un objeto.
      • Para cada respuesta, puede agregar cualquier lógica o condición de accesibilidad.
      • Interfaz de diálogo
      • Varias clases de respuesta listas para usar (comienza a operar, toma recursos, si los hay, sale del diálogo)
    Construcción
    • Clase de estructuras que soportan la colocación.
    • Usar elementos de recursos del inventario al colocarlos.
    • Ajuste en algunos tipos de estructuras (por ejemplo, paredes, cimientos, ventanas)
    • Menú con diseños
    • Destacar estructuras que tienen suficientes recursos.
    Además
    • Un pequeño mapa con una ciudad, bosque, cuerpos de agua (se puede nadar).
    • Sistema día/noche
    • Coches
      • Vista desde el primero o el tercero. Común con el persa
      • Encendido/apagado de faros.
      • Componente de inventario incorporado (es necesario interactuar con él en el maletero)
    • Escaleras verticales algo funcionales.
    • Menú principal
    • Menú de pausa
    • Menú de configuración de gráficos

    Sin embargo, podemos hablar del proyecto sin cesar. Y para no convertir el artículo en un libro, te sugiero que te familiarices con el juego y sus capacidades a través de un vídeo. Y para aquellos que estén realmente interesados, justo debajo pueden encontrar grabaciones de todas las transmisiones, enlaces a las fuentes y la versión del juego.

    Contenido en partes

    1. Iniciamos y planificamos el proyecto. Creamos los controles y el comportamiento del personaje.
    2. Comencemos a hacer un sistema de inventario.
    3. Seguimos construyendo la base del sistema de inventario.
    4. Estamos preparando una base para equipos y armas.
    5. Trabajando en armas y usando cartuchos.
    6. Realizamos disparos automáticos y apuntamos.
    7. Creando un sistema de elaboración básico.
    8. Correr, reciclar objetos y desgastarlos.
    9. Estamos implementando recarga de armas.
    10. Fabricación de armas cuerpo a cuerpo.
    11. Terminamos el combate cuerpo a cuerpo y hacemos una escalera por la que podrás subir.
    12. Realizamos objetos interactivos: Madera, piedra, arbustos.
    13. Hacemos un HUD y comenzamos a hacer una interfaz para el inventario.
    14. Seguimos trabajando en la interfaz de inventario. Generamos celdas con objetos.
    15. Seguimos generando celdas y buscando un lugar para el artículo. Agregar páginas de inventario.
    16. Hacemos una pequeña interacción con los elementos del inventario y una ventana de información detallada.
    17. Creamos Arrastrar y soltar para arrastrar elementos a través del inventario y a otro inventario.
    18. Esta parte trata sobre visualizar la elaboración.
    19. Creamos una ventana con la opción de elegir la cantidad de elementos de la pila para transferir a otro inventario.
    20. Estamos brindando soporte para varias recetas de elaboración, además de corregir varios errores en el inventario.
    21. Estamos creando un sistema para cambiar el día y la noche, y también creando una nueva escena para nuestro proyecto.
    22. Estamos empezando a crear IA para robots agresivos.
    23. Realizamos un ataque a mobs, así como una reacción a un ataque. Además, implementamos la recolección de botín de mobs muertos.
    24. Estamos creando una zona de generación para NPC. También estamos agregando la generación de artículos aleatorios en el inventario.
    25. Estamos actualizando a 4.13 y también creando NPC agresivos de largo alcance.
    26. Agregando diferentes elementos al HUD. Añadiendo recarga manual de armas.
    27. Estamos terminando el soporte para ropa y gorros de esqueleto. Añadiendo animación para armas en primera persona.
    28. Estamos creando una interfaz para trabajar con nuestro sistema de equipos.
    29. Estamos comenzando a crear un sistema comercial y un componente de administración de dinero.
    30. Seguimos operando creando y personalizando el componente comercial.
    31. Cancelamos la operación y también configuramos la animación de recarga.
    32. Creamos un vehículo con nuestro propio equipamiento, faros y cambio de vista. Creemos una linterna.
    33. Creamos una construcción (o mejor dicho, un sistema para colocar objetos frente a nosotros).
    34. Hacemos una interfaz para la construcción, hacemos un enlace para paredes.
    35. Creamos varios tipos más de estructuras: carpa, cama, silla, mesa, lámpara, puerta. pecho, fuego.
    36. Añade un techo y ventanas. Completamos la alineación con respecto a otras estructuras.
    37. Creamos un pequeño asentamiento y también lo poblamos con NPC, que también creamos en esta lección.
    38. Estamos empezando a crear un sistema de diálogo para nuestros residentes.
    39. Configuración de niebla y posprocesamiento. Importamos el modelo zombie y personalizamos sus animaciones.
    40. Estamos terminando el sistema de diálogo.
    41. Realizamos interacción con objetos de una tercera persona, así como modificadores de armadura.
    42. Creamos el menú principal, menú de pausa y configuración de gráficos. También estamos armando la primera versión del juego.
    43. Estamos implementando un cronograma para residentes únicos y también para que los NPC de la ciudad huyan de los ataques.
    44. Estamos agregando un menú contextual al inventario y también solucionando algunos errores en nuestro inventario.
    45. Agregamos retroceso, propagación, animación de disparo y la capacidad de golpear con armas de fuego.
    46. Completaremos los NPC agresivos y urbanos y solucionaremos varios errores asociados con ellos.
    47. Configuración de animaciones para el personaje principal. Añadiendo varias prendas.
    48. Estamos solucionando varios errores en nuestro juego.
    49. Estamos solucionando varios errores de creación, NPC y equipos en nuestro juego.
    50. Estamos finalizando un poco el mapa y armando la última versión.

    ¿Qué son todos estos directorios y archivos?

    Al igual que en Unity, los proyectos en Unreal suelen estar ubicados en su propia carpeta y tienen su propio archivo de proyecto. tu puedes hacer doble clic Por .uproyecto archivo para cargar tu juego en Unreal Editor, o hacer clic derecho para opciones adicionales. Dentro de las carpetas del proyecto hay varios subdirectorios diferentes que contienen los materiales y el código fuente del juego y también varios archivos de configuración. Pero los subdirectorios más importantes son Contenido Y Fuente.

    ¿Dónde puedo colocar los archivos de contenido del juego?

    En UE4, cada proyecto tiene una carpeta. Contenido. Es algo similar a la carpeta Activos en Unity, contiene materiales para tu juego. Para agregar material al juego, simplemente puedes mover los archivos a la carpeta Contenido del proyecto con el que estás trabajando y aparecerán automáticamente en el archivo . Los materiales en el editor se actualizarán automáticamente tan pronto como realice cambios utilizando cualquier otro programa.

    ¿Qué archivos son compatibles?

    Unity admite una gran cantidad de tipos de archivos, mientras que Unreal Engine 4 solo admite los tipos de archivos más comunes:

    Tipo de activoFormatos admitidos
    3D.fbx, .obj
    Textura.png, .jpeg, .bmp, .tga, .dds, .exr, .psd, .hdr
    Sonido.wav
    Fuentes.ttf, .otf
    Vídeos.mov, .mp4, .wmv

    ¿Cómo y dónde se guarda mi escena?

    En Unity, colocas GameObjects en una escena y guardas la escena como Escena. En irreal hay Archivo de mapa, algo que recuerda a Unity Scene. Los archivos de mapas contienen datos sobre su Nivel y los objetos que contiene, así como datos de iluminación y ajustes de niveles especiales.

    ¿Cómo cambiar la configuración del proyecto?

    Puede ir a la configuración del proyecto desde el menú principal yendo a Editar / Configuración del proyecto. Al igual que en Unity, en la configuración puedes cambiar los datos del proyecto (como el nombre y los íconos del proyecto), cambiar los atajos de teclado y definir el comportamiento del motor al ejecutar tu juego. Puede obtener más información sobre la configuración de proyectos individuales. Unity también tiene lo que comúnmente se llama "configuración del reproductor". En Unreal, esto se denomina "configuración de plataforma" y se puede cambiar en la categoría "Plataformas" en la página de configuración del proyecto.

    ¿Dónde están mis fuentes?

    En Unity, estás acostumbrado a almacenar archivos fuente de C# en la carpeta de materiales del juego.

    UE4 funciona de manera diferente. Para proyectos que usan código C++, puede encontrar el subdirectorio " Fuente" dentro de la carpeta del proyecto, que tiene muchos archivos diferentes, incluidos archivos fuente de C++ (.cpp) y archivos de encabezado (.h), así como algunos archivos de compilación (.Build.cs, .Target.cs). Sin embargo, solo se basa en proyectos. Los planos no tienen una carpeta de origen.

    La forma más sencilla de empezar a utilizar C++ en UE4 es utilizar la función de editor Agregar código al proyecto(en el menú principal del archivo), o simplemente cree un nuevo proyecto C++ desde cero, basado en una o más plantillas. Puede encontrar clases de C++ directamente en administrador de contenido (navegador de contenido) y abrirlos en Visual Studio o Xcode haga doble clic en el botón izquierdo del mouse en sus íconos.

    De GameObjects a actores

    ¿Dónde está mi GameObject?

    En Unity, un GameObject es algo que se puede colocar en un escenario. El UE4 equivalente a esto es el ector. En Unreal Editor, puedes mover un nuevo actor Vacío a la ventana gráfica desde el panel Ubicación:

    Por supuesto, puedes crear un juego con actores vacíos, pero UE4 también tiene varios tipos de actores especiales con configuraciones especiales, como Peón (para jugadores u objetos de IA) o Personaje (para criaturas animadas). Además de actores vacíos, puede mover estos tipos especiales de actores a la ventana de descripción general y luego configurar sus propiedades o agregar los componentes necesarios. Aprenderás más sobre esto, pero por ahora intenta recordar que UE4 tiene un marco de juego que funciona con estos actores especiales.

    Los actores en UE4 son un poco diferentes a los GameObjects en Unity. En Unity, GameObject es una clase C# que no se puede extender directamente. En UE4, Actor es una clase de C++ que puedes ampliar y personalizar mediante herencia. ¡Hablaremos más de esto más adelante!

    ¿Dónde están mis componentes?

    En Unity, agregas componentes a un GameObject para darle funcionalidad.

    En UE4, agregas componentes a los actores. Después de haber colocado un actor vacío en su nivel, haga clic en el botón Agregar componente (en el Detalles panel) y elija un componente para agregar. Aquí, estamos creando una antorcha soltando un Actor vacío, luego agregando un componente de malla para la base, seguido de una fuente de luz y luego un sistema de partículas para crear su llama.

    En Unity, un GameObject contiene una lista plana de componentes, pero en UE4 un Actor en realidad contiene una jerarquía de componentes unidos entre sí. Puedes ver esto en el ejemplo anterior, donde la Luz y la Partícula están unidas a la Malla. Esto tiene algunas implicaciones importantes que se analizan más adelante en Actores complejos y objetos de juego.

    De las casas prefabricadas de Unity a las clases de planos UE4

    El flujo de trabajo de Unity se basa en casas prefabricadas. En Unity, usted crea un conjunto de GameObjects con componentes y luego crea una casa prefabricada a partir de ellos. Luego puede colocar instancias de la casa prefabricada en su mundo o crear una instancia de ellas en tiempo de ejecución.

    El flujo de trabajo correspondiente de UE4 se basa en clases de planos. En UE4, crea un actor con componentes, lo selecciona y hace clic en " Plano/Agregar script" botón (en el Detalles panel). Luego, elija un lugar para guardar su clase de Blueprint y haga clic en " Crear plano" para guardar tu nueva clase Blueprint.

    Tus nuevas clases de Blueprint se pueden encontrar en el Navegador de contenido. Puede haga doble clic para editarlos directamente, o puedes arrastrarlos y soltarlos en cualquier nivel.

    ¿Dónde está el componente Script y MonoBehaviour?

    En Unity, tienes componentes de script que colocas en GameObjects para agregar scripts de C#. Creas una clase que hereda de MonoBehaviour para definir qué hace ese componente.

    UE4 tiene algo similar. Puede crear clases de componentes completamente nuevas y colocarlas en cualquier actor. Puede crear clases de componentes utilizando Blueprint Scripting o C++.

    Entonces, ¿cómo creas tu propia clase de componente en UE4? En el Detalles En el menú desplegable Agregar componente del panel, verá que puede crear nuevos componentes o elegir los existentes:

    En Unity, al crear un nuevo MonoBehaviour, se le proporcionará un archivo de clase esqueleto con una función Start() y una función Update().

    En UE4, también se le proporcionará una clase esqueleto con una función InitializeComponent() y una función TickComponent(), que realizan funciones similares a Iniciar y Actualizar.

    Si crea un componente de script de Blueprint, se le asignarán estas mismas funciones que los nodos visuales:

    Clases de planos de actores programables

    Aquí hay una característica interesante en UE4: ¡Su nueva Clase de Actor Blueprint puede tener su propio Blueprint Visual Scripting! Esto le permite agregar lógica a un objeto completo, no solo a un componente individual. Combinado con la herencia (que se explica a continuación), esto te brinda mucha flexibilidad al diseñar tu juego.

    Además de las clases Blueprint que admiten secuencias de comandos visuales, UE4 también admite clases C++ implementadas con código. Aquí están ambos, uno al lado del otro.

    Unidad C#UE4C++
    usando UnityEngine; utilizando el sistema. Colecciones; clase pública MiComponente: MonoBehaviour (int Count; // Utilice esto para la inicialización. Inicio vacío() (Cuenta = 0;) // La actualización se llama una vez por cuadro. Actualización vacía() (Contar = Contar + 1; Depurar. Iniciar sesión (Contar); ))#pragma once #include "GameFramework/Actor.h" #include "MyActor.generated.h" UCLASS () clase AMyActor: público AActor (GENERADO_BODY () int Count; // Establece valores predeterminados para las propiedades de este actor. AMyActor () ( // Permite que Tick() se llame PrimaryActorTick . bCanEverTick = true ; ) // Se llama cuando comienza el juego o cuando se genera. void BeginPlay () ( Super :: BeginPlay (); Count = 0 ; ) // Llama a cada cuadro. void Tick (flotante DeltaSeconds) ( Super :: Tick ( DeltaSeconds ); Count = Count + 1 ; GLog -> Log ( FString :: FromInt ( Count )); ) );
    Plano UE4

    Las clases de UE4 Blueprint se pueden ampliar

    Se pueden crear instancias de Unity prefabs y UE4 Blueprint Classes en tu juego de manera similar. Sin embargo, Unity tiene complicaciones relacionadas con el anidamiento de casas prefabricadas dentro de otras casas prefabricadas, lo que limita su función como bloques de construcción extensibles.

    En UE4, puede crear una nueva clase Blueprint que amplía una clase Blueprint existente y la aumenta con nuevas propiedades, componentes y funcionalidad de secuencias de comandos visuales.

    Por ejemplo, en UE4 puedes crear una clase Blueprint llamada Monster que implementa funciones básicas de monstruos, como perseguir personas. Luego puedes crear más clases de planos que lo amplíen, como Dragón (un tipo de monstruo que agrega características de escupir fuego), Grue (un monstruo que probablemente te comerá cuando esté oscuro) y, por ejemplo, ocho más. Todas estas subclases de Monster heredan la funcionalidad básica de Monster y agregan nuevas capacidades además.

    En Unity, podrías implementar esto creando muchos prefabricados de GameObject diferentes: uno para Dragon, otro para Grue, etc. Ahora, supongamos que desea agregar alguna funcionalidad nueva a todos los monstruos, como la capacidad de hablar usando su nuevo componente Speak. En Unity, debe actualizar los 10 prefabricados para copiar y pegar individualmente la nueva funcionalidad en ellos.

    En UE4, puedes simplemente modificar la clase Monster Blueprint para agregar esta nueva habilidad de hablar. ¡Eso es todo! Dragon, Grue y las otras 8 subclases de Monster heredan automáticamente la nueva funcionalidad de hablar y no es necesario que los toques.

    ¡Pero hay más! Todo lo que hemos dicho aquí sobre las clases Blueprint también se aplica a las clases C++, y todo es igualmente cierto para los actores y componentes. Estos sistemas están diseñados para soportar el desarrollo a gran escala de funcionalidad extensible y pueden escalar a proyectos con 10 o 100 desarrolladores.

    ¿Debo utilizar Blueprint Scripting, C++ o ambos?

    Blueprint Visual Scripting es ideal para un flujo lógico simple en el juego y una secuenciación de acciones. Es un gran sistema para diseñadores, artistas y programadores orientados visualmente, porque es fácil acceder y controlar visualmente los objetos del juego. Incluso puedes crear un pequeño juego independiente usando solo planos; vea la muestra de Tappy Chicken para ver un ejemplo completo.

    La programación en C++ es para tareas de mayor escala, como la creación de sistemas de juego, IA compleja y nuevas funciones de motor. Si ya tiene algo de experiencia en C++, consulte la página Introducción a la programación en C++ en UE4.

    La mayoría de los proyectos utilizarán una combinación de Blueprints y C++. Muchos desarrolladores crean prototipos de funciones de juegos utilizando Blueprints, porque es muy fácil y divertido, y luego trasladan parte o la totalidad a C++ para lograr rendimiento y rigor de ingeniería.

    Las clases Blueprint pueden ampliar las clases C++

    Gran parte de la magia del desarrollo de juegos UE4 proviene de la interacción entre programadores que implementan nuevas funciones en C++, con diseñadores y artistas que las utilizan en Blueprints y luego piden más. Así es como un equipo podría estructurar un juego de disparos basado en UE4 implementando recolecciones utilizando una combinación de programación de sistemas de clases C++ y clases de planos para comportamiento y apariencia:

    Transformar componentes

    En Unity, cada GameObject tiene un componente Transform, que le da al GameObject una posición, rotación y escala en el mundo.

    Al igual que en UE4, los actores tienen una Componente raíz, que puede ser cualquier subclase del componente de escena. A Componente de escena le da al Actor una ubicación, rotación y escala en el mundo que se aplica jerárquicamente a todos los componentes debajo de él. Muchos de los componentes que utilizará están subclasificados de Componente de escena, ¡porque es realmente útil tener una posición!

    Incluso si coloca un actor vacío, UE4 creará una "raíz de escena predeterminada" para ese actor, que es simplemente un componente de escena simple. Si coloca un nuevo componente de escena propio, reemplazará la raíz de escena predeterminada.

    Objetos compuestos

    En Unity, creas objetos compuestos construyendo una jerarquía de GameObjects y relacionando sus transformaciones juntas:

    En UE4, creas objetos de juego compuestos anidando componentes jerárquicamente:

    Como puede ver en el diagrama, se pueden crear jerarquías anidadas adjuntando componentes de escena entre sí, ya que tienen una transformación, similar a las transformaciones parentales en Unity. Los componentes de actor (la clase base para todos los componentes) solo se pueden adjuntar directamente al propio actor.

    ¿Construyo todo a partir de componentes?

    Realmente depende de usted, pero la mayoría de las veces usará una combinación de tipos de componentes personalizados junto con clases de Actor que usan esos componentes. Mencionamos esto antes, pero UE4 tiene muchos tipos especiales de Actores que garantizan un cierto nivel de capacidad y siempre incluyen ciertos componentes. Por ejemplo, un Personaje siempre contiene un Componente de movimiento del personaje.

    Hay varios tipos de actores subclasificados que encontrarás rápidamente en el motor y que son útiles en casi todos los tipos de juegos. Aquí hay una lista de nuestros actores integrados más comunes:

      Empeñar- Un tipo de actor que representa un objeto de juego controlable; normalmente, los jugadores y la IA mueven los peones a través de un controlador propietario.

      Personaje- Una versión más especializada de Pawn diseñada para avatares bípedos que maneja gran parte de la complejidad de ese tipo de objetos del juego.

      Controlador- Posee y controla un Peón. Al separar el peón del controlador, puedes escribir controladores AI que puedan manipular un peón usando la misma interfaz que usaría el jugador.

      Controlador de jugador- Un controlador más especializado diseñado para recibir información del gamepad, táctil o mouse/teclado de un jugador, y usar esa información para controlar el peón o personaje que posee.

    ¿Entonces todo es actor?

    No todo. actores son la clase más común utilizada para el juego en UE4 y el único tipo que puede ser engendrado en el Mundo. Así todo lo que coloques en tu nivel será Actor.

    El otro tipo importante que debe conocer es Objeto. El objeto es en realidad la clase base de todas las clases de Unreal, incluida Actor y muchos otros. Esta es una construcción de nivel mucho más bajo que Actor, pero aún tiene características que esperaría de una clase Unreal, como reflexión y publicación por entregas. Objeto es una clase muy básica que utilizamos cuando necesitamos definir un nuevo tipo que simplemente no encaja en el molde de un Actor. Por ejemplo, Componente actoral es la clase base para todos los componentes y se deriva de Objeto en lugar de Actor.

    ¿Qué es esto del Gameplay Framework en UE4?

    Bien, aquí es donde las cosas se vuelven un poco locas (de una manera increíble). Unity te brinda un borrón y cuenta nueva para comenzar a diseñar tu juego, y Unreal hace lo mismo. En Unity puedes construir todo a partir de GameObjects y componentes básicos, y en Unreal puedes construir todo a partir de Actores y componentes.

    Sin embargo, Unreal tiene esta capa adicional en la parte superior llamada Gameplay Framework. Esto realmente no existe en Unity en absoluto. No tienes que usarlo en Unreal, ¡pero en realidad es genial! Básicamente, si haces uso de algunas clases primitivas básicas y sigues ciertas convenciones establecidas, tu juego adquirirá automáticamente algunas características increíbles que de otro modo serían muy difíciles de implementar o actualizar (como soporte multijugador completo).

    Se han diseñado innumerables juegos increíbles sobre el marco de juego de Unreal, y vale la pena tomarse un tiempo para comprender cómo funciona. Sí, puedes crear tu propia versión de esto, ¡eso está bien si así lo deseas! Los desarrolladores de Unreal han hecho un gran uso de este marco en UE4 hoy, por lo que vale la pena tomarse un tiempo para aprenderlo.

    Para usar Gameplay Framework, realmente solo necesitas aprender las clases de Actor integradas personalizadas incluidas con Unreal, como Empeñar, Personaje, y Controlador de jugador y, finalmente, aprenderá cómo funcionan las funciones de red y replicación de Unreal. Por ahora, volvamos a lo básico.

    Cómo escribir código en UE4

    Entonces, estoy acostumbrado a programar en MonoDevelop.

    Para las secuencias de comandos Blueprint, solo necesitará Unreal Editor: ¡todo está integrado! Para escribir código en C++, descargue la versión gratuita de Visual Studio en Windows o instale Xcode en Mac. Cuando crea por primera vez un nuevo proyecto (o agrega código a un proyecto existente), UE4 crear automáticamente archivos de proyecto de Visual Studio para ti. Puede abrir Visual Studio mediante haciendo doble clic en una clase C++ dentro Navegador de contenido, o haciendo clic en el botón "Abrir Visual Studio" en el menú principal Archivo.

    Una diferencia importante en UE4: a veces tendrás que actualizar manualmente Visual Studio archivos de proyecto(por ejemplo, después de descargar una nueva versión de UE4 o al realizar cambios manualmente en las ubicaciones de los archivos fuente en el disco). Puede hacerlo haciendo clic en "Actualizar proyecto de Visual Studio" en el menú principal, o haciendo clic en "Actualizar proyecto de Visual Studio" en el menú principal. haciendo clic derecho en el archivo .uprject en el directorio de su proyecto y seleccionando "Generar archivos de proyecto de Visual Studio"

    Escritura de funciones de eventos (Inicio, Actualización, etc.)

    Si está acostumbrado a trabajar con MonoBehaviors, estará acostumbrado a métodos como Iniciar, Actualizar y OnDestroy. Aquí hay una comparación entre el comportamiento de Unity y sus contrapartes en actores y componentes UE4.

    En Unity, podríamos tener un componente simple similar a este:

    clase pública MyComponent: MonoBehaviour ( void Start () () void OnDestroy () () void Update () () )

    Pero recuerda, en UE4 puedes escribir código justo en el propio actor en lugar de simplemente codificar nuevos tipos de componentes. En realidad, esto es muy común y útil.

    De manera similar a las funciones Start, OnDestroy y Update de Unity, tenemos un conjunto similar de métodos para Actors en UE4:

    UCLASS () clase AMyActor : public AActor ( GENERATED_BODY () // Llamado al inicio del juego. void BeginPlay (); // Llamado cuando se destruye. void EndPlay ( const EEndPlayReason :: Escribe EndPlayReason ); // Llamé a cada fotograma para actualizar este actor. void Tick (flotante DeltaSeconds); );

    Cianotipo :

    Los componentes de UE4 contienen diferentes funciones. Aquí hay un ejemplo simple:

    UCLASS() clase UMyComponent: público UActorComponent(GENERADO_BODY()) // Llamado después de que se creó el actor propietario void InicializarComponente(); // Se llama cuando se destruye el componente o el actor propietario. void UninitializeComponent(); // Versión del componente de Tick void TickComponent (float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction * ThisTickFunction); );

    Cianotipo :

    Recuerde, en UE4 es importante llamar a la versión del método de la clase principal.

    Por ejemplo, en Unity C# esto se llamaría base.Update(), pero en UE4 C++ usaremos Super::TickComponent():

    void UMyComponent :: TickComponent (float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction * ThisTickFunction) (//Marcas personalizadas aquí Super :: TickComponent (DeltaTime, TickType, ThisTickFunction);)

    Es posible que hayas notado que algunas cosas comienzan con "A" y otras con "U" en C++. El prefijo "A" indica una subclase de Actor. Mientras que el prefijo "U" indica una Objeto subclase También hay otros prefijos, por ejemplo, "F" se usa para la mayoría de las estructuras de datos simples o clases que no son UObject.

    Escribir código de juego en UE4

    Bien, las cosas se volverán un poco más profundas de ahora en adelante. Hablaremos sobre temas de programación que son fundamentales para la creación de juegos. Como conoces Unity, explicaremos características orientadas a los usuarios de C# que aprenden Unreal C++, ¡pero puedes usar Blueprint Scripting para casi todo si lo deseas! Hemos agregado ejemplos tanto en C++ como en Blueprint siempre que fue posible.

    Hablemos de algunos de los patrones de programación de juegos más comunes y cómo abordarlos en Unreal. Muchas funciones en Unity tienen una función comparable en Unreal que debería resultar familiar. Revisaremos las funciones más comunes una por una.

    Creación de instancias de GameObject / Actor de generación

    En Unity, usamos la función Instanciar para crear nuevas instancias de objetos.

    Esta función toma cualquier tipo UnityEngine.Object (GameObject, MonoBehaviour, etc.) y hace una copia del mismo.

    GameObject público EnemyPrefab; Posición de generación pública Vector3; Rotación de generación de cuaterniones pública; void Start () (GameObject NewGO = (GameObject) Instanciar (EnemyPrefab, SpawnPosition, SpawnRotation); NewGO. nombre = "MyNewGameObject"; )

    En UE4, hay un par de funciones diferentes para crear instancias de objetos, según sus necesidades. NewObject se usa para crear nuevos tipos de UObject y SpawnActor se usa para generar tipos de AActor.

    Primero hablaremos brevemente sobre UObjects y NewObject. Subclasificar UObject en Unreal es muy parecido a subclasificar ScriptableObject en Unity. Son útiles para clases de juego que no necesitan aparecer en el mundo o tener componentes adjuntos como lo hacen los actores.

    En Unity, si creó su propia subclase de ScriptableObject, puede crear una instancia de esta manera:

    MyScriptableObject NuevoSO = ScriptableObject. Crear instancia< MyScriptableObject >();

    Y en Unreal, si creaste tu propio tipo derivado UObject, puedes crear una instancia de esta manera:

    UMyObject * NuevoObj = NuevoObjeto< UMyObject >();

    ¿Y qué pasa con los actores? Los actores se generan utilizando el método SpawnActor en un objeto World (UWorld en C++). ¿Cómo se obtiene el objeto Mundo? Algunos UObjects le proporcionan un método GetWorld; por ejemplo, todos los actores lo hacen.

    Notarás que en lugar de pasar otro Actor, pasamos la "clase" del Actor que queremos generar. En nuestro ejemplo, la clase puede ser cualquier subclase de AMyEnemy.

    Pero, ¿qué sucede si desea hacer una "copia" de otro objeto, como lo que le permite hacer Instantiate?

    A las funciones NewObject y SpawnActor también se les puede dar un objeto "plantilla" para trabajar. Unreal hará una copia de ese objeto, en lugar de hacer una "desde cero". Esto copiará todas sus UPROPERTY y componentes.

    AMyActor * CreateCloneOfMyActor (AMyActor * ExistingActor, FVector SpawnLocation, FRotator SpawnRotation) (UWorld * World = ExistingActor -> GetWorld (); FActorSpawnParameters SpawnParams; SpawnParams. Plantilla = ExistingActor; Mundo -> SpawnActor< AMyActor >(ActorExisting -> GetClass(), SpawnLocation, SpawnRotation, SpawnParams); )

    Quizás se pregunte qué significa "desde cero" en este contexto. Cada clase de objeto que crea tiene una plantilla predeterminada que contiene valores predeterminados para sus propiedades y componentes. Si no anula estas propiedades y no proporciona su propia plantilla, Unreal utilizará estos valores predeterminados para construir su objeto. Para ayudar a ilustrar esto, veamos primero un MonoBehavior, por ejemplo:

    clase pública MyComponent: MonoBehaviour (public int MyIntProp = 42; public SphereCollider MyCollisionComp = null; void Start () ( // Crea el componente de colisión si aún no tenemos uno if (MyCollisionComp == nulo) (MyCollisionComp = gameObject. AddComponent< SphereCollider >(); Mi colisión Comp. centro = Vector3. cero ; Mi colisión Comp. radio = 20,0f; ) ) )

    En el ejemplo anterior, tenemos una propiedad int cuyo valor predeterminado es 42 y un componente SphereCollider que tiene un radio predeterminado de 20.

    Podemos lograr lo mismo en Unreal usando el constructor del objeto.

    UCLASS () clase AMyActor: público AActor (GENERADO_BODY () UPROPERTY () int32 MyIntProp; UPROPERTY () USphereComponent * MyCollisionComp; AMyActor () (MyIntProp = 42; MyCollisionComp = CreateDefaultSubobject< USphereComponent >(FName(TEXT("CollisionComponent")); MyCollisionComp -> RelativeLocation = FVector::ZeroVector; MyCollisionComp -> SphereRadius = 20.0f; ) );

    En el constructor de AMyActor, hemos establecido los valores de propiedad predeterminados para la clase. Tenga en cuenta el uso de la función CreateDefaultSubobject. Podemos usarlo para crear componentes y asignarles propiedades predeterminadas. Todos los subobjetos que creamos usando esta función actúan como una plantilla predeterminada, por lo que podemos modificarlos en una subclase o Blueprint.

    Transmitir de un tipo a otro

    En este caso, obtenemos un componente que sabemos que tenemos, luego lo convertimos a un tipo específico y hacemos algo condicionalmente.

    Colisionador colisionador = gameObject. Obtener componente< Collider >; SphereCollider esferaCollider = colisionador como SphereCollider; if (sphereCollider != null ) ( // ... ) UPrimitiveComponent * Primitive = MyActor -> GetComponentByClass (UPrimitiveComponent :: StaticClass ()); USphereComponent * SphereCollider = Reparto< USphereComponent >(Primitivo); si (SphereCollider! = nullptr) (//...)

    Destruyendo GameObject/Actor

    UnidadC++Cianotipo
    Destruir(MyGameObject);MiActor -> Destruir();

    Destruyendo GameObject / Actor (con 1 segundo de retraso)

    UnidadC++Cianotipo
    Destruir(MyGameObject, 1);MiActor -> SetLifeSpan(1);

    Haga clic para ver la vista completa.

    Deshabilitar objetos/actores de juego

    UnidadC++Cianotipo
    MiObjetoJuego. EstablecerActivo(falso);// Oculta los componentes visibles MyActor -> SetActorHiddenInGame (true); // Deshabilita los componentes de colisión MiActor -> SetActorEnableCollision(falso); // Impide que el actor haga tictac MiActor -> SetActorTickEnabled (falso);

    Haga clic para ver la vista completa.

    Accediendo al GameObject/Actor desde el Componente

    UnidadC++Cianotipo
    GameObject ParentGO = Mi componente. objeto de juego;AActor * ParentActor = MiComponente -> GetOwner();

    Haga clic para ver la vista completa.

    Accediendo a un componente desde GameObject/Actor

    MiComponente MiComp = gameObject. Obtener componente< MyComponent >();< UMyComponent >();

    Cianotipo

    UMyComponent * MyComp = MyActor -> FindComponentByClass

    Encontrar objetos/actores del juego // Encuentra GameObject por nombre GameObject MyGO = GameObject. Buscar("MiObjetoJuegoConNombre"); // Buscar objetos por tipo MiComponente Componentes = Objeto. FindObjectsOfType(typeof(MyComponent)) como MyComponent; foreach (MiComponente Componente en Componentes) ( // ... ) // Buscar GameObjects por etiqueta GameObject GameObjects = GameObject. FindGameObjectsWithTag("MiEtiqueta"); foreach (GameObject GO en GameObjects) ( // ... )// Buscar actor por nombre (también funciona en UObjects)< AActor >AActor * MiActor = BuscarObjeto (nullptr, TEXTO ("MiActorNombre"));// Buscar actores por tipo (necesita un objeto UWorld)< AMyActor > para (TActorIterador(Él()); para (TActorIterador; ++ para (TActorIterador) { Obtener Mundo* AMyActor= * para (TActorIterador; // ... }

    Mi actor// Encuentra UObjects por tipo(para< TObjectIterator> para (TActorIterador; para (TActorIterador; ++ UMiObjeto) { TObjectIterator* él= * para (TActorIterador; // ... } MiObjeto// Encuentra UObjects por tipo(// Buscar actores por etiqueta (también funciona en ActorComponents, use TObjectIterator en su lugar)< TActorIterador> para (TActorIterador(Él()); para (TActorIterador; ++ para (TActorIterador) { TActorIterador* Actor= * para (TActorIterador; Actor(Actor-> si(actortieneetiqueta(FNombre(TEXTO)))) { // ... } }

    "Mi etiqueta"

    Agregar etiquetas a GameObjects / Actors. Mi objeto de juego= etiqueta; "Mi etiqueta"AMyActor. // Los actores pueden tener múltiples etiquetas.. Etiquetas(FNombre(etiqueta));

    AgregarÚnico

    Agregar etiquetas a MonoBehaviours / ActorComponents// Esto cambia la etiqueta en el GameObject al que está adjunto. Mi objeto de juego= etiqueta; Mi componente// Esto cambia la etiqueta en el GameObject al que está adjunto. // Los componentes tienen su propio conjunto de etiquetas.. Etiquetas(FNombre(etiqueta));

    Etiquetas de componentes

    Actor(Agregar etiquetas a GameObjects / Actors. Comparación de etiquetas en GameObjects/Actors y MonoBehaviours/ActorComponents(etiqueta)) { // ... } CompararEtiquetaActor(// Esto cambia la etiqueta en el GameObject al que está adjunto. Comparación de etiquetas en GameObjects/Actors y MonoBehaviours/ActorComponents(etiqueta)) { // ... } // Comprueba la etiqueta del GameObject al que está adjuntoActor(AMyActor-> si(actortieneetiqueta(FNombre(etiqueta)))) { // ... }

    // Comprueba si un actor tiene esta etiquetaActor(// Esto cambia la etiqueta en el GameObject al que está adjunto-> ComponentesHasTag(actortieneetiqueta(FNombre(etiqueta)))) { // ... }

    Física: Cuerpo Rígido vs. Componente primitivo

    En Unity, para darle características físicas a cualquier GameObject, primero le asigna un componente RigidBody. En Unreal, cualquier PrimitiveComponent (UPrimitiveComponent en C++) puede ser un objeto físico. Algunos componentes primitivos comunes son ShapeComponents (cápsula, esfera, caja), StaticMeshComponent y SkeletalMeshComponent.

    A diferencia de Unity, que separa las responsabilidades de colisión y visualizaciones en componentes separados. Unreal combina los conceptos de lo potencialmente físico y lo potencialmente visible en PrimitiveComponent. Cualquier componente que tenga cualquier geometría del mundo, que pueda representarse o interactuar físicamente con subclases de PrimitiveComponent.

    Capas vs Canales

    En Unity, se denominan "Capas". UE4 usa canales de colisión y funcionan de manera similar. Puedes leer sobre ellos.

    RayCast y RayTrace

    Objeto de juegoFindGOCameraIsLookingAt() { Vector3Comenzar= Cámara. principal. transformar. posición; Vector3Dirección= Cámara. principal. transformar. adelante; flotarDistancia= 100.0f; enteroMáscara de bits de capa= 1 << Máscara de capa. NombreACapa("Empeñar"); RaycastHitGolpear; booleanobGolpear= Física. Raycast(Comenzar, Dirección, afueraGolpear, Distancia, Máscara de bits de capa); Actor(bGolpear) { devolverGolpear. colisionador. objeto de juego; } devolvernulo; } APeón* Controlador AMyPlayer:: Buscar peónLa cámara está mirando() { // Puedes usar esto para personalizar varias propiedades sobre el seguimientoFCollisionQueryParamsparámetros; // Ignora el peón del jugadorparámetros. Agregar actor ignorado(Obtener empeño()); // El resultado del hit se completa con el seguimiento de la líneaFHitResultGolpear; // Raycast sale de la cámara, solo choca con peones (están en el canal de colisión ECC_Pawn)FVectorComenzar= ReproductorCámaraAdministrador-> Obtener ubicación de la cámara(); FVectorFin= Comenzar+ (ReproductorCámaraAdministrador-> ObtenerRotación De Cámara(). Vector() * 1000.0f); booleanobGolpear= Él()-> LineTraceÚnica(Golpear, Comenzar, Fin, ECC_Peón, parámetros); Actor(bGolpear) { // Hit.Actor contiene un puntero débil al actor al que llegó el seguimientodevolverElenco< APeón>(Golpear. Actor. Conseguir()); } devolvernulo; }

    Haga clic para ver la vista completa.

    Desencadenantes

    públicoclase// Esto cambia la etiqueta en el GameObject al que está adjunto: Monocomportamiento{ vacíoComenzar() { colisionador. es disparador= verdadero; } vacíoOnTriggerIntroducir(ColisionadorOtro) { // ... } vacíoOnTriggerSalir(ColisionadorOtro) { // ... } } CLASE U() claseObtener Mundo: públicoTActorIterador{ GENERADO_BODY() // Mi componente desencadenanteINPROPIEDAD() Componente UPrimitivo* Desencadenar; Obtener Mundo() { Desencadenar= Crear subobjeto predeterminado< Componente USphere>(FNombre("TriggerCollider")); // Ambos colisionadores deben tener esto configurado en verdadero para que se activen los eventosDesencadenar. bGenerar eventos de superposición= verdadero; // Establece el modo de colisión para el colisionador// Este modo solo habilitará el colisionador para raycasts, barridos y superposicionesDesencadenar. Establecer colisión habilitada(EColisión habilitada:: Sólo consulta); } vacíoEmpezar a jugar() { // Regístrese para saber cuándo se produce una superposiciónOnActorBeginOverlap. AgregarDinámico(este, & Obtener Mundo:: OnTriggerIntroducir); OnActorEndOverlap. AgregarDinámico(este, & Obtener Mundo:: OnTriggerSalir); Súper:: Empezar a jugar(); } vacíoJuego final(constanteEEndPlayReason:: TipoFinReproducirRazón) { OnActorBeginOverlap. EliminarDinámico(este, & Obtener Mundo:: OnTriggerIntroducir); OnActorEndOverlap. EliminarDinámico(este, & Obtener Mundo:: OnTriggerSalir); Súper: Juego final(FinReproducirRazón); } FUNCIÓN() vacíoOnTriggerIntroducir(TActorIterador* Otro); FUNCIÓN() vacíoOnTriggerSalir(TActorIterador* Otro); };

    Puede leer más sobre cómo configurar respuestas a colisiones.

    Cuerpos rígidos cinemáticos

    públicoclase// Esto cambia la etiqueta en el GameObject al que está adjunto: Monocomportamiento{ vacíoComenzar() { cuerpo rígido. esKinimatic= verdadero; cuerpo rígido. velocidad= transformar. adelante* 10.0f; } }

    En UE4, el componente de colisión y el componente de cuerpo rígido son uno. La clase base para esto es UPrimitiveComponent, que tiene muchas subclases (USphereComponent, UCapsuleComponent, etc.) para satisfacer sus necesidades.

    CLASE U() claseObtener Mundo: públicoTActorIterador{ GENERADO_BODY() INPROPIEDAD() Componente UPrimitivo* Compensación física; Obtener Mundo() { Compensación física= Crear subobjeto predeterminado< Componente USphere>(FNombre("Colisión y física")); Compensación física-> ConjuntoSimularFísica(FALSO); Compensación física-> ConjuntoFísicaLinealVelocidad(ObtenerActorRotación(). Vector() * 100.0f); } };

    Eventos de entrada

    públicoclaseMi controlador de jugador: Monocomportamiento{ vacíoActualizar() { Actor(Aporte. Obtener botón abajo("Fuego")) { // ... } flotarHorizonte= Aporte. Obtener eje("Horizontal"); flotarverde= Aporte. Obtener eje("Vertical"); // ... } } CLASE U() claseControlador AMyPlayer: públicoControlador de reproductor AP{ GENERADO_BODY() vacíoComponente de entrada de configuración() { Súper:: Componente de entrada de configuración(); Componente de entrada-> VincularAcción("Fuego", IE_Presionado, este, & Controlador AMyPlayer:: Evento HandleFireInput); Componente de entrada-> Vincular eje("Horizontal", este, & Controlador AMyPlayer:: ); Componente de entrada-> Vincular eje("Vertical", este, & Controlador AMyPlayer:: HandleVerticalAxisInputEvent); } vacíoEvento HandleFireInput(); vacíoHandleHorizontalAxisInputEvent(flotarValor); vacíoHandleVerticalAxisInputEvent(flotarValor); };

    Así es como se verían sus propiedades de entrada en la Configuración del proyecto:

    Preguntas frecuentes

    ¿Cómo cargo mi último proyecto automáticamente?

    Si está acostumbrado a que Unity cargue automáticamente el último proyecto en el que estaba trabajando, lo mismo es posible en UE4. Para habilitarlo, marque "Cargar siempre el último proyecto al iniciar" al abrir un proyecto. También puede alternar la configuración en cualquier momento desde el menú Editar principal en Editar/Preferencias del editor/Cargar y guardar/Inicio.

    ¿Dónde configuro los enlaces de entrada para mi juego?

    En Unity, está acostumbrado a utilizar la configuración del Administrador de entrada para Project para configurar enlaces predeterminados. En UE4 funciona de manera similar. Abrirá la Configuración del proyecto y luego seleccionará la categoría Entrada. Allí puedes agregar varios botones (acciones) y controles analógicos (ejes). Asigne a cada control un nombre y un enlace predeterminado. Luego, podrás recibir devoluciones de llamada al peón de tu juego cuando se activen los eventos de entrada. Consulta la página de documentación de entrada para obtener más detalles.

    ¿Cómo cambio la escena inicial de mi proyecto?

    Puede cambiar el mapa de inicio de su proyecto desde la pestaña de configuración del proyecto. En el menú principal, elija Editar/Configuración del proyecto->Mapas y modos para cambiar el mapa inicial.

    ¿Cómo ejecuto mi juego?

    La forma más sencilla de ejecutar el juego es hacer clic en el botón "Jugar" en la barra de herramientas principal del editor, que ejecutará el juego directamente dentro del proceso del editor. Si desea ejecutarlo como una aplicación independiente, haga clic en la flecha desplegable que aparece a continuación. Para "Jugar" y elija "Juego independiente". Finalmente, si desea ejecutarlo en un dispositivo móvil o en un navegador web, utilizará el botón "Iniciar" en la barra de herramientas (después de instalar los requisitos previos necesarios para esa plataforma). .)

    ¿Qué unidades son estas?

    En Unity, la unidad de medida principal es el metro. En UE4, la unidad de medida principal es el centímetro.

    Entonces, si mueves algo 1 unidad (metro) en unidad, eso equivale a mover algo 100 unidades (centímetros) en UE4.

    Si desea mover algo 2 pies en unidad, serían 0,61 unidades (metros) y en UE4 son 61 unidades (centímetros).

    ¿Qué pasa con este sistema de coordenadas? ¿Cuál es el camino hacia arriba?

    Tanto Unity como UE4 utilizan un sistema de coordenadas para zurdos, pero los ejes se intercambian. En UE4, X positivo está "hacia adelante", Y positivo es "derecha" y Z positivo está "arriba". Esto no se puede cambiar, por lo que tendrás que acostumbrarte.

    ¿Cómo veo la salida del registro de mi juego?

    En el editor UE4, puede abrir el "Registro de salida" desde el menú "Ventana -> Herramientas de desarrollador". También puedes ejecutar tu juego con el parámetro de línea de comandos "-log" para abrir una ventana de registro dedicada junto a tu juego, ¡lo cual es realmente útil!

    Hablando de salida de registro, ¿dónde está mi Debug.Log?

    Iniciar sesión en UE4 es altamente personalizable. Lea sobre cómo registrar mensajes.

    ¿Cómo lanzo excepciones?

    En Unity, estás acostumbrado a generar excepciones cuando las cosas van mal. UE4 no utiliza manejo de excepciones. En su lugar, utilice la función "check()" para desencadenar un error de afirmación crítica. Puede pasar un mensaje de error. Si desea informar un error pero no detener el programa, utilice "ensure()" en su lugar. Esto registrará un error con una pila de llamadas llena, pero la ejecución del programa continuará. Si tenía un depurador adjunto, ambas funciones entrarán en el depurador.

    ¿Dónde está .NET Framework?

    A diferencia de Unity, UE4 no utiliza el marco .NET. UE4 tiene su propio conjunto de bibliotecas y clases de contenedores. Comparaciones de contenedores comunes:

    Marco .NetUE4
    CadenaFString, FTexto
    Listamatriz
    DiccionarioMapa
    Conjunto de hashTSet

    ¿Unreal recarga automáticamente los cambios de código?

    ¡Sí! Puedes dejar el editor abierto mientras escribes código. Simplemente inicie una compilación desde Visual Studio después de haber terminado de editar el código y el editor "recargará en caliente" sus cambios automáticamente. También puede hacer clic en Compilar en la barra de herramientas principal del editor. Esto puede resultar útil cuando tiene adjunto el depurador de Visual Studio.

    A dónde ir desde aquí

    ¡Gracias por leer la guía! Esto fue creado para la comunidad de Unreal con la ayuda de los desarrolladores de Unreal de todo el mundo y apreciamos mucho cualquier comentario y corrección que pueda ofrecer. ¡Intentaremos seguir mejorando este documento a medida que aprendamos más sobre lo que es más útil al realizar la transición a UE4!

    ¡Tenemos muchos recursos de aprendizaje adicionales de UE4 disponibles!

    Habilite JavaScript para ver Ya hemos informado que la empresa Juegos épicos El mes pasado lanzó la versión 4.7 de su motor de juegos de alta tecnología, que incluía una gran cantidad de innovaciones, mejoras, mejoras y correcciones de errores encontrados en la versión anterior. En particular, ha mejorado la funcionalidad para implementar mundos abiertos, ha aumentado el realismo del follaje y también ha mejorado la implementación. Cianotipo para simplificar aún más la creación de prototipos de juego y mucho más.

    Si se perdió los eventos de motores presentados en GDC 2015, hay muchas cosas que se está perdiendo. En particular, fue allí donde se anunció la disponibilidad gratuita actual. UE4(a partir del 2 de marzo), se mostró una demostración en tiempo real con un mundo abierto " Cometa", se mostró " Ladrón en las sombras" Para realidad virtual en colaboración con Weta Digital, el motor de física fue de código abierto desde Nvidia especialmente para los usuarios UE4 y muchos otros

    También se ha mejorado Mercado, donde ahora puedes explorar las herramientas y recursos que se ofrecen sin iniciar el iniciador, directamente a través de tu navegador. Por cierto, todos los suscriptores del motor, después de que se volvió de acceso abierto, recibieron dinero en su cuenta para gastarlo posteriormente en esta tienda.

    Pero la generosidad Juegos épicos La cosa no terminó ahí y continuó buscando proyectos prometedores para los usuarios, proporcionando a sus desarrolladores dinero de un fondo especial. Subvenciones para desarrolladores irreales, que ella había organizado previamente con este fin, llenando su banco con 5.000.000 de dólares. También hablamos de esto en las páginas. sitio web. Pero hoy me gustaría llamar su atención sobre varios proyectos de este tipo que han recibido incentivos monetarios de Juegos épicos.

    De nuevos proyectos en adelante UE4 Puedes observar las obras del artista francés. Koola, quien se dedica a la implementación de escenas fotorrealistas, simultáneamente comparte su trabajo y ayuda a otros usuarios en el foro oficial del motor. Puedes ver videos en su canal en el servicio. YouTube. Este desarrollador recibió una subvención de 18.000 dólares.

    Jake Kaufman Y Jessie Seely en el servicio Pedal de arranque lanzó una campaña de recaudación de fondos para implementar su proyecto " El nuevo renacimiento» en la base UE4 y recaudó los 70.000 dólares necesarios. Esta será la primera ópera rock en realidad virtual. Este proyecto también recibió una subvención de Juegos épicos por un monto de $18.000.

    y el desarrollador Mike Blackney hace un juego de terror " Gran robo de Cthulhu", que estiliza como cómics de los años 80. Juega solo, con la ayuda de amigos. Compañía Juegos épicos proporcionó al promotor de este proyecto una subvención de 15.000 dólares. Puedes ver un vídeo sobre el juego en YouTube.

    Tres graduados universitarios de Alemania están implementando un proyecto arquitectónico " Consight"para iPad. Su proyecto recibió $15,000 en apoyo bajo Subvención para desarrolladores irreales. Podrás conocer detalles sobre su desarrollo.

    y el equipo Magia y espejos, consistente en Kevin Bryant, Kevin Greenlee Y Michelle Morger, trabajando en el juego " nelo" Es un juego de acción en tercera persona con combates trepidantes y gráficos impresionantes. Este proyecto se mostró en el stand. Motor irreal en la última exposición GDC. El estudio recibió una subvención de 20.000 dólares. Puede visitar el sitio web oficial para obtener más detalles.

    Desarrollador único Adrián Lázaro de Brasil lleva 9 meses trabajando en el proyecto” Planeta Alfa 31" este juego Juegos épicos también se mostró en la última exposición GDC 2015, proporcionando a su desarrollador una subvención en efectivo por valor de 15.000 dólares. Puedes encontrar más información sobre el juego en su sitio web oficial.

    Por cierto, queridos creadores de juegos. sitio web, si tienes un proyecto de alta calidad que estás desarrollando en UE4, entonces puedes contar con una recompensa similar (de $5,000 a $50,000) si contactas Juegos épicos utilizando la información de contacto proporcionada en esta página.

    ¡No pierdas el tiempo! Una vez que recibas el dinero, podrás preocuparte menos por el desarrollo, prestando más atención al proyecto, sin distraerte con los problemas cotidianos. Además, para la Federación de Rusia estas cantidades son bastante importantes y, a menudo, cubren por completo todos los costes de producción del juego.



    
    Arriba