GetComponent(PlayerController).isSneaking = true; } else { animation.CrossFade ("Walk"); GetComponent(PlayerController).isSneaking = false; } } } else { if (GetComponent(PlayerController).headsUp == true) { animation.CrossFade("Get Down"); GetComponent(PlayerController).isSneaking = true; } else { if (GetComponent(PlayerController).isSneaking == false) animation.CrossFade("Idle"); } } if (!GetComponent(PlayerController).IsMoving()) { if (Input.GetAxis("Vertical") <= -0.25) { animation.CrossFade("Get Down"); GetComponent(PlayerController).isSneaking = true; } else { GetComponent(PlayerController).isSneaking = false; } } } else { GetComponent(PlayerController).isSneaking = true; if (GetComponent(PlayerController).IsMoving() == false) { animation.CrossFade("Get Down",0.5); } else { animation.CrossFade("Sneak",0.5); } } } else { if (!GetComponent(PlayerController).isSneaking == true) animation.CrossFade("Landed"); }} E assim nossas animacoes estao prontas para desempenhar seu papel no game.Nessa funcao existe conteudo suficiente para um bom tempo de estudo. Deixando um pouco de lado a mecanica de nossas animacoes, vamos dar uma olhada mais de perto em o que exatamente estas linhas estao fazendo:Antes de tudo, nos verificamos se o personagem nao esta caindo a tempo suficiente para impedir sua movimentacao terrena, e se caso nao o estiver, seguimos em frente com as animacoes, caso contrario significa que precisamos tocar a animacao de pouso pois muito em breve ele ira tocar o solo. Verificamos isso atraves da funcao GetHangTime() que escreveremos no futuro.Em seguida, verificamos se o personagem nao colidiu com algum obstaculo que o force a se manter agachado atraves da variavel headsUp. A implementacao desta funcionalidade pode se tornar complexa pois envolve alguns conceitos que talvez nao sejam cobertos aqui, por isso talvez seja materia de um outro tutorial no futuro, quem sabe.Se o personagem estiver ciente de que ha algo sobre sua cabeca que o impede de levantar, ele sera obrigado a se mover agachado, caso contrario se o botao de corrida estiver pressionado ele podera correr, caso contrario eles apenas ira andar normalmente. Assim nos tocamos a animacao de correr ou andar ou engatinhar somente se o personagem esta mesmo se movendo, julgando isso atraves da funcao IsMoving() que ainda nao foi escrita.Note que as teclas virtuais do meu projeto tem nomes proprios ao inves do padrao criado pela Unity.Se voce precisar editar suas teclas virtuais, va ate Edit > Project Settings > Input.6.8 PlayerControllerPartiremos agora para o lado interativo que controla nossas animacoes com o script PlayerController.Va ate o menu Assets e crie mais um JavaScript, renomeio para PlayerController, adicione-o como componente do seu personagem, aplique as mudancas ao Prefab e estamos prontos para programar. Novamente, comecamos com a declaracao de variaveis:? 123456789101112131415 var movement : PlatformerControllerMovement;var jump : PlatformerControllerJumping;private var controller : CharacterController;var canControl = true;var spawnPoint : Transform;var floorHitFX : AudioClip;@System.NonSerializedvar isSneaking = false;@System.NonSerializedvar isFalling = false;@System.NonSerializedvar headsUp = false; As variaveis sao usadas para: movement: Usaremos esta variavel como identificador para a classe que determina os movimentos do personagem. jump: Usaremos esta variavel como identificador para a classe que controla toda mecanica do movimento de pulo do personagem. controller: criamos aqui uma instancia do Builtin Controller Component que deve ser adicionado ao personagem. Voce pode adicionar a linha @script RequireComponent(CharacterController) ao fim de seu script e assim que ele for adicionado a um objeto, o componente requerido tambem sera adicionado. canControl: Usaremos esta variavel para permitir