lição de casa jogo 3d 2

Tarefa de Jogo 3D 2

1. Perguntas de resposta curta

1. Explique a diferença e a conexão entre GameObjects e Assets.

A explicação do Unity sobre recursos e objetos do jogo é a seguinte

Ativo : Qualquer mídia ou dados que podem ser usados ​​em um jogo ou projeto. Os ativos podem vir de arquivos criados fora do Unity, como modelos 3D, arquivos de áudio, imagens. Também existem tipos de ativos que podem ser criados no Unity, como Animator Controllers, Audio Mixers ou Render Textures.

Objeto do jogo : O objeto básico na cena do Unity, que pode representar personagens, adereços, cenário, câmeras, pontos de caminho, etc. A funcionalidade de um objeto de jogo é definida pelos componentes anexados ao objeto de jogo.

A partir disso, podemos concluir que a diferença e conexão entre os dois é: o objeto do jogo é uma unidade independente no jogo, que pode ser composta por vários recursos. Por exemplo, o cenário no objeto do jogo acima é composto por modelos 3D , imagens e outros recursos. O recurso pode ser considerado um modelo que constitui um objeto do jogo e pode ser usado por vários objetos do jogo, por exemplo, diferentes personagens do jogo podem ser formados modificando o mesmo modelo 3D.

2. Baixe vários casos de jogos e resuma a estrutura de organização de recursos e objetos, respectivamente (referindo-se à estrutura de organização do diretório de recursos e à estrutura hierárquica da árvore de objetos do jogo)

A estrutura de organização do diretório de recursos é a seguinte, que geralmente inclui pastas como fontes, materiais, modelos, cenas, etc., e vários recursos são classificados nessas pastas

A árvore de objetos do jogo contém todos os objetos do jogo na cena atual e é uma estrutura de árvore, ou seja, o nó pai se ramificará em nós filhos e os nós filhos terão novos nós filhos, formando uma árvore de objetos camada por camada .

3. Escreva um código e use instruções de depuração para verificar o comportamento básico do MonoBehaviour ou as condições para o acionamento do evento

  • Os comportamentos básicos incluem Awake() Start() Update() FixedUpdate() LateUpdate()

  • Eventos comuns incluem OnGUI() OnDisable() OnEnable()

Execute o código primeiro

Como pode ser visto na figura, Start(), Awake() e OnEnable() são executados apenas uma vez, enquanto FixedUpdate(), Update(), LateUpdate(), OnGUI() são sempre executados e o número de vezes FixedUpdate () é executado menos, enquanto Update () e LateUpdate () são executados mais vezes, e OnGUI () é executado mais. Consulte o site oficial para obter explicações sobre os eventos relacionados e poderá conhecer as condições para desencadear esses comportamentos e eventos.

start() e wake() : Esses dois comportamentos possuem algumas semelhanças e são facilmente confundidos, por exemplo, eles são chamados apenas uma vez e ambos são chamados antes de update(). Mas eles são diferentes, wake() é chamado imediatamente após o objeto ser inicializado, e start() só é garantido para ser chamado antes de update(), geralmente depois de wake(), e se for chamado imediatamente após wake() Set enable para false para desabilitar update(), então start() não será chamado.

OnEnable : Chamado após o objeto ser habilitado no estado ativado (ou seja, após a chamada wake()). A diferença de start() e wake() é que após o objeto ser desativado e reativado, start() e wake( ) não será ativado novamente Chamado e OnEnable() será chamado novamente. A imagem abaixo é o display após a reativação.

 Update() e LateUpdate() : Esses dois comportamentos básicos são chamados a cada quadro. lateupdate() é chamado depois que update() é totalmente executado. Um uso comum de lateupdate() é seguir uma câmera em terceira pessoa. Se você mover e virar seu personagem dentro de update(), você pode executar todos os cálculos de movimento e rotação da câmera em lateupdate(). Isso garante que o personagem seja totalmente movido antes que a câmera rastreie sua posição.

OnGui() : Esta função é chamada várias vezes por quadro em resposta a eventos GUI.

Fixedupdate() : Com a frequência do sistema de física, esta função é chamada de cada quadro de taxa de quadros fixa.

Ondisable() : Esta função é chamada quando o comportamento está desabilitado ou inativo.

4. Encontre o manual do script para entender os objetos GameObject, Transform e Component

  • Traduza as descrições oficiais dos três objetos respectivamente (descrição)

Gameobject:Classe base para todas as entidades em Unity Scenes.1

GameObject : a classe base de todas as classes de entidade na interface da unidade

Transform:Posição, rotação e escala de um objeto.2

Transfrom : Usado para armazenar a posição, o ângulo de rotação e o dimensionamento dos objetos do jogo.

Component:Classe base para tudo anexado a GameObjects.3

Component : A classe base para todo o conteúdo anexado a GameObjects.

  • Descreva as propriedades do objeto tabela (entidade) na figura abaixo, as propriedades do Transform da tabela e os componentes da tabela

A primeira caixa de seleção indica se o objeto existe na cena. Se o objeto estiver desmarcado, o objeto desaparecerá na cena; a caixa de texto à direita é o nome do objeto e a direita é se o objeto está definido para estático ou não. Se marcado, os objetos simplesmente não se movem durante o jogo. A tag abaixo pode definir se deve adicionar uma tag ao objeto, a camada pode definir o revestimento para o objeto e o pré-fabricado é pré-fabricado, que pode ser pré-fabricado para o objeto. substitui é a cobertura.

 Existem três atributos na transformação, Posição é a posição do objeto, Rotação é o ângulo de rotação e Escala é o tamanho do objeto.

Existem quatro partes da tabela a seguir.

 

Predefinições de recursos (Prefabs) e clonagem de objetos (Clone)

  • Quais são os benefícios dos pré-fabricados

    A pré-fabricação é definir um objeto de jogo geral como pré-fabricado. A vantagem é que você pode usar esse objeto de jogo geral como um modelo de classe para fazer algumas modificações e expansões com base nele, de modo a obter continuamente novos objetos, o que pode economizar muita criação repetida de objetos e O tempo necessário para definir propriedades melhora muito a eficiência do trabalho.

  • Qual é a relação entre a predefinição e o clone do objeto (clone ou cópia ou instanciação do objeto Unity)?

    As próprias predefinições não precisam ter um GameObject instanciado, enquanto a clonagem requer uma cópia do GameObject instanciado. E se você deseja modificar centralmente os objetos criados instanciando as predefinições, basta modificar as predefinições para modificá-las todas, o que é conveniente para modificação em lote. E se você quiser modificar os objetos clonados, você só pode modificá-los um por um.

  • Faça uma mesa pré-fabricada, escreva um código para instanciar o recurso prefab da mesa em um objeto de jogo

A relação entre os objetos GameObject, Transform e Component é a seguinte

 

duas calculadoras

resultado em execução:

código mostra como abaixo

usando System.Collections; 
usando System.Collections.Generic; 
usando UnityEngine; 
using System; 
public
class cccal : MonoBehaviour { 
    public GUIStyle buttonstyle; 
    string str=""; 
    void OnGUI(){ 
        //创建GUI 
        GUI.Box(new Rect (Screen.width/2-100,Screen.height/2-160, 235, 50), str); 
        
        if (GUI.Button (new Rect (Screen.width/2-100,Screen.height/2-45,55,55), "1")) { 
            str += "1"; 
        } 
        if (GUI.Button (new Rect (Screen.width/2-40,Screen.height/2-45,55,55), "2")) { 
            str += "2"; 
        }
        if (GUI.Button (new Rect (Screen.width/2+20,Screen.height/2-45,55,55), "3")) { 
            str += "3"; 
        } 
        if (GUI.Button (new Rect (Screen.width/2-100,Screen.height/2+10,55,55), "4")) { 
            str += "4"; 
        } 
        if (GUI.Button (new Rect (Screen.width/2-40,Screen.height/2+10,55,55), "5")) { 
            str += "5"; 
        } 
        if (GUI.Button (new Rect (Screen.width/2+20,Screen.height/2+10,55,55), "6")) { 
            str += "6"; 
        } 
        if (GUI.Button (novo Rect (Screen.width/2-100,Screen.height/2+65,55,55), 
            "7")) { str += "7"; 
        }
        if (GUI.Button (new Rect (Screen.width/2-40,Screen.height/2+65,55,55), "8")) { 
            str += "8"; 
        }
        } 
        if (GUI.Button (novo Rect (Screen.width/2+20,Screen.height/2+65,55,55),
        } 
        if (GUI.Button (new Rect (Screen.width/2+80, Screen.height/2+10 , 55, 55), "C")) { 
            str =""; 
        } 
        if (GUI.Button (new Rect (Screen.width/2-100,Screen.height/2+120,115,55), "0")) { 
            str +="0"; 
        } 
        if (GUI.Button (new Rect (Screen.width/2+20,Screen.height/2+120,55,55), ".")) { 
            str +="."; 
        } 
        if (GUI.Button (new Rect (Screen.width/2-100,Screen.height/2-100,55,55), "+")) { 
            str +="+"; 
        if (GUI.Button (novo Rect (Screen.width/2-40,Screen.height/2-100,55,55), 
            "-")) { str +="-"; 
        } 
        if (GUI.Button (new Rect (Screen.width/2 +20,Screen.height/2-100,55,55), "x")) { 
            str +="*"; 
        } 
        if (GUI.Button (new Rect (Screen.width/2+80,Screen.height/2-100,55,55), "/")) { 
            str +="/"; 
        } 
        if (GUI.Button (new Rect (Screen.width/2+80, Screen.height/2-45 , 55, 55), "back")) { 
            if (str.Length > 0) 
                str = str.Remove (str.Comprimento-1,1); 
        } 
        if (GUI.Button (novo Rect (Screen.width/2+80,Screen.height/2+65,55,115), 
            str = c. 
        } 
    } 
    public class mycocluator{ 
        float[] num = new float[100];
        int top1 = -1;//usado para registrar o número usado em num 
        Stack<double> num2=new Stack<double>(); 
        Stack<char> cal2=new Stack<char>(); 
        char[] cal = new char[100]; 
        int top2 = -1;//usado para registrar o número usado em cal 
        bool flag=false;//usado para marcar se o primeiro número é negativo 
        public string calculate(string s) { 
            int i = 0; 
            if(i==0 && s[i]=='-') 
            { 
                flag=true; 
                i++; 
            } 
            // Atravesse a string primeiro para descobrir o operador 
            while (i < s. Length) { 
                alternar (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; 
                //usado para registrar o número atualmente percorrido
                string tmpnum = ""; 
                //Encontre o número na string 
                
                    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++; 
                } 
            } 
        //Comece o cálculo, se você encontrar * ou /, primeiro calcule o produto ou quociente e depois coloque-o na pilha. 
        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(); 
                duplo tmp2=num[k]; 
                
                num2.Push(tmp*tmp2); 
            } 
            if(cal[l]=='/') 
            { 
                double tmp=num2.Peek(); 
                num2.Pop(); 
                duplo tmp2=num[k]; 
                
            } 
            else if(cal[l]=='+'||cal[l]=='-') 
            { 
                cal2.Push(cal[l]); 
                num2.Push(num[k]); 
            } 
            l++; 
        } 
        //Porque A pilha é invertida, então 1-3-3 pode ser considerado como 1-(3-3), então inverta a pilha 
        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++) 
        {
            num2.Push((double)nnum[k]); 
        } 
        for(int k=0;k<ccal.Count;k++) 
        { 
            cal2.Push((char)ccal[k]); 
                num2.Push(d); 
         } 
         //Faça o cálculo da pilha apenas para + e -
        while(num2.Count>1) 
        { 
            double a=num2.Peek(); 
            num2.Pop(); 
            duplo b=num2.Peek(); 
            num2.Pop(); 
            char c=cal2.Peek(); 
            cal2.Pop(); 
            if(c=='+') 
            { 
                double d=a+b; 
                num2.Push(d); 
            } 
            if(c=='-') 
            { 
                double d=ab; 
            } 
        } 
            sinalizador=falso; 
            return num2.Peek().ToString(); 
        } 
    } 
​​//

    Use isso para inicialização
    Start () { 
    ​}
 
​//
    Update é chamado uma vez por quadro 
    void Update () { 
    ​}
 
​​}



[1]   Unity - API de script: GameObject

[2]   Unity - API de script: transformação

[3]   Unity - API de script: componente

Acho que você gosta

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