tarea de juego 3d 2

Juego 3D Asignación 2

1. Preguntas de respuesta corta

1. Explique la diferencia y la conexión entre GameObjects y Assets.

La explicación de Unity sobre los recursos y los objetos del juego es la siguiente

Activo : cualquier medio o dato que se pueda usar en un juego o proyecto. Los recursos pueden provenir de archivos creados fuera de Unity, como modelos 3D, archivos de audio e imágenes. También hay tipos de activos que se pueden crear en Unity, como controladores de animación, mezcladores de audio o texturas de renderizado.

Objeto del juego : el objeto básico en la escena de Unity, que puede representar personajes, accesorios, escenarios, cámaras, puntos de ruta, etc. La funcionalidad de un objeto de juego está definida por los componentes adjuntos al objeto de juego.

A partir de esto, podemos concluir que la diferencia y la conexión entre los dos es: el objeto del juego es una unidad independiente en el juego, que puede estar compuesta por múltiples recursos. Por ejemplo, el escenario en el objeto del juego anterior está compuesto por modelos 3D. , imágenes y otros recursos. Se puede decir que el recurso es una plantilla que constituye un objeto de juego, y puede ser utilizado por múltiples objetos de juego.Por ejemplo, se pueden formar diferentes personajes en el juego modificando el mismo modelo 3D.

2. Descargue varios casos de juegos y resuma la estructura de organización de recursos y objetos respectivamente (refiriéndose a la estructura de organización del directorio de recursos y la estructura jerárquica del árbol de objetos del juego)

La estructura de organización del directorio de recursos es la siguiente, que generalmente incluye carpetas como fuentes, materiales, modelos, escenas, etc., y varios recursos se clasifican en estas carpetas.

El árbol de objetos del juego contiene todos los objetos del juego en la escena actual, y es una estructura de árbol, es decir, el nodo principal se ramificará a los nodos secundarios, y los nodos secundarios tendrán nuevos nodos secundarios, formando un árbol de objetos capa por capa. .

3. Escriba un código y use declaraciones de depuración para verificar el comportamiento básico de MonoBehaviour o las condiciones para la activación de eventos.

  • Los comportamientos básicos incluyen Awake() Start() Update() FixedUpdate() LateUpdate()

  • Los eventos comunes incluyen OnGUI() OnDisable() OnEnable()

Primero ejecuta el código

Como puede verse en la figura, Start(), Awake() y OnEnable() solo se ejecutan una vez, mientras que FixedUpdate(), Update(), LateUpdate(), OnGUI() siempre se ejecutan y el número de veces que FixedUpdate () se ejecuta Menos, mientras que Update () y LateUpdate () se ejecutan más veces, y OnGUI () se ejecuta más. Consulte el sitio web oficial para obtener explicaciones de los eventos relacionados y podrá conocer las condiciones para desencadenar estos comportamientos y eventos.

start() y wake() : estos dos comportamientos tienen algunas similitudes y se confunden fácilmente, por ejemplo, solo se llaman una vez y ambos se llaman antes de update(). Pero son diferentes, se llama a wake() inmediatamente después de inicializar el objeto, y sólo se garantiza que start() se llamará antes de update(), generalmente después de wake(), y si se llama inmediatamente después de wake() Set enable a false para deshabilitar update(), luego no se llamará a start().

OnEnable : se llama después de que el objeto se habilita en el estado activado (es decir, después de la llamada wake()). La diferencia con start() y wake() es que después de que el objeto se desactiva y reactiva, start() y wake( ) no se volverá a activar Called, y OnEnable() se volverá a llamar. La siguiente imagen es la pantalla después de la reactivación.

 Update() y LateUpdate() : estos dos comportamientos básicos se llaman en cada cuadro. Lateupdate() se llama después de que update() se haya ejecutado por completo. Un uso común de lateupdate() es seguir una cámara en tercera persona. Si mueves y giras a tu personaje dentro de update(), puedes realizar todos los cálculos de movimiento y rotación de la cámara en lateupdate(). Esto asegura que el personaje se mueva completamente antes de que la cámara rastree su posición.

OnGui() : esta función se llama varias veces por fotograma en respuesta a los eventos de la GUI.

Fixedupdate () : con la frecuencia del sistema de física, esta función se llama cada cuadro de velocidad de cuadro fijo.

Ondisable() : esta función se llama cuando el comportamiento está deshabilitado o inactivo.

4. Encuentre el manual de secuencias de comandos para comprender los objetos GameObject, Transform, Component

  • Traducir las descripciones oficiales de los tres objetos respectivamente (descripción)

Gameobject: Clase base para todas las entidades en Unity Scenes.1

GameObject : la clase base de todas las clases de entidades en la interfaz de Unity

Transformar: Posición, rotación y escala de un objeto.2

Transfrom : se utiliza para almacenar la posición, el ángulo de rotación y la escala de los objetos del juego.

Componente: Clase base para todo lo adjunto a GameObjects.3

Componente : la clase base para todo el contenido adjunto a GameObjects.

  • Describa las propiedades del objeto de tabla (entidad) en la figura a continuación, las propiedades de la Transformación de la tabla y los componentes de la tabla

La primera casilla de verificación indica si el objeto existe en la escena. Si el objeto no está marcado, el objeto desaparecerá en la escena; el cuadro de texto a la derecha es el nombre del objeto, y el derecho es si el objeto está configurado para estático o no Si está marcado, los objetos simplemente no se mueven durante el juego. La etiqueta a continuación puede establecer si se agrega una etiqueta al objeto, la capa puede establecer el revestimiento para el objeto y el prefabricado es prefabricado, que puede ser prefabricado para el objeto. anula es la cobertura.

 Hay tres atributos en la transformación, Posición es la posición del objeto, Rotación es el ángulo de rotación y Escala es el tamaño del objeto.

Hay cuatro partes de la tabla de la siguiente manera.

 

Valores preestablecidos de recursos (Prefabs) y clonación de objetos (Clonar)

  • ¿Cuáles son los beneficios de los prefabricados?

    La prefabricación es establecer un objeto de juego general como prefabricado. La ventaja es que puede usar este objeto de juego general como plantilla de clase para hacer algunas modificaciones y expansiones sobre la base de él, a fin de obtener continuamente nuevos objetos, que pueden ahorrar una gran cantidad de creación repetida de objetos y El tiempo requerido para establecer propiedades mejora en gran medida la eficiencia del trabajo.

  • ¿Cuál es la relación entre el preajuste y el objeto clonado (clonado o copiado o Instanciado de Unity Object)?

    Los ajustes preestablecidos en sí mismos no necesitan tener un GameObject instanciado, mientras que la clonación requiere una copia del GameObject instanciado. Y si desea modificar de forma centralizada los objetos creados al instanciar los ajustes preestablecidos, solo necesita modificar los ajustes preestablecidos para modificarlos todos, lo cual es conveniente para la modificación por lotes. Y si desea modificar los objetos clonados, solo puede modificarlos uno por uno.

  • Cree una mesa prefabricada, escriba un fragmento de código para instanciar el recurso de la mesa prefabricada en un objeto de juego

La relación entre los objetos GameObject, Transform y Component es la siguiente

 

dos calculadoras

resultado de ejecución:

el código se muestra a continuación

utilizando System.Collections; 
usando System.Collections.Generic; 
utilizando UnityEngine; 
usando System; 
public
class cccal : MonoBehaviour { 
    public GUIStyle buttonstyle; 
    cadena str=""; 
    void OnGUI(){ 
        //创建GUI 
        GUI.Box(new Rect (Screen.width/2-100,Screen.height/2-160, 235, 50), str); 
        
        if (GUI.Button (nuevo Rect (Screen.width/2-100,Screen.height/2-45,55,55), "1")) { 
            str += "1"; 
        } 
        if (GUI.Button (nuevo Rect (Screen.width/2-40,Screen.height/2-45,55,55), "2")) { 
            str += "2"; 
        }
        if (GUI.Botón (nuevo Rect (Pantalla.ancho/2+20,Pantalla.alto/2-45,55,55),
            cadena += "3"; 
        } 
        if (GUI.Button (nuevo Rect (Screen.width/2-100,Screen.height/2+10,55,55), "4")) { 
            str += "4"; 
        } 
        if (GUI.Button (nuevo Rect (Pantalla.ancho/2-40,Pantalla.alto/2+10,55,55), "5")) { 
            str += "5"; 
        } 
        if (GUI.Botón (nuevo Rect (Pantalla.ancho/2+20,Pantalla.alto/2+10,55,55), "6")) { 
            str += "6"; 
        }  
        if (GUI.Botón (nuevo Rect (Pantalla.ancho/2-100,Pantalla.alto/2+65,55,55), 
            "7")) { cadena += "7"; 
        }
        if (GUI.Button (nuevo Rect (Pantalla.ancho/2-40,Pantalla.alto/2+65,55,55), "8")) { 
            str += "8"; 
        } 
        if (GUI.Botón (nuevo Rect (Pantalla.ancho/2+20,Pantalla.alto/2+65,55,55), 
        } 
        if (GUI.Button (nuevo Rect (Screen.width/2+80, Screen.height/2+10 , 55, 55), "C")) { 
            str =""; 
        } 
        if (GUI.Button (nuevo Rect (Screen.width/2-100,Screen.height/2+120,115,55), "0")) { 
            str +="0"; 
        } 
        if (GUI.Button (nuevo Rect (Screen.width/2+20,Screen.height/2+120,55,55), ".")) { 
            str +="."; 
        } 
        if (GUI.Botón (nuevo Rect (Pantalla.ancho/2-100,Pantalla.alto/2-100,55,55), 
            "+")) { cadena +="+"; 
        }
        if (GUI.Botón (nuevo Rect (Pantalla.ancho/2-40,Pantalla.alto/2-100,55,55), 
            "-")) { cadena +="-"; 
        }
        if (GUI.Button (nuevo Rect (Screen.width/2+20,Screen.height/2-100,55,55), "x")) { 
            str +="*"; 
        } 
        if (GUI.Button (nuevo Rect (Screen.width/2+80,Screen.height/2-100,55,55), "/")) { 
            str +="/"; 
        } 
        if (GUI.Button (nuevo Rect (Screen.width/2+80, Screen.height/2-45 , 55, 55), "back")) { 
            if (str.Length > 0) 
                str = str.Remove (Str.Length-1,1) ; 
        } 
        if (GUI.Button (nuevo Rect (Screen.width/2+80,Screen.height/2+65,55,115), "=")) { 
            str = c. calcular(cadena); 
        } 
    } 
    public class mycocluator{ 
        float[] num = new float[100];
        int top1 = -1;//usado para registrar el número usado en num 
        Stack<doble> num2=new Stack<double>(); 
        Stack<char> cal2=new Stack<char>(); 
        char[] cal = new char[100]; 
        int top2 = -1;//usado para registrar el número usado en cal 
        bool flag=false;//usado para marcar si el primer número es negativo 
        public string compute(string s) { 
            int i = 0; 
            if(i==0 && s[i]=='-') 
            { 
                flag=true; 
                i++; 
            } 
            // Primero recorra la cadena para encontrar el operador 
            while (i < s. Longitud) { 
                cambiar (s [i]) {
                case '+': 
                    cal [top2 + 1] = '+'; 
                    top2++; 
                    break; 
                case '-': 
                    cal [top2 + 1] = '-'; 
                    top2++; 
                    break; 
                case '*': 
                    cal [top2 + 1 ] = '*'; 
                    top2++; 
                    break; 
                case '/': 
                    cal [top2 + 1] = '/'; 
                    top2++; 
                    break; 
                } 
                int j = 0; 
                //utilizado para registrar el número actualmente atravesado
                 
                    tmpnum += s [i + j]; 
                    j++; 
                } 
                if (j != 0) { 
                    float temp = float.Parse (tmpnum); 
                    top1++;    
                    if( top1 ==0 && flag==true) 
                    { 
                        num [top1] = 0-temp; 
                    } 
                    else 
                    { 
                        num [top1] = temp; 
                    } 
                    i += j; 
                } 
                else {
                    i++; 
                } 
            } 
        //Comience el cálculo, si encuentra * o /, primero calcule el producto o el cociente y luego colóquelo en la pila. 
        int l=0; 
        num2.Push(num[0]); 
                num2.Push(tmp/tmp2);
        for(int k=1;k<=top1;k++) 
        { 
            if(cal[l]=='*') 
            { 
                double tmp=num2.Peek(); 
                num2.Pop(); 
                doble tmp2=num[k]; 
                
                num2.Push(tmp*tmp2); 
            } 
            if(cal[l]=='/') 
            { 
                double tmp=num2.Peek(); 
                num2.Pop(); 
                doble tmp2=num[k]; 
                
            } 
            else if(cal[l]=='+'||cal[l]=='-') 
            { 
                cal2.Push(cal[l]); 
                num2.Push(num[k]); 
            } 
            l++; 
        }
        //Dado que la pila está invertida, 1-3-3 puede considerarse como 1-(3-3), por lo que la pila está invertida 
        ArrayList nnum=new ArrayList(); 
        ArrayList ccal=new ArrayList(); 
        while (num2. Count>0) 
        { 
            nnum.Add(num2.Peek()); 
            num2.Pop(); 
        } 
        while(cal2.Count>0) 
        { 
            ccal.Add(cal2.Peek()); 
            cal2.Pop( ); 
        } 
        for(int k=0;k<nnum.Count;k++) 
         } 
         //Hacer cálculo de pila solo para + y - 
        {
            num2.Push((doble)nnum[k]); 
        } 
        for(int k=0;k<ccal.Count;k++) 
        { 
            cal2.Push((char)ccal[k]); 
                num2.Pulsar(d);
        while(num2.Count>1) 
        { 
            double a=num2.Peek(); 
            num2.Pop(); 
            doble b=num2.Peek(); 
            num2.Pop(); 
            char c=cal2.Peek(); 
            cal2.pop(); 
            if(c=='+') 
            { 
                doble d=a+b; 
                num2.Pulsar(d); 
            } 
            if(c=='-') 
            { 
                doble d=ab; 
            } 
        } 
            bandera=falso; 
            devuelve num2.Peek().ToString(); 
        } 
    } 
//

    Use esto para la inicialización
    void Start () { 
    ​}
 
​//
    Update se llama una vez por cuadro 
    void Update () { 
    ​}
 
​​}



[1]   Unidad: API de secuencias de comandos: GameObject

[2]   Unity - API de secuencias de comandos: Transformar

[3]   Unity - API de secuencias de comandos: componente

Supongo que te gusta

Origin blog.csdn.net/weixin_52801288/article/details/127164629
Recomendado
Clasificación