[Script] Abrir porta de correr... Erro ao abri.
5 participantes
Página 1 de 1
[Script] Abrir porta de correr... Erro ao abri.
Primeira mente, é meu primeiro Script, eu me baseei (Porta Automática, para mover a porta lateralmente e na Interruptor para saber como eu faria para checar a posição do player em relação a porta e abrir ela).
Meu problema é que a porta não abre corretamente, para abri ela eu uso o eixo Y, mas quando executo a ação ela move a porta para cima e não para o lado, o mesmo vale se local o pivo como global e mexer no eixo Z, vai fazer a mesma coisa. Ela só funciona se eu mexer no eixo X, mas não nele que preciso mexer.
Alguém ai sabe onde errei, não endento (praticamente nada) de programação, eu fiz me baseando nos dois scripts acima e no sistema de porta completo também (tive alguns duvidas e vendo como o script da porta estava achei onde tinha errado).
Se alguém souber onde errei e puder falar agradeço, ou souber de uma maneira mais facil de fazer ia ajudar, desde já agradeço pela atenção.
Meu problema é que a porta não abre corretamente, para abri ela eu uso o eixo Y, mas quando executo a ação ela move a porta para cima e não para o lado, o mesmo vale se local o pivo como global e mexer no eixo Z, vai fazer a mesma coisa. Ela só funciona se eu mexer no eixo X, mas não nele que preciso mexer.
Alguém ai sabe onde errei, não endento (praticamente nada) de programação, eu fiz me baseando nos dois scripts acima e no sistema de porta completo também (tive alguns duvidas e vendo como o script da porta estava achei onde tinha errado).
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Porta2 : MonoBehaviour
{
public Transform jogador;
public GameObject porta1, posAberto1;
[Space(15)]
public KeyCode abrir = KeyCode.E;
public float distanciaMinima = 2;
public float velocidade = 2;
public float distancia;
public bool aberto = false;
Vector3 posicInicP1;
void Start()
{
posicInicP1 = porta1.transform.localPosition;
}
void Update()
{
if (jogador)
{
distancia = Vector3.Distance(transform.position, jogador.transform.position);
if (distancia < distanciaMinima)
{
if (Input.GetKeyDown(abrir))
{
if (aberto == false)
{
porta1.transform.localPosition = Vector3.Lerp(porta1.transform.localPosition, posAberto1.transform.localPosition, velocidade * Time.deltaTime);
aberto = true;
}
else
{
porta1.transform.localPosition = Vector3.Lerp(porta1.transform.localPosition, posicInicP1, velocidade * Time.deltaTime);
aberto = false;
}
}
}
}
}
}
Se alguém souber onde errei e puder falar agradeço, ou souber de uma maneira mais facil de fazer ia ajudar, desde já agradeço pela atenção.
NoctisDregon- Iniciante
- PONTOS : 1898
REPUTAÇÃO : 3
Respeito as regras :
Re: [Script] Abrir porta de correr... Erro ao abri.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class porta : MonoBehaviour
{
public Transform jogador;
public GameObject porta1;
[Space(15)]
public KeyCode abrir = KeyCode.E;
public float distanciaMinima = 2;
public float velocidade = 2;
public float distancia;
[Space(30)]
public float eixoX = 3;
public float eixoZ;
public bool aberto = false;
Vector3 posicInicP1;
public Vector3 portaV;
private Vector3 portaPInt;
void Start()
{
portaPInt = gameObject.transform.position;
portaV = gameObject.transform.position;
posicInicP1 = porta1.transform.localPosition;
}
void Update()
{
porta1.transform.localPosition = Vector3.Lerp(porta1.transform.localPosition, portaV, velocidade * Time.deltaTime);
if (jogador)
{
distancia = Vector3.Distance(transform.position, jogador.transform.position);
if (distancia < distanciaMinima)
{
if (Input.GetKeyDown(abrir))
{
if (aberto == false)
{
portaV.x += eixoX;
portaV.z += eixoZ;
aberto = true;
}
else
{
portaV.x = portaPInt.x;
portaV.z = portaPInt.z;
aberto = false;
}
}
}
}
}
}
Tenta isso aí, você pode escolher quando ele se mexe nos eixos.
Charlesoff- MembroAvançado
- PONTOS : 1780
REPUTAÇÃO : 40
Áreas de atuação : Game dev
Respeito as regras :
Charlesoff- MembroAvançado
- PONTOS : 1780
REPUTAÇÃO : 40
Áreas de atuação : Game dev
Respeito as regras :
Re: [Script] Abrir porta de correr... Erro ao abri.
Está um tanto confuso, porém, vamos lá.
O eixo Y é encarregado pela altura (seja essa positiva ou negativa), no caso, usar o eixo Y é pedir para um objeto ir, ou para cima, ou para baixo, isso quando não estamos com um objeto rotacionado, se supomos que eu rotacionei meu objeto em 90° isso significa que meu objeto deverá, agora, ir, ou para esquerda, ou para a direita (Aviso: ainda assim, esse pensamento não funciona como que está escrito aqui, pois a a classe Transform da Unity pode (e o faz) separar ambos como fatores independentes (altura e rotação), assim se eu rotacionar meu objeto não significaria que usar o eixo Y faria o objeto ir para os lados).
Bom, alegando isso, se tu estas usando o eixo Y, o correto é seu objeto ir mesmo para cima (ou para baixo), exceto se está aplicando algo de forma anormal (ou está fazendo algum arranjo com as posições e rotações).
Por que tu não queres usar o eixo X?!
Eu desconheço qual tutorial usou, não sei se foi o do Marcos Schultz (TUTORIAL Unity 5 - Porta automática), porém perceba que no tutorial dele ele pôe posições específicas (para ter um abertura lateral da porta) em que o único valor alterado é o do eixo x na variável position do objeto.
Fui mais lento que o Charlesoff, porém, segue a resposta. Exemplo incrível, Charlesoff.
O eixo Y é encarregado pela altura (seja essa positiva ou negativa), no caso, usar o eixo Y é pedir para um objeto ir, ou para cima, ou para baixo, isso quando não estamos com um objeto rotacionado, se supomos que eu rotacionei meu objeto em 90° isso significa que meu objeto deverá, agora, ir, ou para esquerda, ou para a direita (Aviso: ainda assim, esse pensamento não funciona como que está escrito aqui, pois a a classe Transform da Unity pode (e o faz) separar ambos como fatores independentes (altura e rotação), assim se eu rotacionar meu objeto não significaria que usar o eixo Y faria o objeto ir para os lados).
Bom, alegando isso, se tu estas usando o eixo Y, o correto é seu objeto ir mesmo para cima (ou para baixo), exceto se está aplicando algo de forma anormal (ou está fazendo algum arranjo com as posições e rotações).
Por que tu não queres usar o eixo X?!
Eu desconheço qual tutorial usou, não sei se foi o do Marcos Schultz (TUTORIAL Unity 5 - Porta automática), porém perceba que no tutorial dele ele pôe posições específicas (para ter um abertura lateral da porta) em que o único valor alterado é o do eixo x na variável position do objeto.
Fui mais lento que o Charlesoff, porém, segue a resposta. Exemplo incrível, Charlesoff.
classicandsimple- ProgramadorMaster
- PONTOS : 1266
REPUTAÇÃO : 26
Áreas de atuação : Desenvolvimento de software (iniciante com linguagem C).
Respeito as regras :
Re: [Script] Abrir porta de correr... Erro ao abri.
classicandsimple escreveu:Está um tanto confuso, porém, vamos lá.
O eixo Y é encarregado pela altura (seja essa positiva ou negativa), no caso, usar o eixo Y é pedir para um objeto ir, ou para cima, ou para baixo, isso quando não estamos com um objeto rotacionado, se supomos que eu rotacionei meu objeto em 90° isso significa que meu objeto deverá, agora, ir, ou para esquerda, ou para a direita (Aviso: ainda assim, esse pensamento não funciona como que está escrito aqui, pois a a classe Transform da Unity pode (e o faz) separar ambos como fatores independentes (altura e rotação), assim se eu rotacionar meu objeto não significaria que usar o eixo Y faria o objeto ir para os lados).
Bom, alegando isso, se tu estas usando o eixo Y, o correto é seu objeto ir mesmo para cima (ou para baixo), exceto se está aplicando algo de forma anormal (ou está fazendo algum arranjo com as posições e rotações).
Por que tu não queres usar o eixo X?!
Eu desconheço qual tutorial usou, não sei se foi o do Marcos Schultz (TUTORIAL Unity 5 - Porta automática), porém perceba que no tutorial dele ele pôe posições específicas (para ter um abertura lateral da porta) em que o único valor alterado é o do eixo x na variável position do objeto.
Fui mais lento que o Charlesoff, porém, segue a resposta. Exemplo incrível, Charlesoff.
Excelente explicação @classicandsimple
Aliás, @NoctisDregon, você consegue fazer uma boa limpeza nesse script. Eu só fiz por cima do seu
Charlesoff- MembroAvançado
- PONTOS : 1780
REPUTAÇÃO : 40
Áreas de atuação : Game dev
Respeito as regras :
Re: [Script] Abrir porta de correr... Erro ao abri.
Obrigado
o script deu certo, mas achei melhor mudar ele, em fez de fechar a posição do player, pro meu projeto ficou melhor usar um trigger para isso. Ele ficou assim agora:
Não só isso, mas tá fácil de mexer se for preciso mais para frente (algo que talvez ache que seria melhor se player sair do trigger a porta fechar, mas por enquanto não fazer eu mesmo ter que fechar ela é melhor.
Eu to rindo aqui, porque to usando a Unity depois de alguns anos usando a UE, então fazer esse tipo coisa nela pra mim é bem dificil, já que UE era bem mais facil (tanto na UE3 e UE4).
Obrigado pela ajuda pessoal, se chegar a mudar o script para fechar quando saio do trigger eu atualizo. Sinta-se livre para usar se achar util.
o script deu certo, mas achei melhor mudar ele, em fez de fechar a posição do player, pro meu projeto ficou melhor usar um trigger para isso. Ele ficou assim agora:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PortaCorrer : MonoBehaviour
{
public GameObject porta1;
[Space(15)]
public KeyCode botao = KeyCode.E;
public float velocidade = 2;
[Space(30)]
public float eixoX = 3;
public float eixoZ;
public bool fechar = false;
private bool abrir = true;
Vector3 posicInicP1;
public Vector3 portaV;
private Vector3 portaPInt;
void Start()
{
portaPInt = gameObject.transform.position;
portaV = gameObject.transform.position;
posicInicP1 = porta1.transform.localPosition;
}
void Update()
{
porta1.transform.localPosition = Vector3.Lerp(porta1.transform.localPosition, portaV, velocidade * Time.deltaTime);
if (Input.GetKeyDown(botao))
{
if (abrir == true)
{
if (fechar == false)
{
portaV.x += eixoX;
portaV.z += eixoZ;
fechar = true;
}
else
{
portaV.x = portaPInt.x;
portaV.x = portaPInt.x;
portaV.z = portaPInt.z;
fechar = false;
}
}
}
}
void OnTriggerEnter()
{
abrir = true;
}
void OnTriggerExit()
{
abrir = false;
}
}
Não só isso, mas tá fácil de mexer se for preciso mais para frente (algo que talvez ache que seria melhor se player sair do trigger a porta fechar, mas por enquanto não fazer eu mesmo ter que fechar ela é melhor.
Eu to rindo aqui, porque to usando a Unity depois de alguns anos usando a UE, então fazer esse tipo coisa nela pra mim é bem dificil, já que UE era bem mais facil (tanto na UE3 e UE4).
Obrigado pela ajuda pessoal, se chegar a mudar o script para fechar quando saio do trigger eu atualizo. Sinta-se livre para usar se achar util.
NoctisDregon- Iniciante
- PONTOS : 1898
REPUTAÇÃO : 3
Respeito as regras :
Re: [Script] Abrir porta de correr... Erro ao abri.
Boa noite!
Inclui o eixoY no codigo, assim podendo usar com porta de loja!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PortaDeCorrer : MonoBehaviour
{
public Transform jogador;
public GameObject porta1;
[Space(15)]
public KeyCode abrir = KeyCode.F;
public float distanciaMinima = 2;
public float velocidade = 2;
public float distancia;
[Space(30)]
public float eixoX = 3;
public float eixoZ;
public float eixoY;
public bool aberto = false;
Vector3 posicInicP1;
public Vector3 portaV;
private Vector3 portaPInt;
void Start()
{
portaPInt = gameObject.transform.position;
portaV = gameObject.transform.position;
posicInicP1 = porta1.transform.localPosition;
}
void Update()
{
porta1.transform.localPosition = Vector3.Lerp(porta1.transform.localPosition, portaV, velocidade * Time.deltaTime);
if (jogador)
{
distancia = Vector3.Distance(transform.position, jogador.transform.position);
if (distancia < distanciaMinima)
{
if (Input.GetKeyDown(abrir))
{
if (aberto == false)
{
portaV.x += eixoX;
portaV.z += eixoZ;
portaV.y += eixoY;
aberto = true;
}
else
{
portaV.x = portaPInt.x;
portaV.z = portaPInt.z;
portaV.y = portaPInt.y;
aberto = false;
}
}
}
}
}
}
Inclui o eixoY no codigo, assim podendo usar com porta de loja!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PortaDeCorrer : MonoBehaviour
{
public Transform jogador;
public GameObject porta1;
[Space(15)]
public KeyCode abrir = KeyCode.F;
public float distanciaMinima = 2;
public float velocidade = 2;
public float distancia;
[Space(30)]
public float eixoX = 3;
public float eixoZ;
public float eixoY;
public bool aberto = false;
Vector3 posicInicP1;
public Vector3 portaV;
private Vector3 portaPInt;
void Start()
{
portaPInt = gameObject.transform.position;
portaV = gameObject.transform.position;
posicInicP1 = porta1.transform.localPosition;
}
void Update()
{
porta1.transform.localPosition = Vector3.Lerp(porta1.transform.localPosition, portaV, velocidade * Time.deltaTime);
if (jogador)
{
distancia = Vector3.Distance(transform.position, jogador.transform.position);
if (distancia < distanciaMinima)
{
if (Input.GetKeyDown(abrir))
{
if (aberto == false)
{
portaV.x += eixoX;
portaV.z += eixoZ;
portaV.y += eixoY;
aberto = true;
}
else
{
portaV.x = portaPInt.x;
portaV.z = portaPInt.z;
portaV.y = portaPInt.y;
aberto = false;
}
}
}
}
}
}
BubuDev- Iniciante
- PONTOS : 1306
REPUTAÇÃO : 1
Respeito as regras :
Re: [Script] Abrir porta de correr... Erro ao abri.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PortaDeCorrer : MonoBehaviour
{
public Transform jogador;
public GameObject porta1;
[Space(15)]
public KeyCode abrir = KeyCode.F;
public float distanciaMinima = 2;
public float velocidade = 2;
public float distancia;
[Space(30)]
public float eixoX = 3;
public float eixoZ;
public float eixoY;
public bool aberto = false;
Vector3 posicInicP1;
public Vector3 portaV;
private Vector3 portaPInt;
void Start()
{
portaPInt = gameObject.transform.position;
portaV = gameObject.transform.position;
posicInicP1 = porta1.transform.localPosition;
}
void Update()
{
porta1.transform.localPosition = Vector3.Lerp(porta1.transform.localPosition, portaV, velocidade * Time.deltaTime);
if (jogador)
{
distancia = Vector3.Distance(transform.position, jogador.transform.position);
if (distancia < distanciaMinima)
{
if (Input.GetKeyDown(abrir))
{
if (aberto == false)
{
portaV.x += eixoX;
portaV.z += eixoZ;
portaV.y += eixoY;
aberto = true;
}
else
{
portaV.x = portaPInt.x;
portaV.z = portaPInt.z;
portaV.y = portaPInt.y;
aberto = false;
}
}
}
}
}
}
formatado:
BubuDev- Iniciante
- PONTOS : 1306
REPUTAÇÃO : 1
Respeito as regras :
Re: [Script] Abrir porta de correr... Erro ao abri.
sem maldado mais uma dica de ouro, constrói um protótipo para melhor testar o sistema uma porta no vazio complica para ver o que está dando errado.
WLO GAMES- Iniciante
- PONTOS : 1172
REPUTAÇÃO : 0
Respeito as regras :
Re: [Script] Abrir porta de correr... Erro ao abri.
coloca por animação melhora e muito a sua vida
WLO GAMES- Iniciante
- PONTOS : 1172
REPUTAÇÃO : 0
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] AJUDA COM SCRIPT COLETAR 8 PEÇAS PARA ABRIR PORTA
» Erro de script de porta
» Porta com Códicos para abri-la
» Porta de correr
» Abrir e Fechar Porta
» Erro de script de porta
» Porta com Códicos para abri-la
» Porta de correr
» Abrir e Fechar Porta
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos