[TUTORIAL] Como programar um carro/moto voador(a)
Página 1 de 1
[TUTORIAL] Como programar um carro/moto voador(a)
Não sei se Voador ou Voadora é o termo correto para uma moto/carro q voa mas acho que é isso.. ;-;
Resolvi fazer um scriptzinho para movimentar motos e carros voadores depois de quase 4 horas programando (quase porque não fiquei 4 horas direto huehuehue) ai está ele
lotado de ifs mas serve
Comentar o código todo foi cansativo então to com preguiça de explicar detalhadamente como funciona...
Mas a movimentação é parecida com as motos e carros dos jogos da Lego
Coisitas configuraveis:
Todas as teclas,Velocidade,AlturaPulo e etc
Vídeo demonstrativo e informativo:
Tudo que da para fazer com esse script está nesse vídeo hehe ;-;
as partes que cai na água e não cai da moto é porque a água está sem a tag do mapa...
Desculpe a baixa qualidade novamente... os motivos são os mesmo: Gravador não grava em hd sem lagar, pc não é muito bom...
E agora vamos para o tutorial em texto huehuehue
Na verdade só comentei o código todo...
Fiz um exemplo de como usar para motos mas é quase a mesma coisa para carros.
Para melhorar a movimentação basta configurar o rigibody e as forças + o - e se quiser deixar o script menor é só remover as bools e colocar direto no código da key ;-; se mesmo assim não ficar bom sinta-se livre para modificar ;-;
Se esqueci de algo ou não está funcionando corretamente é só comentar que tento ajudar
Resolvi fazer um scriptzinho para movimentar motos e carros voadores depois de quase 4 horas programando (
lotado de ifs mas serve
Comentar o código todo foi cansativo então to com preguiça de explicar detalhadamente como funciona...
Mas a movimentação é parecida com as motos e carros dos jogos da Lego
Coisitas configuraveis:
Todas as teclas,Velocidade,AlturaPulo e etc
Vídeo demonstrativo e informativo:
Tudo que da para fazer com esse script está nesse vídeo hehe ;-;
as partes que cai na água e não cai da moto é porque a água está sem a tag do mapa...
Desculpe a baixa qualidade novamente... os motivos são os mesmo: Gravador não grava em hd sem lagar, pc não é muito bom...
E agora vamos para o tutorial em texto huehuehue
Na verdade só comentei o código todo...
- Script Moto & Carro:
Deverá ter o nome Moto ou a public class de acordo com o nome do .cs- Código:
// Grande parte das bools podem ser removidas só deixei para saber oque cada comando estava fazendo na hora de programar....
// pq não gosto do debug ;-;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // Biblioteca Ui usada para usar a ui
using System; // Biblioteca System usada para o serializable
[Serializable] // Cria uma nova class e adiciona uma setinha no Inspector
public class TeclasMov {
public KeyCode Frente, Re, Esquerda, Direita, Cima, ResetarPos, Spawnar, Interagir; // KeyCode é usado para salvar teclas
public GameObject CorpoPersonagem; // GameObject é usado para salvar Objetos
public Vector3 RotacaoDireita,RotacaoEsquerda; // Vector3 é usado para salvar o x,y,z
}
// Para mudar o nome troque o public class pelo nome do script.
public class Moto : MonoBehaviour { // Nome do script
// Variaveis //
public GameObject SpawnMoto; // GameObject é usado para salvar 1 Objeto
public Canvas Interagir; // Canvas é usado para salvar Canvas
public static bool Queda; // É uma alternativa que pode ser acessada por outros scripts se conter statice ex: Verdadeiro ou Falso
public TeclasMov Movimentos; // Aqui chamaremos a class criada acima pelo Serializable que é TeclasMov e daremos o nome de Movimentos
public float Velocidade,DistanciaMax, AlturaPulo; // É usada para salvar numeros com virgulas ex: 0,1 // As virgulas na variavel podem separar os mesmos tipos de variaveis em slots diferentes
private Quaternion RotacaoSalva; //Uma variavel privada que não será vista no inspector que guarda 4 eixos x,y,z,w
private bool Acelerando, Re, VirandoD, VirandoE, Pulo, Pegou; // É uma alternativa privada ex: Verdadeiro ou Falso
Rigidbody Fisica; // Variavel privada que guarda o 1 Rigibody
GameObject Jogador; // Variavel privada que guarda 1 Objeto
// Variaveis //
void Start () { // Void que será chamada apenas no incio do jogo
Interagir.enabled = false; // O Canvas "interagir" ficará desativado
Movimentos.CorpoPersonagem.SetActive (false); // O "CorpoPersonagem" será desativado
RotacaoSalva = this.transform.rotation; // A variavel "RotacaoSalva" receberá a rotação inicial do objeto com o script "Moto"
Fisica = GetComponent<Rigidbody> (); // A variavel "Fisica" receberá o Rigidbody do objeto com o script "Moto"
Jogador = GameObject.FindWithTag ("Player"); // "Jogador" receberá o objeto com a tag "Player"
}
void Update () { // Void chamada em todos os frames
// Variaveis na void Update //
float Distancia; // Já explicado
Quaternion RotacaoDireitaDelta = Quaternion.Euler (Movimentos.RotacaoDireita * Time.deltaTime); // Aqui a "RotacaoDireitaDelta" receberá o "Movimentos.RotacaoDireita * Time.deltaTime"
// Sempre que usarmos alguma variavel criada na class "Movimentos" terá " Movimentos. "
Quaternion RotacaoEsquerdaDelta = Quaternion.Euler (Movimentos.RotacaoEsquerda * Time.deltaTime);// Aqui a "RotacaoEsquerdaDelta" receberá o "Movimentos.RotacaoEsquerda * Time.deltaTime"
// Variaveis na void Update //
// Codigos sozinhos //
Distancia = Vector3.Distance (this.transform.position, Jogador.transform.position); // A variavel Distancia será sempre a soma da distancia desse objeto com o "Jogador"
// Codigos sozinhos //
// Queda //
if (Queda == true) { // Se a variavel Queda for true acontecerá ós códigos dentro da chave
Pegou = false; // "Pegou" será false
// "Pegou" é como se o jogador estive-se em cima da moto nesse caso
Movimentos.CorpoPersonagem.SetActive (false); // O "CorpoPersonagem" será desativado
Jogador.transform.position = this.transform.position; // O "Jogador" ficará na posição desse objeto
this.transform.position = this.transform.position; // Esse objeto travará na posição atual
Jogador.SetActive (true); // O "Jogador" será ativado
Queda = false; // A variavel "Queda" ficará false
}
// Queda //
// Interação //
if (Distancia < DistanciaMax) { // Se a Distancia for menor que a DistanciaMax acontecerá ós códigos dentro da chave
Interagir.enabled = true; // O Canvas "Interagir" será ativado
if (Input.GetKeyDown (Movimentos.Interagir)) { // Se apertar a tecla "Interagir" e a distancia for menor acontecerá ós códigos dentro da chave
Interagir.enabled = false; // O Canvas "Interagir" será desativado
Movimentos.CorpoPersonagem.SetActive (true); // O "CorpoPersonagem" será ativado
this.transform.rotation = RotacaoSalva; // A rotacao desse objeto será a "RotacaoSalva"
Pegou = true; // "Pegou" Ficará true
Jogador.SetActive (false); // O "Jogador" será desativado
}
} else {
Interagir.enabled = false; // Já explicado
}
// Interação //
if (Input.GetKeyDown (Movimentos.Spawnar)) { // Já explicado
StartCoroutine ("DarSpawn"); // A Coroutine "DarSpawn" será chamada se a condição for feita.
}
if (Pegou == true) { // Já explicado
// Teclas //
if (Input.GetKey (Movimentos.ResetarPos)) { // Já explicado
this.transform.rotation = RotacaoSalva; // Já explicado
StartCoroutine ("Parar");// A Coroutine "Parar" será chamada se a condição for feita.
}
if (Input.GetKey (Movimentos.Frente)) { // Já explicado
Acelerando = true; // "Acelerando" Ficará true
Re = false; // "Re" Ficará true
} else { // Se a condição não for feita os codigos da chave serão executados
if (Re == false) { // Já explicado
StartCoroutine ("Parar"); // Já explicado
}
}
if (Input.GetKey (Movimentos.Re)) {
Re = true; // Já explicado
Acelerando = false; // Já explicado
} else { // Se a condição não for feita os codigos da chave serão executados
if (Acelerando == false) { // Já explicado
StartCoroutine ("Parar"); // Já explicado
}
}
if (Input.GetKey (Movimentos.Direita)) { // Já explicado
VirandoD = true; // "VirandoD" Ficará true
VirandoE = false;// "VirandoE" Ficará false
} else { // Se a condição não for feita os codigos da chave serão executados
if (VirandoE == false) { // Já explicado
StartCoroutine ("Parar"); // Já explicado
}
}
if (Input.GetKey (Movimentos.Esquerda)) { // Já explicado
VirandoE = true; // Já explicado
VirandoD = false; // Já explicado
} else { // Já explicado
if (VirandoD == false) { // Já explicado
StartCoroutine ("Parar"); // Já explicado
}
}
if (Input.GetKey (Movimentos.Cima)) { // Já explicado
Pulo = true; // Já explicado
} else { // Já explicado
Pulo = false; // Já explicado
}
// Teclas //
// Movimento //
if (Acelerando == true) { // Já explicado
Fisica.AddForce (transform.forward * Velocidade, ForceMode.Acceleration); // Será adicionada força do tipo Acceleration na parte "forward" vezes a "Velocidade" do objeto com o rigibody Fisica
//AddForce //ForceMode.Acceleration // transform.forward * Velocidade
}
if (Re == true) {
Fisica.AddForce (transform.forward * -Velocidade, ForceMode.Acceleration); // Será adicionada força do tipo Acceleration na parte negativa do "forward" vezes a "Velocidade" do objeto com o rigibody Fisica
//AddForce //ForceMode.Acceleration // transform.forward * -Velocidade
}
if (VirandoD == true) {
Fisica.MoveRotation (Fisica.rotation * RotacaoDireitaDelta); // O Objeto com a variavel "Fisica" será rotacionado de sua posicao atual até a "RotacaoDireitaDelta"
//Fisica.MoveRotation //(Fisica.rotation * RotacaoDireitaDelta)
}
if (VirandoE == true) {
Fisica.MoveRotation (Fisica.rotation * RotacaoEsquerdaDelta);// O Objeto com a variavel "Fisica" será rotacionado de sua posicao atual até a "RotacaoEsquerdaDelta"
http://Fisica.MoveRotation //(Fisica.rotation * RotacaoEsquerdaDelta)
}
// ^^^^
// Também funcionaria Usar uma rotacaoDelta negativa em vez de colocar 2 ifs nessa parte acima ^^^^
// ^^^^
if (Pulo == true) { // Já explicado
Fisica.AddForce (transform.up * AlturaPulo, ForceMode.Impulse); // Será adicionada força do tipo Impulse na parte "up" vezes a "AlturaPulo" do objeto com o rigibody Fisica
// Fisica.AddForce // ForceMode.Impulse http://transform.up * AlturaPulo
}
// Movimento //
}
}
IEnumerator Parar () { // A coroutine "Parar" chamada anteriormente será ativada aqui
yield return new WaitForSeconds (1); // Aguardará 1 segundo e executará os comandos abaixo
Re = false; // Já explicado
Acelerando = false; // Já explicado
VirandoD = false; // Já explicado
VirandoE = false; // Já explicado
StopCoroutine ("Parar"); // Irá parar a couroutine "Parar"
}
IEnumerator DarSpawn () { // A coroutine "DarSpawn" chamada anteriormente será ativada aqui
yield return new WaitForSeconds (3);// Aguardará 3 segundos e executará os comandos abaixo
Re = false; // Já explicado
Acelerando = false; // Já explicado
VirandoD = false; // Já explicado
VirandoE = false; // Já explicado
this.transform.position = SpawnMoto.transform.position; // A posição do objeto será a mesma do "SpawnMoto"
this.transform.rotation = SpawnMoto.transform.rotation; // A rotação do objeto será a mesma do "SpawnMoto"
StopCoroutine ("DarSpawn"); // Irá parar a couroutine "DarSpawn"
}
} // Finaliza o script
- Script Queda da moto:
Deverá ter o nome motoQueda ou a public class de acordo com o nome do .cs- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class motoQueda : MonoBehaviour {
public string TagMapa; // Será usada para gravar a "TagMapa" // Strings são utilizadas para gravar arquivos em textos ex: "Irineu você não sabe nem eu"
void OnTriggerEnter (Collider Col) { // Ao entrar no trigger com o Colisor "col" os comandos dentro da chave serão executados
if (Col.gameObject.tag == TagMapa) { // Se o colisor "col" colidir com o objeto com a "TagMapa"
Moto.Queda = true; // Chamaremos a " bool static Queda " do script moto e deixaremos true
}
}
} // Finaliza o código
- Script Limite:
Deverá ter o nome Limite ou a public class de acordo com o nome do .cs- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Limite : MonoBehaviour {
// Variaveis //
public string TagMoto; // Será usada para gravar a "TagMoto"
bool Atuando;
// Variaveis //
void OnTriggerEnter (Collider col) { // Ao entrar no trigger com o Colisor "col" os comandos dentro da chave serão executados
if (col.gameObject.tag == TagMoto) { // Se o colisor "col" colidir com o objeto com a "TagMoto"
Atuando = true; // Atuando ficará true
}
}
void OnTriggerExit (Collider col) { // Ao sair do trigger com o Colisor "col" os comandos dentro da chave serão executados
if (col.gameObject.tag == TagMoto) { // Se o colisor "col" parar de colidir com o objeto com a "TagMoto"
Atuando = false; // Atuando ficará false
}
}
// //
// Modifique essa parte para que tenha diferentes reações na chegada no limite //
// //
void Update () {
if (Atuando == true) { // Se atuando for true
Moto.Queda = true; // Chamaremos a " bool static Queda " do script moto e deixaremos true
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//
// Modifique essa parte para que tenha diferentes reações na chegada no limite //
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//
} // Finaliza o codigo
Fiz um exemplo de como usar para motos mas é quase a mesma coisa para carros.
- Modo de usar:
1 - Faça um Collider de preferencia um cubo e ajuste de modo que sobre algum espaço sobre o lado da moto.
Observe que o mesh não está no meio mas tente deixar bem centralizado...
2 - Coloque o mesh da moto como filho do collider.
3 - Faça um outro collider só que agora coloque ele como filho do collider com a mesh da moto.
4 - Coloque bem centralizado na cabeça do personagem.
5 - Adicione um rigibody ao primeiro collider.
6 - Configure do modo que você quiser, eu configurei assim:
7 - Adicione o script moto ao primeiro collider.
8 - Configure do modo que seja adequado em relação ao rigidbody, o meu está assim:
A variavel Rotacao Direita define a velocidade e o eixo que a moto rotacionará para a Direita.
A variavel Rotacao Esquerda define a velocidade e o eixo que a moto rotacionará para a Esquerda.
Velocidade é a velocidade.
Distancia Max é a distancia necessaria para subir na moto.
Altura Pulo é a altura precisa para o Pulo.
Resetar Pos é a tecla que resetará a rotação da moto.
Spawnar é a tecla que instanciará a moto.
O resto é meio obvio ;-;
Ignore os GameObjects por hora jaja irei explicar.
9 - Faça duas tags uma para o Mapa e outra para a Moto ou utilize a própria do player (não explicarei porque é algo fácil de se encontrar por ai).
10 - Coloque o script motoQueda no segundo collider e coloque a tag do mapa criada no passo 9.
11 - Faça um terceiro Collider que será o Limite de altura.
12 - Coloque o script Limite nele e configure da melhor forma, o meu está assim.
Ignore o slot da Gravidade ele seria a força que a moto seria empurrada para baixo, mas fazer algo bom demoraria mais ainda, talvez em uma breve att do script ensino a fazer esse sisteminha...
13 - Faça um Objeto vazio e coloque o personagem dentro dele juntamente com a camera que seguirá o mesmo (não é preciso colocar a camera mas se você quiser coloque...).
14 - Faça um canvas com um Text e configure do modo que você quiser, caso já tenha um canvas apenas mude o "Interagir" do script moto de Canvas para Text.
15 - Faça outro Objeto vazio e deixe como filho do jogador ele será onde a moto será spawnada.
16 - Coloque o primeiro Objeto vazio na variavel CorpoPersonagem.
17 - Coloque o canvas na variavel Interagir.
18 - Coloque o segundo objeto vazio na variavel SpawnMoto.
Pronto seu script está configurado.
Para melhorar a movimentação basta configurar o rigibody e as forças + o - e se quiser deixar o script menor é só remover as bools e colocar direto no código da key ;-; se mesmo assim não ficar bom sinta-se livre para modificar ;-;
Se esqueci de algo ou não está funcionando corretamente é só comentar que tento ajudar
Tópicos semelhantes
» [TUTORIAL] Luz Principal,Luz de Freio,Piscas para Carro,Moto,Caminhão,Ônibus,Etc...
» Rodas Saem do carro e da moto
» Script para andar no Carro/Moto
» [TUTORIAL] Entrar no carro estilo GTA
» [TUTORIAL] Suspensão de carro com SLIDER
» Rodas Saem do carro e da moto
» Script para andar no Carro/Moto
» [TUTORIAL] Entrar no carro estilo GTA
» [TUTORIAL] Suspensão de carro com SLIDER
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos