[TUTORIAL] Sistema de trem
5 participantes
Página 1 de 1
[TUTORIAL] Sistema de trem
Olá, fiz um simples sistema de trem, nele contem parada de estações e aumento de velocidade caso a próxima posição esteja longe. Você vai precisa de Cubos com uma tag e com isTrigger. E para o trem para na estação basta marcar a booleana "Usar sistema" e criar um cubo para ser a estação nela você coloca uma tag diferente da dos cubos. São 2 script 1 no seu Trem e outros nos Cubos que no caso vão ser os Waypoints!
Seu trem precisa de um RigidBody com isKinematic marcado, caso não queira IsKinematic basta fazer uma linha no script para ignorar a tag do estação.
Video:
Script do Trem:
Script do Colisor(Waypoint):
Quanto mais Waypoint um perto do outro ficara melhor, no video fico talvez meio seco as curvas porque usei poucos colisores. Bom proveito!
Seu trem precisa de um RigidBody com isKinematic marcado, caso não queira IsKinematic basta fazer uma linha no script para ignorar a tag do estação.
Video:
Script do Trem:
- Código:
public GameObject ProximoPonto; //Ponto inicial do trem.
private GameObject SegundaPos; //Segunda posicao.
public string TagColisor; //Tag do colisor.
public float Velocidade; //Velocidade Do Trem.
public float VelocidadeDeGiro; //Velocidade em que o trem vai olhar para o proximo ponto.
public float ForcaFreio; // Forca em que ele vai ser parado. Recomendavel Menor que 1!
private bool Ligado; //Essa bool liga e desliga o trem.
public LayerMask Mask; //Layer não ignoradas.
public KeyCode LigarDesligar; //Liga e desliga o Trem
[Header("Configurações para aumentar velocidade")] //Configurações para aumentar a velocidade em relaçao ao proximo ponto.
public float DistanciaAumentar; //Distancia maxima do objeto para aumentar a velocidade
public float VelocidadeMaxima; //Velocidade maxima que vai chegar
private float VelocidadeInicial; //Velocidade inicial do Trem = Velocidade.
[Header("Configurações de parada na estacao")]
public bool UsarSistema;
public string TagEstacao;
private bool EstacaoParar;
public float TempoNoLugar;
public float DistanciaVerificacao;
private Vector3 Estacao;
void Start () {
VelocidadeInicial = Velocidade;
}
void Update () {
if (UsarSistema == true) {
VerificarEstacao ();
}
if (Input.GetKeyDown (LigarDesligar)) {
Ligado = !Ligado;
}
if (Ligado && ProximoPonto != null && EstacaoParar == false) {
ChecarDistancia ();
OlharParaPosicao ();
transform.position = Vector3.MoveTowards (transform.position, ProximoPonto.transform.position, Velocidade * Time.deltaTime);
if (transform.position == ProximoPonto.transform.position) {
transform.position = Vector3.MoveTowards (transform.position, SegundaPos.transform.position, Velocidade * Time.deltaTime);
ProximoPonto = SegundaPos;
}
} else {
Debug.Log ("Sem proxima posição");
}
}
void OlharParaPosicao () {
if (SegundaPos != null) {
var Rotacao = Quaternion.LookRotation (SegundaPos.transform.position - transform.position);
transform.rotation = Quaternion.Slerp (transform.rotation, Rotacao, Time.deltaTime * VelocidadeDeGiro);
if (SegundaPos == null) {
Rotacao = Quaternion.LookRotation (ProximoPonto.transform.position - transform.position);
}
if (EstacaoParar == true) {
Rotacao = Quaternion.LookRotation (Estacao - transform.position);
}
}
}
void OnTriggerEnter (Collider Colisor) {
if (Colisor.gameObject.tag == TagColisor) {
SegundaPos = Colisor.gameObject.GetComponent<PontoController> ().ProxPonto;
}
if (Colisor.gameObject.tag == TagColisor) {
SegundaPos = Colisor.gameObject.GetComponent<PontoController> ().ProxPonto;
}
}
void VerificarEstacao () {
RaycastHit Colisor;
Debug.DrawRay (transform.position, transform.TransformDirection(Vector3.forward) * DistanciaVerificacao, Color.blue);
if (Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), out Colisor, DistanciaVerificacao, Mask)) {
if (Colisor.collider.gameObject.tag == TagEstacao) {
Debug.Log ("ColidiuComEstacao");
Estacao = Colisor.collider.gameObject.transform.position;
EstacaoParar = true;
}
}
if (EstacaoParar == true) {
OlharParaPosicao ();
StartCoroutine ("TempoNaEstacao");
transform.position = Vector3.MoveTowards (transform.position, Estacao, Velocidade * Time.deltaTime);
if (Velocidade >= 0.3f) {
Velocidade -= ForcaFreio;
}
}
}
void ChecarDistancia () {
float x = Vector3.Distance (transform.position, ProximoPonto.transform.position);
if (x > DistanciaAumentar) {
if (Velocidade <= VelocidadeMaxima)
Velocidade += 0.1f;
} else if (x < DistanciaAumentar && Velocidade >= VelocidadeInicial) {
Velocidade -= ForcaFreio;
}
}
IEnumerator TempoNaEstacao () {
yield return new WaitForSeconds (TempoNoLugar);
if (Velocidade < VelocidadeInicial) {
Velocidade += 0.1f;
}
EstacaoParar = false;
}
}
Script do Colisor(Waypoint):
- Código:
public class PontoController : MonoBehaviour {
public GameObject ProxPonto; //Aqui você coloca a proxima posicao do trem de quando o trem chega nesse que tem o script
}
Quanto mais Waypoint um perto do outro ficara melhor, no video fico talvez meio seco as curvas porque usei poucos colisores. Bom proveito!
rafaelllsd- ProgramadorMaster
- PONTOS : 5241
REPUTAÇÃO : 507
Idade : 24
Áreas de atuação : Unity, Audacity, Blender, Gimp, C#, JS, MySQL.
Respeito as regras :
Re: [TUTORIAL] Sistema de trem
Vlw pessoal :D
rafaelllsd- ProgramadorMaster
- PONTOS : 5241
REPUTAÇÃO : 507
Idade : 24
Áreas de atuação : Unity, Audacity, Blender, Gimp, C#, JS, MySQL.
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] Sistema de DIA E NOITE completo, com luzes noturnas e SISTEMA DE NUVENS
» [TUTORIAL] Sistema de Arma 3D
» [TUTORIAL] Sistema de Interruptor
» [TUTORIAL] Sistema de FPS com Corpo
» [TUTORIAL] Sistema de Velocimetro
» [TUTORIAL] Sistema de Arma 3D
» [TUTORIAL] Sistema de Interruptor
» [TUTORIAL] Sistema de FPS com Corpo
» [TUTORIAL] Sistema de Velocimetro
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos