Aprendiendo el motor de Unity desde cero

breve descripción

¡Hola! Este es mi blog sobre aprender unity desde cero.
Cada vez que tenga tiempo, agregaré un subtítulo para resumir los conocimientos aprendidos ese día.

Debajo del subtítulo, una oración en negrita resumirá los puntos de conocimiento aprendidos ese día.
No entiendo nada al principio de Unity, perdónenme si cometo errores (゚Д゚)ノ

tutorial

Manual de usuario oficial del diagrama de clase central de Unity

[Documentación de la nota de traducción]
Documentación de usuario de Game Man Bull Unity 1.0

Depuración de código y entorno de configuración
depuración de código C#

[Comprensión básica de la interfaz de Unity ①] 2021/12/13

Instalé Unity y Unity Hub hoy.
Lo que aprendí: tengo una comprensión preliminar de la interfaz de Unity, qué es una escena, cómo crear una nueva escena, el editor de escenas, cómo agregar recursos, qué es un objeto de juego y un sistema de coordenadas.

1. Primera comprensión de la interfaz de Unity
Después de crear un nuevo proyecto, instale la interfaz de Unity como se muestra en la figura.
Interfaz de unidad

Panel de proyecto : archivos de recursos dentro del proyecto. El panel inferior en la figura. En él se pueden crear directamente escenas, carpetas, objetos, guiones, etc.. Vista
de escena : muestra el contenido del juego de forma visual.
Una fila de herramientas en la esquina superior izquierda del panel son: herramienta de agarre (vista arrastrable), herramienta de rotación y traslación, herramienta de transformación libre y herramienta de estiramiento. Entre ellos, la rotación puede realizar la rotación del eje xyz.
La herramienta en la esquina superior derecha es la cámara y la herramienta de visualización para cambiar la pantalla de visualización de 2D a 3D. Juego vista
de juego : vista previa del juego.
Panel de jerarquía : muestra los objetos del juego en forma de árbol (panel izquierdo) Panel de componentes
del inspector : muestra todos los componentes de un objeto del juego
Consola consola: depuración de impresión

2. ¿Qué es una escena y cómo crear
una nueva ? Una escena es un nivel en un juego, o una pantalla determinada.
En mi opinión personal, tomando como ejemplo el juego de encontrar las diferencias, debería ser un nivel en un descifrado, y el descifrado se realiza en este nivel, y el siguiente nivel se cambia a la siguiente escena.

Crear una nueva escena: haga clic derecho en el panel del proyecto para crear una nueva escena.

3. El editor de escenas
es la ventana de edición en el medio, que se puede acercar y alejar con la rueda de desplazamiento, y también se puede desplazar.
Visible en el interior:
1. Cuadrícula: una que ocupa 100 píxeles en la pantalla, 1 Unidad (personalizable)
2. Cámara principal: el rango visible de la cámara
3. Sistema de coordenadas mundiales: eje x, y

4. Cómo agregar recursos
Método:
① Arrastre y suelte el material directamente en Activos en el panel del proyecto
② Haga clic derecho en el área de Asentimientos y seleccione importar para importar

Nota: Puede hacer clic derecho directamente en el material Mostrar en el Explorador para encontrar el directorio donde se encuentra el material. Después de importar el material, se agregará un archivo .meta correspondiente. Y eliminar el material en el elemento de material original no desaparecerá, porque la regla de importación de la unidad es copiar un nuevo archivo .
A la hora de gestionar recursos, se pueden añadir subdirectorios para la gestión de clasificados. Los clips se pueden renombrar y los clips se pueden eliminar.

5. El concepto de objeto de juego y sistema de coordenadas

Un GameObject es lo que contiene una escena.
Por ejemplo, arrastrar una imagen a la ventana Escena o la ventana Jerarquía agregará un nuevo objeto de juego.
Haga clic en el objeto y la información de propiedad del objeto (nombre, información de transformación, componentes, estado del script, etc.) se mostrará a la derecha.

Nota: En la escena, solo se guarda a quién hace referencia el objeto del juego, por ejemplo, si se hace referencia a una determinada imagen, cuál es la identificación de la imagen.

El sistema de coordenadas se puede ver en el panel de propiedades del Inspector del objeto para ver las coordenadas del eje xyz del objeto.
Unidad de coordenadas: un cuadrado es una Unidad (unidad), y una unidad se puede acordar en el mundo real.
eje x: horizontalmente a la derecha
eje y: verticalmente hacia arriba
eje z: pantalla verticalmente hacia adentro
(se puede entender con la cámara de ae)

[Comprensión de la interfaz básica de Unity ②] 2021/12/14

Aprendizaje de hoy: Conocer el concepto de objetos del juego y su funcionamiento y orden de visualización, cámara y componentes.

1. Objetos del juego

operación básica
Mover (cambiar el valor de posición o usar herramientas)
Rotar (los ejes x, y y z se pueden usar como ejes de rotación) Escalar
(escala del eje x, y, el cuadrado en el medio se puede escalar sin perder proporción)
Herramienta Rectángulo: gratis transformación (presione mierda Las teclas se pueden escalar proporcionalmente)
Ocultar y mostrar: seleccione la casilla de verificación activa en las propiedades

Haga clic en Sprite Editor para abrir el editor de gráficos y las propiedades de la imagen se muestran en la esquina inferior derecha

nombre efecto
nombre nombre
Posición ubicación centrada
Borde
Pivote Eje (opcional donde se encuentra el eje)
Modo de unidad de pivote
Pivote personalizado

Corte de imagen
Después de abrir el editor de imágenes, abra el segundo menú en la esquina superior izquierda: Rebanada, haga clic en Rebanada, la imagen se cortará automáticamente y se dividirá en los objetos de juego de imágenes múltiples correspondientes

Imagen y renderizador
Sprite: Sprite
Sprint Renderer: Renderizador de imágenes, utilizado para mostrar un Sprite (un componente)
Arrastre el material a la posición del Sprite para reemplazar la imagen del material que se muestra actualmente.

Orden de visualización
- Modificar el atributo Orden en Capa
- modificar la coordenada Z

relación padre-hijo
Al igual que la relación padre-hijo de AE, el objeto hijo cambia con el objeto padre
: arrastre y suelte en el administrador del árbol para configurarlo

2. Cámara
Haga clic en la cámara para ver sus componentes agregados.
A continuación se muestran algunos de los componentes conocidos.

nombre Función
Transformar Un componente que representa: Posición: Posición Rotación: Rotación Escala: Escala (un componente que tiene cada objeto del juego)
Fondo Fondo, ¿de qué color es el relleno fuera del área de visualización?
Tamaño El rango de tamaño de la cámara, el valor predeterminado es 5 unidades, que describe qué tan grande es el área que la cámara puede capturar

Puedes saltar para ajustar su relación de aspecto en la ventana del juego.

3. Componentes
Componentes: se utilizan para implementar una función.
Algunos componentes se pueden agregar en el panel derecho

【Entendimiento del guión de Unity①】2021/12/15

Aprendizaje de hoy: sepa qué es un script, cómo montar un script, aprenda a ver el manual y conozca Start() y Update() en el script

¿Qué son las secuencias de comandos?
El comportamiento de un objeto de juego está controlado por un __component__ adjunto. El script se puede entender como escribir un componente de uso propio (?

Cómo montar una secuencia de comandos
Cree una secuencia de comandos C# en la ventana Activos
Haga doble clic en la secuencia de comandos para iniciar VS
Guión de montaje 01
Puede editar la secuencia de comandos en la página de VS, salir a la interfaz de Unity después de editar la secuencia de comandos, puede arrastrar directamente la secuencia de comandos al objeto para montar, y luego haga clic para ejecutar en la ventana del Juego.

①Cree un nuevo script y utilícelo ,
cree un nuevo script y haga clic para abrir el script para observar su código.

using UnityEngine;
using System.Collections;

public class MainPlayer : MonoBehaviour {

    // 使用此函数进行初始化
    void Start () {
    
    }
    
    // 每帧调用一次 Update
    void Update () {
    
    }
}

Para conectarse a la arquitectura interna de Unity, los scripts implementan una clase derivada de una clase integrada llamada MonoBehaviour. Es decir, MonoBehaviour es la clase base de todo script.

MonoBehaviour es una clase base de la que se derivan todos los scripts de Unity.
Al usar C#, debe derivar explícitamente de MonoBehaviour. (No entiendo muy bien, busca un ejemplo para entenderlo)

——¿Qué es la derivación explícita?
Consiste en especificar el constructor de la clase base a llamar en el constructor de la clase derivada,
y pasar algunos valores de parámetros del constructor de la clase derivada al constructor de la clase base.
——¿Qué es la derivación implícita?
El método implícito es no especificar el constructor de la clase base correspondiente en el constructor de la clase derivada. En
este momento, se llama al constructor predeterminado de la clase base.

Introducción a monoBehaviour y sus funciones

El submenú Scripts del menú Componente, que contiene todos los scripts disponibles en el proyecto, incluidos los personalizados.

Cada vez que se crea un script, se crea automáticamente un archivo class.cs con el mismo nombre de archivo que el nombre de la clase.
Será llamado automáticamente por el motor:

Start() : llamar al iniciar
Update() : llamar a cada fotograma (la velocidad de fotogramas no es fija)

El orden de ejecución interna:
1. Crear el objeto
2. Crear el componente al que llama
3. Iniciar()
4. Ejecutar Update() regularmente

【Entendimiento del guión de Unity②】2021/12/16

Aprendizaje de hoy: reconfiguré el entorno, aprendí el concepto de velocidad de fotogramas, cómo obtener los componentes del objeto actual y otros objetos

Abrí el script esta mañana y no sabía por qué el código de autocompletado de vs había desaparecido nuevamente, así que reconfiguré el entorno.
Compruebe si los componentes relacionados con la unidad de vs2019 están instalados. (Verifique y descubra que TT ya está instalado)
Luego abra la unidad, haga clic en preferencia en editar, busque el compilador que instaló y elija.
configuración
Luego recuerde reiniciar.Después de abrirlo nuevamente, haga doble clic en el script para ver la finalización del código.

②¿Qué es la velocidad de fotogramas, cómo hacer que un objeto se mueva a una velocidad constante?
La velocidad de fotogramas se refiere a cuántas actualizaciones por segundo.
FPS = 50 actualizaciones cada 20 ms
FPS = 60 actualizaciones cada 16,7 ms

Debug.log("In Update() .." + Time.delaTime);

Con qué frecuencia se actualiza el intervalo de observación
situación de la consola

Pregunta, ¿qué es delaTime?
El nombre chino es tiempo incremental, lo que significa el tiempo que tarda cada fotograma en pasar.
La actualización () se ejecuta una vez por fotograma, luego el tiempo empleado en un fotograma es el tiempo delta (deltaTime) El
número de ejecuciones de actualización en 1 segundo es el número total de fotogramas ejecutados en 1 segundo

Por ejemplo

 void Update()
    {
    
    
        transform.Translate(0, 0, Time.deltaTime * 10); //物体沿着自身Z轴方向,每秒移动物体10米运动
    }

Usando tiempo delta * 10, puedes hacer que el objeto se mueva 10 metros por segundo. Y Update() se actualiza diferentes veces por segundo.

(La actualización se ejecuta una vez, que es un cuadro. Los cuadros por segundo son diferentes, pero la distancia recorrida por cada cuadro es velocidad * tiempo, y finalmente es equivalente a multiplicar el número de cuadros por segundo, que es equivalente a lo siguiente fórmula)

10 metros = (tiempo incremental * 1 segundo número total de fotogramas) * 10 metros por segundo

③¿Cómo obtener nodos y componentes?

- el objeto de juego actual

this.gameObject //当前你这个游戏对象

Obtener todos los componentes del objeto actual

    void Start()
    {
    
    
        //在当前对象下寻找类型为SpriteRenderer类型的全部组件
        SpriteRenderer render = this.gameObject.GetComponent<SpriteRenderer>();
        //简写:SpriteRenderer 自变量名称 = this.GetComponent<获取的类型>();
        render.flipY = true; //对当前对象进行一个翻转(X对称轴)
    }

La imagen se volteó después de ejecutar el script...
voltear la imagen

- obtener otros objetos

 GameObject obj = GameObject.Find("相应对象的路径");

[Entendimiento del script de Unity ③] 2021/12/17

El aprendizaje de hoy: algunas operaciones simples sobre la transformación de los nodos principales y secundarios, cómo agregar y modificar las propiedades de los componentes, cómo cambiar las coordenadas y rotar los objetos del juego.

Problema de nuevo hoy.
inserte la descripción de la imagen aquí
Busque este directorio de usuarios y elimine la licencia original.
Tabla de contenido
Reinicie la computadora y vuelva a abrir el centro de Unity para solicitar una licencia.

④Nodo principal y nodo secundario
La estructura de archivos en forma de árbol de la izquierda es administrada por Transform.
Operaciones comunes:
1. Obtener el nodo principal y obtener el nombre del nodo principal

    //取出当前对象的父节点
        GameObject parentobj = this.transform.parent.gameObject;
        Debug.Log("rabbit的父节点" + parentobj.name);

2. Atraviese todos los nodos secundarios
Atraviese todos los nodos secundarios del objeto actual e imprima sus nombres.

		//遍历子节点
        foreach (Transform child in transform)
        {
    
    
        Debug.log("子节点" + child.name);
        }

3. Mueva un nodo a otra ubicación.

Monte el objeto de conejo debajo del objeto de la cámara principal.

    //分别定义两个对象
        GameObject obj = GameObject.Find("rabbit");
        GameObject target = GameObject.Find("Main Camera");

        //通过transform,先找到子节点的transform,将其挂到父节点的transform下面
        obj.transform.SetParent(target.transform);

No se ejecutan relaciones prejerárquicas.
inserte la descripción de la imagen aquí
Jerarquía posterior a la ejecución.
inserte la descripción de la imagen aquí
Cuando desee montar el objeto debajo de la escena, configúrelo directamente en nulo

 obj.transform.SetParent(null);

Mientras se ejecuta el juego, tanto el panel de Jerarquía como el panel de Componentes mostrarán datos en tiempo real.

⑤Definición de propiedades del componente
En el panel de componentes, puede ver algunas propiedades debajo del componente.

Cree un nuevo script y defina una propiedad de componente público en el script, podemos ver que las propiedades definidas por nosotros mismos se muestran en el panel de propiedades.
inserte la descripción de la imagen aquí
Este valor también se puede modificar
inserte la descripción de la imagen aquí
⑥ Cálculo de movimiento de objetos de juego

Vector3, utilizado para representar un vector tridimensional (x, y, z), también conocido como 3 elementos.

Defina una coordenada tridimensional, la coordenada se expresa como un número de coma flotante, por lo que se debe agregar f después

 Vector3 pos = new Vector3(0, 0.1f, 0);

Las coordenadas y la rotación del nodo se pueden representar mediante Vector3

transform.position = new Vector3(0, 0.1f, 0); //设置位置
//eulerAngles 欧拉角 用来旋转的 旋转了45度
transform.eulerAngles = new Vector3(0, 0, 45f); 

Coordenadas mundiales Posición espacial mundial Coordenadas absolutas, calculadas en el sistema de coordenadas mundiales
Coordenadas locales Posición espacial local Calculadas en el sistema de coordenadas del nodo principal

Controle el objeto del juego para que se mueva dentro de un cierto rango y gire su dirección cuando toque los límites superior e inferior.

 private bool upward = true;//飞行的方向,向上
    // Update is called once per frame
    void Update()
    {
    
    
        if(upward && transform.position.y > 5)
        {
    
    
            upward = false;
            transform.localEulerAngles = new Vector3(0, 0, 180);
        }
        if (!upward && transform.position.y < -5)
        {
    
    
            upward = true;
            transform.localEulerAngles = new Vector3(0, 0, 0);
        }

        float step = 1.6f * Time.deltaTime;
        transform.Translate(0, step, 0, Space.Self);
        
    }

[Entendimiento del guión de Unity ④] 2021/12/19

Estudio de hoy: el concepto de vector, estandarización de vectores, aritmética de vectores, el concepto de coordenadas de pantalla

⑦El concepto de vector, estandarización de vectores, aritmética de vectores

La API para encontrar la longitud de un vector
float len ​​​​= v.magnitude

Normalizar: escalar la longitud de un vector a un vector unitario (un vector de longitud 1)

Vector3 b = a.normalizado;

Varios vectores estándar de uso común:

Vector3.derecha, concretamente Vector3(0, 1, 0) eje x
Vector3.arriba, concretamente Vector3(1, 0, 0) eje y
Vector3.adelante, concretamente Vector3(0, 0, 1) eje z

Distancia entre dos objetos: encuentre el vector representado por la posición de los dos objetos y luego calcule la longitud del vector para obtener la distancia entre los objetos.

Vector3 direction = p2 - p1;
direction.magnitude//物体间的距离

Vector3.SignedAngle(b,a,Vector3.forward);//计算a到b的角度,旋转轴为z

Hacer que un objeto cambie su orientación siguiendo el movimiento de otro objeto.

    void Start()
    {
    
    
        Vector3 face = this.transform.up;   // 获取朝向
        GameObject target = GameObject.Find("音符");
        Vector3 direction = target.transform.position - this.transform.position;
        //计算两对象间的向量
        float angle = Vector3.SignedAngle(face, direction, Vector3.forward);
        //计算向量与当前对象的角度
        this.transform.Rotate(0, 0, angle); //旋转这个角度
    }

⑧Coordenadas de pantalla
Es la posición en la que se muestra el objeto del juego en la pantalla actual.

Ancho de pantalla (píxeles)
Alto de pantalla (píxeles)

Obtenga las coordenadas de pantalla de un objeto (cambie las coordenadas mundiales en coordenadas de pantalla)

Vector3 worldpos = transform.position;
Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);
El límite de la pantalla (las coordenadas de la pantalla se pueden usar para controlar que el objeto del juego no exceda el límite de la pantalla)

[Comprensión del guión de Unity ⑤] 2021/12/20

El aprendizaje de hoy: obtener eventos del mouse, los objetos del juego siguen al mouse y realizan la función de arrastre del mouse *

⑨ Obtenga el evento del mouse, el objeto del juego sigue al mouse

Input.GetMouseButtonDown(0)//获取鼠标左键是否按下
Input.mousePosition;//获取鼠标当前的位置

0 significa botón izquierdo, 1 significa rueda de desplazamiento, 2 significa botón derecho


Detecte dónde está la posición del mouse, primero tome su posición en la pantalla y luego conviértala a la posición mundial.

      // 探测 ‘鼠标左键按下’ 事件是否发生
        if (Input.GetMouseButtonDown(0))
        {
    
    
            Debug.Log("鼠标按下,pos=" + Input.mousePosition);

            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            Debug.Log("世界坐标: " + pos);
            pos.z = 0;    // 把Z坐标置0,放到2D平面上来
        }

Sigue al ratón para moverte y cambiar su dirección.

    void Start()
    {
    
    
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {
    
    
        if (Input.GetMouseButton(0))    //检测鼠标位置
        {
    
    
            //获取当前鼠标的屏幕坐标转换为世界坐标
            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            pos.z = 0;
            //改变方向
            SetDirection(pos);
        }
        //控制移动
        float step = 5f * Time.deltaTime;
        transform.Translate(0, step, 0, Space.Self);
    }

    //变换其方向
    void SetDirection(Vector3 targetPos)
    {
    
    
        Vector3 face = transform.up;    //记录当前游戏对象位置
        Vector3 direction = targetPos - transform.position;//算出两向量位置间的向量

        float angle = Vector3.SignedAngle(face, direction, Vector3.forward);//计算其夹角
        transform.Rotate(0, 0, angle);//改变当前游戏对象的方向

    }

El efecto se muestra en la figura.

⑩Implementación de la función de arrastre del mouse
Haga clic y arrastre el objeto del juego con el mouse.


    private bool drag = false;  //是否被拖拽
    private Vector3 lastMousePos;//鼠标的相对位移

    // Start is called before the first frame update
    void Start()
    {
    
    
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {
    
    
        //当鼠标按下的时候
        if (Input.GetMouseButtonDown(0))
        {
    
    
            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            pos.z = 0;    // 把Z坐标置0,放到2D平面上来

            //判定鼠标离游戏的点有多远
            float distance = (pos - transform.position).magnitude;//求出两者之间的距离
            if (distance < 1.5f)//如果该距离小于1.5的时候
            {
    
    
                drag = true;
                lastMousePos = pos;//使游戏对象跟随鼠标移动(拖拽)
            }
        }

        //没有按下的时候就不移动
        if (Input.GetMouseButtonUp(0))
        {
    
    
            drag = false;
        }


        // 当拖拽的时候
        if (drag)
        {
    
    
            //先查找鼠标在世界坐标中的位置
            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            pos.z = 0;    

            //计算现在鼠标位置相对于之前鼠标位置的距离
            Vector3 delta = pos - lastMousePos;
            
		      //根据相对移动距离进行一个加法的计算(移动)
            transform.position += delta;   
            

            lastMousePos = pos;//更新鼠标的新位置
        }
    }

lograr efecto

[Entendimiento del guión de Unity ⑥] 2021/12/21

Aprendizaje de hoy: qué es una función de evento, parámetros de secuencia de comandos, comprensión de prefabricados

⑪Función de evento (Event Fuction), orden de ejecución del script


Awake(), Start(), Update(), FixedUpdate() llamado activamente por el sistema

La función de devolución de llamada del evento correspondiente comienza con
OnEnable(), OnDisable(), OnGUI()...

Awake()→OnEnable→Start()→...
Puede poner la inicialización en Awake o Startl.

Se ejecutan varios objetos de juego con scripts adicionales al mismo tiempo (fuera de orden, con prioridad 0).
El orden de ejecución se puede utilizar para determinar el orden de ejecución de los scripts: cuanto menor sea el valor del orden de prioridad
, mayor será la prioridad.
Un script tiene prioridad sobre otros scripts y el orden de ejecución es -1,
un script es posterior a otros scripts y el orden de ejecución es 1;

Parámetro de script : es la variable definida por la función en el script.Después de la definición, puede ver el parámetro definido en el panel de componentes.

El tipo de valor (estructura en C#, es decir, Vector3) no se puede inicializar como nulo.

Pequeño ejercicio: haga clic para cambiar de imagen

    public Sprite sprite0;
    public Sprite sprite1;
    private int index = 0;
    void Start()
    {
    
    
    }
    void Update()
    {
    
    
        if (Input.GetMouseButtonDown(0))
        {
    
    
            DoChange();
        }

    }
    void DoChange()
    {
    
    
    	//使用这个Render组件
        SpriteRenderer renderer = GetComponent<SpriteRenderer>();
        if(index == 0)
        {
    
    
            index = 1;
            renderer.sprite = this.sprite1;
        }
        else
        {
    
    
            index = 0;
            renderer.sprite = this.sprite0;

        }
       
    }

⑫ Cuerpo prefabricado

Prefabricado: Prefabricado, objeto prefabricado (plantilla), generalmente utilizado para la creación dinámica de objetos de juego.
Instancia prefabricada: Instancia prefabricada

Después de crear la prefabricada, puede agregar una nueva instancia de la prefabricada arrastrando y soltando.
Haga doble clic en el prefabricado que se modificará para ingresar a la interfaz de edición de prefabricados, puede montar el script en el prefabricado y la secuencia de comandos también controlará la instancia del prefabricado.
Después de hacer clic en un prefabricado, el panel en la esquina superior derecha es como se muestra en la figura.

Abrir es para editar el prefabricado
Seleccione para encontrar el prefabricado
Anule la instancia prefabricada actual si desea revertir la modificación de la instancia prefabricada a la prefabricada.

¿Cómo desconecto una instancia prefabricada de su prefabricado?
Haga clic con el botón derecho en el objeto y seleccione Desempaquetar prefabricado

⑬ Creación dinámica y destrucción de prefabricados
Cuando se hace clic con el mouse, miku crea una nota prefabricada, la nota flota y se destruye a sí misma cuando excede el rango de la pantalla.

mikumove.cs

    public GameObject myPrefab;
    void Update()
    {
    
    
        if (Input.GetMouseButtonDown(0))
        {
    
    
            Sing();
        }
    }
    private void Sing()
    {
    
    
        GameObject music = Instantiate(myPrefab);
        music.transform.position = transform.position + new Vector3(0, 1f, 0);
    }

Monte el objeto de la nota en la instancia del objeto prefabricado miku en la interfaz.

  // Update is called once per frame
    void Update()
    {
    
    
        float step = 1.5f * Time.deltaTime;
        transform.Translate(0, step, 0, Space.Self);

        Vector3 sp = Camera.main.WorldToScreenPoint(transform.position);
        if(sp.y > Screen.height)
        {
    
    
            Destroy(this.gameObject);
        }
    }

【Comprensión del script de Unity⑦】2021/12/22~23

Aprendizaje de hoy: cronómetro, comprensión de clases importantes en Unity

    //创建一个预制体资源音符
    public GameObject myPrefab;

    private float interval = 0.4f; //每隔0.4秒发射一颗
    private float count = 0;

    void Update()
    {
    
    
        //计时
        count += Time.deltaTime;
        if(count >= interval)//如果当前累计的事件到了0.4秒
        {
    
    
            count = 0;//清零
            Sing();//进行一个歌的唱
        }
  
    }

    private void Sing()
    {
    
    
        Vector3 pos = transform.position + new Vector3(0, 1f, 0);
        GameObject bullet = Instantiate(myPrefab, pos, transform.rotation);
    }

El efecto se muestra en la figura.

En los últimos días, he estado ocupado con proyectos escolares, así que miré otra cosa. Aquí hay una lista de las clases más importantes en la unidad, y repaso algunos métodos y declaraciones que aprendí antes.

nombre de la clase describir
Objeto de juego Representa el tipo de objeto que puede existir en la escena.
MonoBehaviour La clase base de la que se derivan todos los scripts de Unity de forma predeterminada.
Objeto La clase base para todos los objetos a los que Unity puede hacer referencia en el editor.
Transformar Proporciona múltiples formas de secuenciar la posición, la rotación y el escalado de GameObjects, así como la relación jerárquica con GameObjects padre e hijo.
Vectores Clases para representar y manipular puntos, líneas y direcciones en 2D, 3D y 4D.
Cuaternio Una clase que representa rotaciones absolutas o relativas y proporciona métodos para crearlas y manipularlas.
ScriptableObject Contenedores de datos que se pueden utilizar para contener grandes cantidades de datos.
Gestión del tiempo (y de la velocidad de fotogramas) La clase de tiempo se utiliza para medir y controlar el tiempo y gestionar la velocidad de fotogramas del proyecto.
Matemáticas Un conjunto de funciones matemáticas comunes, incluidas las trigonométricas, logarítmicas y otras que se usan comúnmente en el desarrollo de juegos y aplicaciones.
aleatorio Proporciona métodos convenientes para generar valores aleatorios de varios tipos de uso común.
Depurar Se utiliza para obtener información en el editor visual que puede ayudarlo a comprender o investigar qué sucedió cuando se ejecutó el proyecto.

El ángulo de Yula se usa comúnmente en Quaternmion (la siguiente comprensión del concepto proviene de los blogs de otras personas)

Los ángulos de Euler representan una serie de rotaciones fundamentales tridimensionales, es decir, una serie de rotaciones alrededor de los ejes de un sistema de coordenadas. Por ejemplo, primero gire un ángulo α alrededor del eje Z, luego haga una rotación de ángulo β alrededor del eje X y finalmente haga una rotación de ángulo γ alrededor del eje Z. Estas rotaciones son todas desde una orientación estándar conocida. en física,

Esta orientación estándar inicial suele ser un sistema de coordenadas estacionario y, en geometría lineal, suele ser una base estándar.

El uso de ángulos de Euler: (para ser entendido aquí... como cerraduras universales)

// 正确使用欧拉角的旋转脚本。
// 将欧拉角存储在一个类变量中,并仅使用
// 该变量作为欧拉角进行应用,但从不依赖于读回欧拉值。
        
float x;
void Update () 
{
    
    
    x += Time.deltaTime * 10;
    transform.rotation = Quaternion.Euler(x,0,0);
}

uso incorrecto:

// 旋转脚本错误 #1
// 此处的错误在于我们正在修改四元数的 x 值
// 此值不表示角度,不会产生所需的结果
    
void Update () 
{
    
    
    var rot = transform.rotation;
    //这里rot定义为var对象,不可以用在旋转角度上(?
    rot.x += Time.deltaTime * 10;
    transform.rotation = rot;
}
// 旋转脚本错误 #2
// 从四元数读取、修改并写入欧拉值。
// 因为这些值是从四元数计算的,
// 所以每个新的旋转可能会返回非常不同的欧拉角,而这可能会受到万向锁的影响。
        
void Update () 
{
    
    
    var angles = transform.rotation.eulerAngles;
    angles.x += Time.deltaTime * 10;
    transform.rotation = Quaternion.Euler(angles);
}

【Entendimiento del guión de Unity⑧】2021/12/26

Aprendizaje de hoy: comprensión de los eventos del teclado, comprensión de los cuerpos rígidos en unidad y uso de componentes para la detección de colisiones

eventos de teclado

Input.GetKeyDown(tecla) Presiona el evento
Input.GetKeyUp(key) Levanta el evento
Input.GetKey(key) Estado verifica si está presionado

Sistema físico
Puede agregar un componente Physic 2D RigidBody 2D al objeto del juego, y luego puede configurarlo como un cuerpo rígido físico o un cuerpo rígido cinemático

Cuerpo rígido:
Dinámico El cuerpo rígido ordinario tiene masa y velocidad
Estático Estático El cuerpo rígido tiene una masa infinita y no tiene velocidad
Cinemático El cuerpo rígido cinemático no tiene masa

Colisión de cuerpo rígido
1) Detección de colisión de física dinámica
Puede agregar Box Collider 2D (componente de colisión), y dos cuerpos rígidos calcularán su colisión.
El rango de cuerpo rígido se puede editar

2) Cinemática cinemática cuerpo rígido
Proceso de detección de colisión:
a. Agregue dos objetos, 'plano' y 'bola'
b. Agregue el componente de cuerpo rígido Rigidbody 2D
como Kinematic

c. Agregue el componente de colisión Box Collider2d
y marque Is Trigger (disparador de colisión)

d. Agregue un componente de secuencia de comandos, anule la función de evento OnTriggerEnter2D ()
void OnTriggerEnter2D (colisión Collider2D)
{ Debug.Log ("Avión: Colisión detectada..."); }

Cuando el sistema detecta una colisión, activará la devolución de llamada del evento de colisión

OnTriggerEnter2D: dos colisionadores comienzan a encontrarse
OnTriggerStay2D: dos colisionadores están en contacto
OnTriggerExit2D: dos colisionadores se separan

Parámetros para el evento de colisión:

colisión.gameObject Objeto de colisión
del oponente colisión.transformar Componente de transformación del
oponente colisión.nombre Nombre
del nodo del oponente colisión.tag Etiqueta (identidad) del nodo oponente Se utiliza para identificar la identidad del objeto de colisión (muy importante)

En la configuración del proyecto
A. Puede configurar la etiqueta y la capa del proyecto actual, y luego, cuando hace clic en el panel de componentes de un determinado objeto del juego, puede ver la etiqueta del objeto del juego actual.
b. Comprueba la matriz de colisión de capas en Physics 2D. Puedes configurar diferentes capas para que colisionen. Los objetos del juego en la misma capa no colisionan (distinguir entre tropas amigas y enemigas). Usar esto puede reducir el consumo de recursos, porque los objetos en la misma capa no detectará colisiones El método anterior de distinguir objetos detectará colisiones independientemente de la etiqueta (identidad).

[Haz un juego simple de luchar contra monstruos con aviones ①] Implementación simple

①Cambie la interfaz al modo vertical
Window→Layout→Tall (pantalla vertical)
y establezca la resolución en 9:16
inserte la descripción de la imagen aquí

②Agregar un script maestro
Agregue un nodo vacío "Game Master"
para crear un nuevo script maestro MyGame.cs

Establezca algunas variables globales en el script maestro, como la velocidad de fotogramas, configúrelo en el script maestro.

③Hacer balas y aviones

Haga que el material de la bala sea prefabricado, monte el script correspondiente y agregue componentes relacionados con la colisión. Cuando la bala golpee al monstruo, el monstruo será destruido.

public class bullet : MonoBehaviour
{
    
    
    public float speed = 5.5f;
    void Start()
    {
    
    
        
    }

    void Update()
    {
    
    
        float dy = speed * Time.deltaTime;

        transform.Translate(0, dy, 0, Space.Self);

        Vector3 sp = Camera.main.WorldToScreenPoint(transform.position);
        if(sp.y > Screen.height)
        {
    
    
            Destroy(this.gameObject);
        }
        
    }
    //当
    private void OnTriggerEnter2D(Collider2D collision)
    {
    
    
        if(collision.tag.Equals("Monster"))
        {
    
    
            Destroy(collision.gameObject);
            Destroy(this.gameObject);
        }
    }
}

Como se muestra en el código relevante de la aeronave, el movimiento de la aeronave se puede controlar con la tecla wasd (el problema del límite de la pantalla aún no se ha optimizado). La
bala se usa como prefabricada, que es lanzada por la aeronave. y la etiqueta es Bullet.

public class MyJet : MonoBehaviour
{
    
    
    public GameObject bulletPrefab;
    public float moveSpeed = 2.5f;
    private float interval = 0.4f;
    private float count = 0;


    void Start()
    {
    
    
        Application.targetFrameRate = 60;
      
    }

  
    void Update()
    {
    
    
	 count += Time.deltaTime;
        if (count >= interval)
        {
    
    
            count = 0;
            Fire();
        }
        //控制飞机移动
        Vector3 jp = Camera.main.WorldToScreenPoint(transform.position);
        if (Input.GetKey(KeyCode.A) && jp.x > 0) 
        {
    
    
            transform.Translate(-0.05f,0, 0, Space.Self);
        }
        if (Input.GetKey(KeyCode.D) && jp.x < (Screen.width  ))
        {
    
    
            transform.Translate(0.05f, 0, 0, Space.Self);
        }
        if (Input.GetKey(KeyCode.S) && jp.y > 0)
        {
    
    
            transform.Translate( 0, -0.05f, 0, Space.Self);
        }
        if (Input.GetKey(KeyCode.W) && jp.y < (Screen.height ))
        {
    
    
            transform.Translate(0, 0.05f, 0, Space.Self);
        }



    }
    private void Fire()
    {
    
    
        Vector3 pos = transform.position + new Vector3(0, 1f, 0);   //子弹出现的位置
        GameObject bullet = Instantiate(bulletPrefab, pos, transform.rotation);
    }
}

⑤ Haz monstruos y genera monstruos aleatoriamente.
El código del monstruo es el siguiente, deja que el monstruo se mueva a lo largo del eje Y de la pantalla como una bala, conviértelo en un prefabricado y etiquétalo como Monstruo.

public class Monster : MonoBehaviour
{
    
    
    public float speed = 1.0f;
    void Start()
    {
    
    
    }
    void Update()
    {
    
    
        float dy = speed * Time.deltaTime;
        transform.Translate(0, -dy, 0, Space.Self);
    }
}


Los monstruos se generan aleatoriamente mediante el script de control principal: Monster_control, se establece una matriz de avatares y se generan aleatoriamente diferentes monstruos cambiando la imagen de la casa prefabricada después de la entrada.

public class Monster_control : MonoBehaviour
{
    
    
    public GameObject monsterPrefab;
    public Sprite[] images; //头像的数组
   
    void Start()
    {
    
    
        //反射机制:输入名字找到方法
        //参数的名字(字符串)    多少时间后执行第一次     每隔几秒执行一次
        InvokeRepeating("CreateMonster", 0.1f, 2f); 
    }
    void Update()
    {
    
    
    }
    void CreateMonster()
    {
    
    
        //随机
        float x = Random.Range(-2, 2);//限定生成怪物的范围
        float y = 5;

        //初始化怪物
        GameObject monster = Instantiate(monsterPrefab);
        monster.transform.position = new Vector3(x, y, 0);

     
        int index = Random.Range(0, images.Length);//不会包含后一个数,会显示0到length-1
        //随机选择一个怪物
        SpriteRenderer renderer =monster.GetComponent<SpriteRenderer>();
        renderer.sprite = this.images[index];
    }
}


⑥ Darse cuenta del efecto

Están sucediendo muchas cosas en la escuela recientemente. La escuela está cerrada para hacer proyectos y diseñar clases TT. No tengo tiempo para resumir lo que he aprendido todos los días, pero todavía sé cómo escribir un poco.

[Haz un juego simple de lucha contra monstruos con aviones ②] para optimizar

① Haz que cada monstruo tenga el mismo tamaño

       //将头像的大小设置为100px(宽度)
        Sprite sprite = this.images[index];
        float imgWidth = images[index].rect.width;  //取得的图像实际宽度
        float scale = 100 / imgWidth; //缩放比例
        monster.transform.localScale = new Vector3(scale, scale, scale);

②El monstruo se destruye cuando sale de la pantalla

   //判断当前怪物是否离开页面,离开则销毁
        Vector3 sp = Camera.main.WorldToScreenPoint(transform.position);
        if(sp.y < 0)
        {
    
    
            Destroy(this.gameObject);
        }     

③Aumenta el fondo del juego y haz que se desplace
Crea dos nuevas imágenes y colócalas debajo de un nodo.

Escriba una imagen para mover la imagen hacia abajo y vuelva a la posición inicial cuando se alcance una determinada posición, de modo que la imagen se mueva en un bucle infinito. (Efecto de desplazamiento de fondo)
bg_control.cs está montado debajo del maestro del juego

public class bg_control : MonoBehaviour
{
    
    
    Transform bg1;
    Transform bg2;

    public float speed = 1.0f;
    // Start is called before the first frame update
    void Start()
    {
    
    
        bg1 = GameObject.Find("/background/bg1").transform;
        bg2 = GameObject.Find("/background/bg2").transform;

        bg1.position = new Vector3(0, 0, 0);
        bg2.position = new Vector3(0, 10, 0);


    }

    // Update is called once per frame
    void Update()
    {
    
    
    //设定速度和移动
        float dy = speed * Time.deltaTime;
        bg1.Translate(0, -dy, 0);
        bg2.Translate(0, -dy, 0);

//当离开屏幕后滚动回到初始位置。
        if(bg1.position.y <= -10)
        {
    
    
            bg1.Translate(0, 20, 0);
        }
        if (bg2.position.y <= -10)
        {
    
    
            bg2.Translate(0, 20, 0);
        }

    }
}

【Entendimiento del guión de Unity⑨】2022/01/01

1. Agregue efectos de sonido
Audio en unidad: admita efectos de sonido 2D/3D
3D: sensación de espacio, con efectos casi grandes y muy pequeños Formatos admitidos: mp3/wav/ogg/aiff, puede verificar la reproducción al agregar secuencias de comandos
en el inspector
votó fuera

Puede llamar a la API de AudioSource para reproducir
clip/mute/loop/volumen/isPlaying
play() Playing: Reproduciendo mientras se reproduce, detendrá la reproducción actual y comenzará a reproducir de nuevo
Stop() Stop
Pause () Pause
isplaying Determine si
PlayOneShot es reproduciendo (clip) Abre una nueva reproducción

2.Invocar

Invocar llamada retrasada, volver a llamar más tarde

eg.Invoke("SomeJob", 3)
significa llamar al método SomeJob después de 3 segundos

Después de cada cuadro de Actualización, el sistema verificará la Invocación que se ejecutará.
Después de llamar a Invocar varias veces seguidas, se agregarán varias llamadas retrasadas.
Use IsInvoking (nombre) para determinar si actualmente hay una llamada retrasada con el mismo nombre

Llame
a InvokeRepeating(methodName, delay, interval) regularmente: retrase la llamada y ejecútela repetidamente, dándose cuenta de la lógica de un temporizador

3. Llamada de mensaje
para determinar si el mouse hace clic en el objeto correspondiente

        //判断鼠标是否点中了当前物体
        if (Input.GetButtonDown(0))
        {
    
    
            //获取鼠标在屏幕上的位置
            Vector3 mousePos = Camera.main.ScreenToViewportPoint(Input.mousePosition);
            mousePos.z = 0;
            //两个向量相减并记录下减后向量的大小
            float distance = (mousePos - transform.position).magnitude;
            //判断向量大小是否在一个范围内
            if(distance < 2)
            {
    
    
                //打中了
            }
        }

Recorra todos los scripts debajo del nodo principal, busque el método AddScore y llámelo.
Método 1: (simple, corto)

GameObject main = GameObject.Find("游戏主控");
main.SendMessage("AddScore", 1);

Método 2:

GameObject main = GameObject,Find("游戏主控")
MyGame myGame = main GetComponent<MyGame>();
myGame.AddScore();

SendMessage(): busque el método de destino y ejecútelo de inmediato
1. Recorra todos los componentes de MonoBehaviour en el objeto
2. Verifique si hay un método xxx en el componente
3. Si existe tal método, ejecute el método
Cuando el método de destino no se encuentra, indica: ¡ SendMessae xxx no tiene receptor!

SendMessage() es una llamada síncrona, no una llamada asíncrona. En el objeto de destino, encuentre el método de destino y ejecútelo inmediatamente

4. IU de interfaz interactiva

La interfaz de usuario en Unity se llama UGUI
(1) Al agregar un Canvas (lienzo),
se agregará un EvenSystem (sistema de eventos) al mismo tiempo

Supongo que te gusta

Origin blog.csdn.net/weixin_42818410/article/details/121913770
Recomendado
Clasificación