Sistema de Plataforma com Rotas controlado por Touch
2 participantes
Página 1 de 1
Sistema de Plataforma com Rotas controlado por Touch
Olá Galera, sou novo por aqui e iniciante no Desenvolvimento de Games, mas já apaixonado pelo fórum (Parabéns aos criadores, pois está tirando muitas dúvidas minhas), estou estudando um curso de C# que Marcos Schultz postou aqui no fórum, mas ainda não consigo realizar alguns procedimentos com a informação que tenho.
O próprio Marcos Schultz postou um Tutorial que faz um Sistema de Plataforma com rotas, porém eu não estou conseguindo controlar essa rota através do touch.
Como eu poderia controlar a ida a cada ponto com o touch? Tipo, ele fica parado no ponto A, para ir ao ponto B teria que tocar em cima do Objeto (Cubo), para ir ao C toca no Objeto (cubo) e assim ficar no loop em quantos pontos eu tiver na cena, sempre tocando no objeto para ele se mover para o próximo ponto.
Link do Tutorial - https://www.schultzgames.com/t3654-tutorial-unity-5-sistema-de-plataformas-com-rotas#61904
Código Utilizado:
[list=linenums]
[*]using System.Collections;
[*]using System.Collections.Generic;
[*]using UnityEngine;
[*]public class Plataforma : MonoBehaviour {
[*] public GameObject[] locais;
[*] public int destinoInicial = 0;
[*] public float velocidade = 10;
[*] public bool comecarInvertido;
[*] public bool reiniciarSequencia;
[*] int localAtual = 0;
[*] bool inverter = false;
[*] void Start () {
[*] if (destinoInicial < locais.Length) {
[*] localAtual = destinoInicial;
[*] } else {
[*] localAtual = 0;
[*] }
[*] //
[*] if (comecarInvertido == true) {
[*] inverter = true;
[*] }
[*] }
[*] void Update () {
[*] if (inverter == false) {
[*] if (Vector3.Distance (transform.position, locais [localAtual].transform.position) < 0.1f) {
[*] if (localAtual < locais.Length - 1) {
[*] localAtual++;
[*] } else {
[*] if (reiniciarSequencia == true) {
[*] localAtual = 0;
[*] } else {
[*] inverter = true;
[*] }
[*] }
[*] }
[*] transform.position = Vector3.MoveTowards (transform.position, locais [localAtual].transform.position, velocidade*Time.deltaTime);
[*] } else {
[*] if (Vector3.Distance (transform.position, locais [localAtual].transform.position) < 0.1f) {
[*] if (localAtual > 0) {
[*] localAtual--;
[*] } else {
[*] if (reiniciarSequencia == true) {
[*] localAtual = locais.Length -1;
[*] } else {
[*] inverter = false;
[*] }
[*] }
[*] }
[*] transform.position = Vector3.MoveTowards (transform.position, locais [localAtual].transform.position, velocidade*Time.deltaTime);
[*] }
[*] }
[*]}
[/list]
O próprio Marcos Schultz postou um Tutorial que faz um Sistema de Plataforma com rotas, porém eu não estou conseguindo controlar essa rota através do touch.
Como eu poderia controlar a ida a cada ponto com o touch? Tipo, ele fica parado no ponto A, para ir ao ponto B teria que tocar em cima do Objeto (Cubo), para ir ao C toca no Objeto (cubo) e assim ficar no loop em quantos pontos eu tiver na cena, sempre tocando no objeto para ele se mover para o próximo ponto.
Link do Tutorial - https://www.schultzgames.com/t3654-tutorial-unity-5-sistema-de-plataformas-com-rotas#61904
Código Utilizado:
[list=linenums]
[*]using System.Collections;
[*]using System.Collections.Generic;
[*]using UnityEngine;
[*]public class Plataforma : MonoBehaviour {
[*] public GameObject[] locais;
[*] public int destinoInicial = 0;
[*] public float velocidade = 10;
[*] public bool comecarInvertido;
[*] public bool reiniciarSequencia;
[*] int localAtual = 0;
[*] bool inverter = false;
[*] void Start () {
[*] if (destinoInicial < locais.Length) {
[*] localAtual = destinoInicial;
[*] } else {
[*] localAtual = 0;
[*] }
[*] //
[*] if (comecarInvertido == true) {
[*] inverter = true;
[*] }
[*] }
[*] void Update () {
[*] if (inverter == false) {
[*] if (Vector3.Distance (transform.position, locais [localAtual].transform.position) < 0.1f) {
[*] if (localAtual < locais.Length - 1) {
[*] localAtual++;
[*] } else {
[*] if (reiniciarSequencia == true) {
[*] localAtual = 0;
[*] } else {
[*] inverter = true;
[*] }
[*] }
[*] }
[*] transform.position = Vector3.MoveTowards (transform.position, locais [localAtual].transform.position, velocidade*Time.deltaTime);
[*] } else {
[*] if (Vector3.Distance (transform.position, locais [localAtual].transform.position) < 0.1f) {
[*] if (localAtual > 0) {
[*] localAtual--;
[*] } else {
[*] if (reiniciarSequencia == true) {
[*] localAtual = locais.Length -1;
[*] } else {
[*] inverter = false;
[*] }
[*] }
[*] }
[*] transform.position = Vector3.MoveTowards (transform.position, locais [localAtual].transform.position, velocidade*Time.deltaTime);
[*] }
[*] }
[*]}
[/list]
edvanmelo- Iniciante
- PONTOS : 2081
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de Plataforma com Rotas controlado por Touch
Ta, uma dúvida...
Você quer tocar no objeto, ai a plataforma se move até o objeto tocado. Depois disso o que deveria acontecer exatamente?
Você quer tocar no objeto, ai a plataforma se move até o objeto tocado. Depois disso o que deveria acontecer exatamente?
Re: Sistema de Plataforma com Rotas controlado por Touch
Que preciso é: ao iniciar ele fica parado(ele nao executa movimento, fica no ponto A parado), ao tocar na plataforma ele vai para o próximo ponto e fica parado no próximo ponto. E assim em adiante, ele só irá movimentar se tocar na plataforma, aí ele vai pro próximo ponto nesse loop.
edvanmelo- Iniciante
- PONTOS : 2081
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de Plataforma com Rotas controlado por Touch
Tente isto:
Crie um novo código em C# com o nome ControlarPlataforma
Neste novo script, utilize o código abaixo:
Jogue o código na câmera da sua cena.
Agora, basta associar a plataforma ao código. Toda vez que você clicar com o mouse em algum objeto, a plataforma vai se mover até a posição deste objeto.
Crie um novo código em C# com o nome ControlarPlataforma
Neste novo script, utilize o código abaixo:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ControlarPlataforma : MonoBehaviour {
Camera mainCamera;
Vector3 position;
public GameObject plataforma;
public float speed = 2;
void Start(){
mainCamera = Camera.main;
position = plataforma.transform.position;
}
void Update(){
if (mainCamera && plataforma) {
if (Input.GetMouseButtonDown (0)) {
RaycastHit hit;
if (Physics.Raycast (mainCamera.ScreenPointToRay (Input.mousePosition), out hit)) {
position = hit.transform.position;
}
}
plataforma.transform.position = Vector3.MoveTowards (plataforma.transform.position, position, Time.deltaTime * speed);
}
}
}
Jogue o código na câmera da sua cena.
Agora, basta associar a plataforma ao código. Toda vez que você clicar com o mouse em algum objeto, a plataforma vai se mover até a posição deste objeto.
Re: Sistema de Plataforma com Rotas controlado por Touch
Marcos obrigado pela atenção e ajuda, porém fiz e não deu certo, quando inicia ele continua se movendo na sequencia. Tirei uns prints aqui para vê se coloquei os scripts nos seus respectivos lugares.
(Caso os links não abram aqui, aperte botão direito e abra a imagem em outra aba)
(Caso os links não abram aqui, aperte botão direito e abra a imagem em outra aba)
edvanmelo- Iniciante
- PONTOS : 2081
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de Plataforma com Rotas controlado por Touch
Não use nenhum outro código, nada, apeeeenas esse que eu postei, do jeito que eu falei pra usar... Ele já faz o movimento
Re: Sistema de Plataforma com Rotas controlado por Touch
Esse script irá servi em outra coisa aqui já (rsrs). Realmente não expliquei legal o que quero, fiz uma imagem como é o fluxo do que quero, em base do seu sistema de rotas. Veja aqui:
edvanmelo- Iniciante
- PONTOS : 2081
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de Plataforma com Rotas controlado por Touch
Marcos conseguir fazer ele se movimentar entres os pontos desse jeito:
if (inverter == false)
{
if (Input.GetMouseButtonDown(0)) //acrescentei aqui o toque.
{
if (Vector3.Distance(transform.position, locais[localAtual].transform.position) < 0.1f)
{
if (localAtual < locais.Length - 1)
{
localAtual++;
}
else
{
if (reiniciarSequencia == true)
{
localAtual = 0;
}
else
{
inverter = true;
}
}
}
}
transform.position = Vector3.MoveTowards(transform.position, locais[localAtual].transform.position, velocidade * Time.deltaTime);
}
Porém, ele vai em todos os pontos ao ser tocado, mas quando chega no último ele para e não volta pro ponto A, como faria pra ele ficar nesse loop? Como mostrei na imagem na outra mensagem.
if (inverter == false)
{
if (Input.GetMouseButtonDown(0)) //acrescentei aqui o toque.
{
if (Vector3.Distance(transform.position, locais[localAtual].transform.position) < 0.1f)
{
if (localAtual < locais.Length - 1)
{
localAtual++;
}
else
{
if (reiniciarSequencia == true)
{
localAtual = 0;
}
else
{
inverter = true;
}
}
}
}
transform.position = Vector3.MoveTowards(transform.position, locais[localAtual].transform.position, velocidade * Time.deltaTime);
}
Porém, ele vai em todos os pontos ao ser tocado, mas quando chega no último ele para e não volta pro ponto A, como faria pra ele ficar nesse loop? Como mostrei na imagem na outra mensagem.
edvanmelo- Iniciante
- PONTOS : 2081
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de Plataforma com Rotas controlado por Touch
Eu novamente rsrs, conseguir fazer o loop, tinha que colocar o input no "else" também. Estou com outra dificuldade, como posso limitar o toque num capsule collider, pois o toque está na tela toda, tipo em qualquer lugar que clico ele movimenta.
script agora:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestMove : MonoBehaviour
{
public GameObject[] locais;
public int destinoInicial = 0;
public float velocidade = 10;
public bool comecarInvertido;
public bool reiniciarSequencia;
int localAtual = 0;
bool inverter = false;
void Start()
{
if (destinoInicial < locais.Length)
{
localAtual = destinoInicial;
}
else
{
localAtual = 0;
}
//
if (comecarInvertido == true)
{
inverter = true;
}
}
void Update()
{
if (inverter == false)
{
if (Input.GetMouseButtonDown(0))
{
if (Vector3.Distance(transform.position, locais[localAtual].transform.position) < 0.1f)
{
if (localAtual < locais.Length - 1)
{
localAtual++;
}
else
{
if (reiniciarSequencia == true)
{
localAtual = 0;
}
else
{
inverter = true;
}
}
}
}
transform.position = Vector3.MoveTowards(transform.position, locais[localAtual].transform.position, velocidade * Time.deltaTime);
}
else
{
if (Input.GetMouseButtonDown(0))
{
if (Vector3.Distance(transform.position, locais[localAtual].transform.position) < 0.1f)
{
if (localAtual > 0)
{
localAtual--;
}
else
{
if (reiniciarSequencia == true)
{
localAtual = locais.Length - 1;
}
else
{
inverter = false;
}
}
}
}
transform.position = Vector3.MoveTowards(transform.position, locais[localAtual].transform.position, velocidade * Time.deltaTime);
}
}
}
script agora:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestMove : MonoBehaviour
{
public GameObject[] locais;
public int destinoInicial = 0;
public float velocidade = 10;
public bool comecarInvertido;
public bool reiniciarSequencia;
int localAtual = 0;
bool inverter = false;
void Start()
{
if (destinoInicial < locais.Length)
{
localAtual = destinoInicial;
}
else
{
localAtual = 0;
}
//
if (comecarInvertido == true)
{
inverter = true;
}
}
void Update()
{
if (inverter == false)
{
if (Input.GetMouseButtonDown(0))
{
if (Vector3.Distance(transform.position, locais[localAtual].transform.position) < 0.1f)
{
if (localAtual < locais.Length - 1)
{
localAtual++;
}
else
{
if (reiniciarSequencia == true)
{
localAtual = 0;
}
else
{
inverter = true;
}
}
}
}
transform.position = Vector3.MoveTowards(transform.position, locais[localAtual].transform.position, velocidade * Time.deltaTime);
}
else
{
if (Input.GetMouseButtonDown(0))
{
if (Vector3.Distance(transform.position, locais[localAtual].transform.position) < 0.1f)
{
if (localAtual > 0)
{
localAtual--;
}
else
{
if (reiniciarSequencia == true)
{
localAtual = locais.Length - 1;
}
else
{
inverter = false;
}
}
}
}
transform.position = Vector3.MoveTowards(transform.position, locais[localAtual].transform.position, velocidade * Time.deltaTime);
}
}
}
edvanmelo- Iniciante
- PONTOS : 2081
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de Plataforma com Rotas controlado por Touch
MarcosSchultz escreveu:Tente isto:
Crie um novo código em C# com o nome ControlarPlataforma
Neste novo script, utilize o código abaixo:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ControlarPlataforma : MonoBehaviour {
Camera mainCamera;
Vector3 position;
public GameObject plataforma;
public float speed = 2;
void Start(){
mainCamera = Camera.main;
position = plataforma.transform.position;
}
void Update(){
if (mainCamera && plataforma) {
if (Input.GetMouseButtonDown (0)) {
RaycastHit hit;
if (Physics.Raycast (mainCamera.ScreenPointToRay (Input.mousePosition), out hit)) {
position = hit.transform.position;
}
}
plataforma.transform.position = Vector3.MoveTowards (plataforma.transform.position, position, Time.deltaTime * speed);
}
}
}
Jogue o código na câmera da sua cena.
Agora, basta associar a plataforma ao código. Toda vez que você clicar com o mouse em algum objeto, a plataforma vai se mover até a posição deste objeto.
Usa isso... Ele só vai mover para algum ponto se o raycast detectar um objeto... Além disso, você pode pedir se o hit.transform.tag é igual a alguma tag pré definida, para executar o movimento.
Re: Sistema de Plataforma com Rotas controlado por Touch
Valeu Marcos, tirou muitas dúvidas aqui. Mas como o lema do fórum é "fazendo que se aprende", estou tentando me virar também.
edvanmelo- Iniciante
- PONTOS : 2081
REPUTAÇÃO : 0
Respeito as regras :
Tópicos semelhantes
» DUVIDA SOBRE FAZER ROTAS COM POINTS!?
» Como criar sistema de Habilidades (Skills) para o personagem 2D / e sistema de batalha 2D
» Como faço para Criar um sistema de touch em primeira pessoa na Unity2019?
» Simulador controlado a partir de. Um app
» ROTAS
» Como criar sistema de Habilidades (Skills) para o personagem 2D / e sistema de batalha 2D
» Como faço para Criar um sistema de touch em primeira pessoa na Unity2019?
» Simulador controlado a partir de. Um app
» ROTAS
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos