Ensayo de creación de simios | [Práctica de desarrollo de juegos - Proyecto 2D 1 - La aventura de Ruby] Controlar el movimiento de los personajes del juego (1-2)

1) Guía del usuario

①Prólogo
El proceso de desarrollo completo de este proyecto ha escrito documentos tutoriales detallados en los documentos de enseñanza del proyecto oficial de Unity , pero debido a que los documentos oficiales han estado fuera por un tiempo, hay errores en algunos lugares o los lectores están usando el editor de Unity en sus propias máquinas. En el proceso de operación, todavía encontré problemas dispersos, que ya no pueden corresponder al tutorial oficial. Este blog es un complemento de los proyectos proporcionados por el sitio web oficial, así como una revisión personal y el intercambio de experiencias.

Esta serie de blogs se deriva del tutorial oficial, pero definitivamente será superior al tutorial oficial al final, permitiendo a los lectores integrar el tutorial oficial y mi propia sublimación, y poder desarrollar de forma independiente un juego más completo y factible que el tutorial oficial.
Los resultados finales de desarrollo y los recursos también serán de código abierto en GitHub y Gitee.

②Dirección del tutorial
oficial [ Documento oficial: 1. Configuración del editor de Unity ]
[ Documento oficial: 2. El protagonista y el primer guión ]
[ Documento oficial: 3. Controlador de caracteres y entrada de teclado ]
③Cómo manejar esta serie de blogs y el relación entre el tutorial oficial

Mi sugerencia personal es primero navegar por los blogs de esta serie de columnas, obtener una impresión preliminar de las precauciones y los puntos clave, y luego seguir los documentos oficiales para operar paso a paso.

Debido a que esta serie de blogs es una revisión, un complemento y una sublimación del tutorial oficial, y el contenido de esta serie de blogs no será particularmente largo, le llevará entre 5 y 7 minutos leerlo por completo.
Si solo observa el contenido del artículo y presta atención a los lugares que deben corregirse, solo tomará aproximadamente 1 minuto.
inserte la descripción de la imagen aquí

2) Análisis detallado de pasos específicos

2.1) "1. Crear una nueva escena" y luego agregar

En el tutorial oficial, no hay una introducción sobre cómo colocar la cámara después de crear una nueva escena, por lo que se complementa hasta cierto punto.

En esta etapa, también puede usar directamente el SampleScene incorporado después de crear un proyecto 2D para realizar operaciones posteriores.
inserte la descripción de la imagen aquí

En la escena MainScene creada, agregue las siguientes operaciones:
① Crear un nuevo objeto de juego vacío
Crear vacío En el editor de Unity, significa crear un objeto de juego vacío.

Escenas famosas: aprendizaje orientado a objetos

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
② Agregar componentes de la cámara

inserte la descripción de la imagen aquí
③ Establezca las propiedades en el componente Cámara agregado

Principalmente ajuste las Banderas claras en el Inspector a un color sólido Solid Color, y ajuste la Proyección que controla la proyección a una forma ortográfica Orthographic, y las otras se pueden mantener como predeterminadas.
inserte la descripción de la imagen aquí
Otros contenidos y pasos pueden continuar siguiendo el tutorial.
inserte la descripción de la imagen aquí

2.2) Se añade "9. Variables de Declaración"

En el tutorial oficial de Unity, la descripción de las API en cada Unity es bastante vaga. El propósito del tutorial es permitirle crear rápidamente un producto terminado. En cuanto a por qué necesita llamar a estas API, no hay una explicación detallada.

Debido a que he completado el proyecto inicialmente siguiendo el tutorial, y ahora estoy en la etapa de revisión y reconocimiento, explicaré las funciones de estas clases, funciones y variables utilizadas en el código tanto como sea posible, para que pueda puede entenderlos saber por qué.

① API Vector2tipo
- Vector2
En una escena 2D, esta estructura se puede utilizar para representar posiciones y vectores. De manera similar, cuando la escena actual es 3D, debe usar Vector3.

En este proyecto utiliza principalmente su variable x para almacenar la componente X y la variable y para almacenar la componente Y para almacenar la información de posición obtenida en coordenadas 2D.
inserte la descripción de la imagen aquí


② API de script de clase de transformación para describir la posición, la rotación y la escala de los objetos
- Transformar En el editor de Unity, el objeto del juego agregado a la escena se mostrará en la ventana del Inspector y se agregará un componente de Transformación de forma predeterminada.
inserte la descripción de la imagen aquí
En la biblioteca proporcionada por Unity, la clase Transform también está configurada para controlar el componente, para este caso, se utiliza la variable de posición.
inserte la descripción de la imagen aquí

2.3) "4. Revise los cambios de su script" y luego agregue

Como se mencionó en el tutorial anterior, la página Administrador de entrada en la ventana Editar -> Configuración del proyecto en el editor de Unity enumera todos los controles que el reproductor puede ingresar.
Al mismo tiempo, en la API proporcionada por Unity, también Input类se establece la función correspondiente para detectar la entrada del usuario en el editor .

③ Interfaz para acceder al sistema de entrada,
API de script de clase de entrada - Entrada

inserte la descripción de la imagen aquí
En el editor, en el directorio Axes donde se puede detectar la entrada del jugador, en la clase Input, también se llama a la clase GetAxis para detectar si el jugador usa Horizontal以及Vertical列表las teclas que se enumeran a continuación para las operaciones de entrada.

2.4) Se agrega "11. Expresando la velocidad de movimiento de Ruby en unidades/segundo"

Como se explica en el documento del tutorial, si escribe directamente la función de calcular el control hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha en la función Actualizar que se llama una vez por cuadro, y luego sigue la lógica de cálculo anterior, si hay un socio pequeño cuya computadora el rendimiento es mejor, como 800 cuadros por segundo, otro El rendimiento de la computadora de un amigo es relativamente promedio, como 30 cuadros por segundo.Al mismo tiempo, el amigo con buen rendimiento de la máquina ha realizado 800 cálculos de posición, mientras que el otro es bastante miserable.

La imagen a continuación son las palabras originales en el documento tutorial oficial, que puede ser difícil de leer para algunos amigos.

inserte la descripción de la imagen aquí

其大致思想是这种的:

Primero, la función que detectamos para la entrada clave se coloca en la función Actualizar, que se llama cada cuadro.
En segundo lugar, la velocidad de fotogramas de diferentes máquinas es diferente, por ejemplo, unos 10 fotogramas por segundo, luego un fotograma tarda 1/10 de segundo; unos 60 fotogramas por segundo, luego cada fotograma tarda 1/60 de segundo.
Entonces, no importa cuántos fotogramas tengan las diferentes máquinas, el cálculo final es la distancia generada por 1 segundo * velocidad.
Debido a que Update se llama de acuerdo con el cuadro, 60 cuadros se llaman 60 veces, y la distancia calculada para cada cuadro es la velocidad * el intervalo de tiempo de cada cuadro (Time.deltaTime),
总的计算式就是 60 * 速度 * 1/60 = 速度 * 1秒

④ La interfaz para obtener información de tiempo de Unity, la
API de secuencias de comandos de clase de tiempo: Time
puede usarla 静态变量deltaTime计算从上一帧到当前帧的时间间隔para resolver los problemas anteriores.
Entonces no pondré aquí el código recomendado en la documentación oficial, creo que todos lo han seguido. Ahora queremos mejorar el documento, cuando se presionan los botones de control vertical y horizontal al mismo tiempo, se produce la superposición de velocidad.
Para conocer los motivos del apilamiento rápido, puede consultar parte de este artículo:
El camino de autoaprendizaje de un desarrollador (7): el movimiento de los personajes en Unity3d

Para evitar este tipo de superposición de velocidades, una solución más unificada es usar标准化

//游戏角色的移动速度,开放为public,可以在Unity编辑器中进行设置
    public float speed =4.0f;
    //声明一个2D的刚体变量,用于存放游戏角色对象
    Rigidbody2D _rigidbody2d;
    //水平输入
    float _inputX;
    //垂直输入
    float _inputY;

    // Start is called before the first frame update
    void Start()
    {
        //返回Rigidbody2D类型的组件
        //务必已经在Ruby游戏对象上挂接Rigidbody2D组件
        _rigidbody2d = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        /*
         * GetAxisRaw不使用平滑滤波器
         * 就是说GetAxis可以返回-1到1之间的数,比如检测到按键按下的时候,由0不断增加过渡到1
         * GetAxisRaw只能返回-1,0,1三个值!
         */
        _inputX = Input.GetAxisRaw("Horizontal");
        _inputY = Input.GetAxisRaw("Vertical");
		
        Vector2 input = new Vector2(_inputX, _inputY).normalized;
        _rigidbody2d.velocity = input * speed;
        
    }

⑤ Componentes físicos de Rigidbody para sprites 2D, API de secuencias de
comandos Rigidbody2D - Rigidbody2D
Después de agregar componentes Rigidbody2D a los sprites, su movimiento será controlado por el motor de física. Esto significa que el sprite se verá afectado por la gravedad y se puede controlar usando fuerzas en el script. Al agregar componentes colisionadores apropiados, los sprites también pueden responder a las colisiones con otros sprites.
La clase Rigidbody2D proporciona básicamente la misma funcionalidad que la clase Rigidbody, con la diferencia de que Rigidbody2D se usa en entornos 2D y Rigidbody se usa en entornos 3D.

⑥ Se usa para devolver el objeto del juego que engancha el componente Rigidbody2D, GetComponent
inserte la descripción de la imagen aquí

  _rigidbody2d = GetComponent<Rigidbody2D>();

Para esta línea de código, cuando cuelgo el script Rigidbody2D en el personaje del juego Ruby, después de que Ruby ejecuta el script y llama a la función de inicio, devuelve el objeto del juego Ruby.

El código anterior tiene un hoyo que es diferente de C#. La primera reacción al ver paréntesis angulares <> pueden ser genéricos, pero los genéricos se usan para definir clases genéricas , y Getcomponent aquí es una función pública
. Participar en la literatura - C# Genérico

⑦ Constructor de la clase Vector2 que representa vectores y puntos 2D y la variable
Vector2: el constructor Vector2
usará los parámetros entrantes para generar un nuevo vector, y normalizado significa que la longitud del vector solo puede ser como máximo 1, a través de esta limitación, El problema de superposición de velocidades se puede resolver.
inserte la descripción de la imagen aquí

⑧ Indica el vector de velocidad del cuerpo rígido, es decir, la tasa de cambio de la posición del cuerpo rígido, script de velocidad API - Rigidbody.velocity

inserte la descripción de la imagen aquí

3) Resumen

① Está claro que la esencia del movimiento del objeto del personaje del juego es el cambio de posición, por lo que debemos centrarnos en obtener la posición del objeto del juego y modificar su posición para escribir código para realizar el movimiento del personaje.

②Domine 速度*时间la forma de generar movimiento y evite diferentes efectos de ejecución debido a la velocidad de fotogramas.

③ Conocimiento básico de las 8 clases, métodos y variables que a menudo están involucradas en el movimiento del personaje resumidas en este artículo

Supongo que te gusta

Origin blog.csdn.net/weixin_52621323/article/details/126584511
Recomendado
Clasificación