[RESOLVIDO] Problema em um script
5 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Problema em um script
Pessoal, me tirem uma dúvida, por favor.
Eu tenho um script que faz com que o objeto se mova para frente, aumentando sua velocidade enquanto o botão estiver pressionado, ao contrário a velocidade vai diminuindo até chegar em ponto zero. Eu fiz um novo script usando esse mesmo, mas colocando alguns números negativos, para fazer sentindo contrário, no caso, ir para trás. Ele funciona. O problema é que ele não diminui a velocidade ao parar de apertar o botão. Ele vai aumentando o valor negativo e fica no valor que parou. Não volta para zero. poderiam me ajudar? Eu não entendo quase nada da linguagem, por isso a dificuldade, pq eu sei que isso é bem simples de resolver, mas já quebrei a cabeça demais e não consigo.
Aqui o código original:
//#pragma strict
// valeurs modifiables dans l'inspector
var myVector : Vector3;
// ici la variable myVector est égale à 0.0 sur les 3 axes
function Start () {
}
function Update () {
myVector.z = Mathf.Clamp(myVector.z, 0.0,10.0);// O valor y só pode estar entre 0 e 10
if(Input.GetKey ("left")){ //Contanto que a tecla "left" seja pressionada
myVector.z += 0.005; // então o valor z aumenta em 0.05 para cada frame (atualização de função)
}
else if(myVector.z > 0.0){
myVector.z -= 0.01; // caso contrário, o valor z diminui em 0.05 para cada frame (atualização de função)
}
//O objeto que contém este script será ativado em todos os eixos com valores diferentes de 0 na variável myVector
gameObject.transform.Rotate(myVector);
}
O código problemático:
#pragma strict
// valores editáveis no inspetor
var myVector : Vector3;
// aqui a variável myVector é igual a 0.0 nos 3 eixos
function Start () {
}
function Update () {
myVector.z = Mathf.Clamp(myVector.z, -10.0,0.0);// O valor y só pode estar entre 0 e 10
if(Input.GetKey ("right")){ //Contanto que a tecla "right" seja pressionada
myVector.z -= 0.005; // então o valor z diminui em 0.05 para cada frame (atualização de função)
}
else if(myVector.z > 0.0){
myVector.z += 0.01; // caso contrário, o valor z diminui em 0.05 para cada frame (atualização de função)
}
//O objeto que contém este script será ativado em todos os eixos com valores diferentes de 0 na variável myVector
gameObject.transform.Rotate(myVector);
}
Eu tenho um script que faz com que o objeto se mova para frente, aumentando sua velocidade enquanto o botão estiver pressionado, ao contrário a velocidade vai diminuindo até chegar em ponto zero. Eu fiz um novo script usando esse mesmo, mas colocando alguns números negativos, para fazer sentindo contrário, no caso, ir para trás. Ele funciona. O problema é que ele não diminui a velocidade ao parar de apertar o botão. Ele vai aumentando o valor negativo e fica no valor que parou. Não volta para zero. poderiam me ajudar? Eu não entendo quase nada da linguagem, por isso a dificuldade, pq eu sei que isso é bem simples de resolver, mas já quebrei a cabeça demais e não consigo.
Aqui o código original:
//#pragma strict
// valeurs modifiables dans l'inspector
var myVector : Vector3;
// ici la variable myVector est égale à 0.0 sur les 3 axes
function Start () {
}
function Update () {
myVector.z = Mathf.Clamp(myVector.z, 0.0,10.0);// O valor y só pode estar entre 0 e 10
if(Input.GetKey ("left")){ //Contanto que a tecla "left" seja pressionada
myVector.z += 0.005; // então o valor z aumenta em 0.05 para cada frame (atualização de função)
}
else if(myVector.z > 0.0){
myVector.z -= 0.01; // caso contrário, o valor z diminui em 0.05 para cada frame (atualização de função)
}
//O objeto que contém este script será ativado em todos os eixos com valores diferentes de 0 na variável myVector
gameObject.transform.Rotate(myVector);
}
O código problemático:
#pragma strict
// valores editáveis no inspetor
var myVector : Vector3;
// aqui a variável myVector é igual a 0.0 nos 3 eixos
function Start () {
}
function Update () {
myVector.z = Mathf.Clamp(myVector.z, -10.0,0.0);// O valor y só pode estar entre 0 e 10
if(Input.GetKey ("right")){ //Contanto que a tecla "right" seja pressionada
myVector.z -= 0.005; // então o valor z diminui em 0.05 para cada frame (atualização de função)
}
else if(myVector.z > 0.0){
myVector.z += 0.01; // caso contrário, o valor z diminui em 0.05 para cada frame (atualização de função)
}
//O objeto que contém este script será ativado em todos os eixos com valores diferentes de 0 na variável myVector
gameObject.transform.Rotate(myVector);
}
Última edição por MarcosSchultz em Qua Jun 27, 2018 1:19 am, editado 2 vez(es) (Motivo da edição : Resolvido)
pdsimulador- Avançado
- PONTOS : 3103
REPUTAÇÃO : 27
Áreas de atuação : Modelagem 3D
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
- Código:
//Coloque seus codigos aqui
Java script jah eh praticamente obsoleto na unity recomendo migrar para c#
Tente trocar o codigo problemático por esse:
- Código:
#pragma strict
// valores editáveis no inspetor
var myVector : Vector3;
// aqui a variável myVector é igual a 0.0 nos 3 eixos
function Start () {
}
function Update () {
myVector.z = Mathf.Clamp(myVector.z, -10.0,0.0);// O valor y só pode estar entre 0 e 10
if(Input.GetKey ("right")){ //Contanto que a tecla "right" seja pressionada
myVector.z -= 0.005; // então o valor z diminui em 0.05 para cada frame (atualização de função)
}
else if(myVector.z < 0.0){
myVector.z += 0.01; // caso contrário, o valor z diminui em 0.05 para cada frame (atualização de função)
}
//O objeto que contém este script será ativado em todos os eixos com valores diferentes de 0 na variável myVector
gameObject.transform.Rotate(myVector);
}
Phph09- Profissional
- PONTOS : 3789
REPUTAÇÃO : 240
Idade : 19
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
Phph09 escreveu:
- Código:
//Coloque seus codigos aqui
Java script jah eh praticamente obsoleto na unity recomendo migrar para c#
Tente trocar o codigo problemático por esse:
- Código:
#pragma strict
// valores editáveis no inspetor
var myVector : Vector3;
// aqui a variável myVector é igual a 0.0 nos 3 eixos
function Start () {
}
function Update () {
myVector.z = Mathf.Clamp(myVector.z, -10.0,0.0);// O valor y só pode estar entre 0 e 10
if(Input.GetKey ("right")){ //Contanto que a tecla "right" seja pressionada
myVector.z -= 0.005; // então o valor z diminui em 0.05 para cada frame (atualização de função)
}
else if(myVector.z < 0.0){
myVector.z += 0.01; // caso contrário, o valor z diminui em 0.05 para cada frame (atualização de função)
}
//O objeto que contém este script será ativado em todos os eixos com valores diferentes de 0 na variável myVector
gameObject.transform.Rotate(myVector);
}
Pow mano, funcionou! Muito obrigado!
Onde estava o problema?
Eu tô começando a estudar agora e estou estudando C#, estou usando esse código Js pq foi feito num simulador mais antigo
pdsimulador- Avançado
- PONTOS : 3103
REPUTAÇÃO : 27
Áreas de atuação : Modelagem 3D
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
O erro era só no sinal na linha 16
vc tinha colocao if... > 0.0 sendo que o valor vai ser negativo então nunca vai ser maior que 0, foi só trocar o sinal para <
vc tinha colocao if... > 0.0 sendo que o valor vai ser negativo então nunca vai ser maior que 0, foi só trocar o sinal para <
Phph09- Profissional
- PONTOS : 3789
REPUTAÇÃO : 240
Idade : 19
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
Phph09 escreveu:O erro era só no sinal na linha 16
vc tinha colocao if... > 0.0 sendo que o valor vai ser negativo então nunca vai ser maior que 0, foi só trocar o sinal para <
e eu já tinha feito isso. Acho que esqueci de salvar, que merda kk. Mas muito obrigado!
Deixa eu tirar outra dúvida contigo, sobre o unity:
Eu estou programando um simulador de parque de diversões, no caso o space loop. Ele usa a força da gravidade para fazer a gaiola girar. Eu criei um Hinge Joint na gaiola e conectei no braço, então ele funciona normal, Só que, para funcionar normal, eu tenho que colocar a mass em 0 no rigidbody dela,logo a gaiola não gira muito. Quando eu coloco qualquer número em mass, a gaiola funciona do jeito que eu quero, mas em compensação, é como se isso tirasse a gravidade do braço, ele fica bem lento e eu não sei mais o que fazer. esse é a config dos braços que movimentam a gaiola:
essa aqui da gaiola:
O que pode estar causando esse conflito?
pdsimulador- Avançado
- PONTOS : 3103
REPUTAÇÃO : 27
Áreas de atuação : Modelagem 3D
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
o valor da massa na imagem da gaiola está com um valor errado, pela imagem pelo menos.JonathanDiego escreveu:Phph09 escreveu:O erro era só no sinal na linha 16
vc tinha colocao if... > 0.0 sendo que o valor vai ser negativo então nunca vai ser maior que 0, foi só trocar o sinal para <
e eu já tinha feito isso. Acho que esqueci de salvar, que merda kk. Mas muito obrigado!
Deixa eu tirar outra dúvida contigo, sobre o unity:
Eu estou programando um simulador de parque de diversões, no caso o space loop. Ele usa a força da gravidade para fazer a gaiola girar. Eu criei um Hinge Joint na gaiola e conectei no braço, então ele funciona normal, Só que, para funcionar normal, eu tenho que colocar a mass em 0 no rigidbody dela,logo a gaiola não gira muito. Quando eu coloco qualquer número em mass, a gaiola funciona do jeito que eu quero, mas em compensação, é como se isso tirasse a gravidade do braço, ele fica bem lento e eu não sei mais o que fazer. esse é a config dos braços que movimentam a gaiola:
essa aqui da gaiola:
O que pode estar causando esse conflito?
Re: [RESOLVIDO] Problema em um script
Então, esse valor aparece quando eu coloco zero. Se eu colocar qualquer valor acima disso, mesmo sendo 0.1 acontece o problema que eu citei, eu já mexi em todos os números possíveis e não cheguei em lugar algum, já tem 3 dias que quebro a cabeça com isso :/
o valor da massa na imagem da gaiola está com um valor errado, pela imagem pelo menos.
pdsimulador- Avançado
- PONTOS : 3103
REPUTAÇÃO : 27
Áreas de atuação : Modelagem 3D
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
Aqui um vídeo para mostrar o problema. Começo o vídeo com massa zero, logo depois coloco massa 1 e no fim volto para zero
pdsimulador- Avançado
- PONTOS : 3103
REPUTAÇÃO : 27
Áreas de atuação : Modelagem 3D
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
Ja tentou colocar o angular Drag em 999?
Phph09- Profissional
- PONTOS : 3789
REPUTAÇÃO : 240
Idade : 19
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
Phph09 escreveu:Ja tentou colocar o angular Drag em 999?
Acabei de testar isso aqui e o problema continua. alterei o valor na gaiola e nos braços e nenhum deu jeito :/. O foda é que eu tô praticamente todo meu tempo livre nos últimos dias só tentando resolver isso e não consigo. Acho que já tentei de tudo que eu sei fazer
pdsimulador- Avançado
- PONTOS : 3103
REPUTAÇÃO : 27
Áreas de atuação : Modelagem 3D
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
Sua segunda dúvida deveria estar em um tópico à parte, mas enfim... Vamos lá.
Na humilde opinião de quem teve que assistir um vídeo no youtube pra entender como um SpaceLoop se comporta, acho você deveria se aproveitar quase que inteiramente da física para simular o que quer.
Eu modelei uma cena similar utilizando escala real, creio que a estrutura ficou com uns 6 a 8 metros de altura, além disso, apliquei massas próximas das reais em cada objeto.
gaiola: 1300 kg
Braço: 500 kg
Contrapeso: 800 kg
Usei hinge joint para as ligações, e para que o conjunto não ficasse infinitamente girando, adicionei 0.1F de drag na gaiola. Assim, ela faz o conjunto parar de oscilar, caso não haja a aplicação de torque no braço.
Para a movimentação do conjunto, utilizei apenas a gravidade, o resultado pode ser visto abaixo, o movimento de pêndulo é mais lento que o seu, mas é o que se espera de um objeto deste tamanho, inclua uma força externa de aceleração e você alcança um resultado bem similar ao real;
Caso queira aumentar a velocidade do braço, basta aplicar torque a ele. O giro da gaiola é proporcional a distância entre o eixo e o centro de massa, quanto mais longe, mais ela tente a fica na horizontal, quanto mais próximo, mais ela gira.
Pra tua simulação, eu recomendo que tenha esse mesmo cuidado com tamanho, massa, e pivôs.
Segue o projeto caso queira testar aí:
Executável
Projeto
Logo no início da simulação a gaiola gira bastante, mas não saiu no vídeo, baixe o executável para ter uma ideia melhor do comportamento dela.
Na humilde opinião de quem teve que assistir um vídeo no youtube pra entender como um SpaceLoop se comporta, acho você deveria se aproveitar quase que inteiramente da física para simular o que quer.
Eu modelei uma cena similar utilizando escala real, creio que a estrutura ficou com uns 6 a 8 metros de altura, além disso, apliquei massas próximas das reais em cada objeto.
gaiola: 1300 kg
Braço: 500 kg
Contrapeso: 800 kg
Usei hinge joint para as ligações, e para que o conjunto não ficasse infinitamente girando, adicionei 0.1F de drag na gaiola. Assim, ela faz o conjunto parar de oscilar, caso não haja a aplicação de torque no braço.
Para a movimentação do conjunto, utilizei apenas a gravidade, o resultado pode ser visto abaixo, o movimento de pêndulo é mais lento que o seu, mas é o que se espera de um objeto deste tamanho, inclua uma força externa de aceleração e você alcança um resultado bem similar ao real;
Caso queira aumentar a velocidade do braço, basta aplicar torque a ele. O giro da gaiola é proporcional a distância entre o eixo e o centro de massa, quanto mais longe, mais ela tente a fica na horizontal, quanto mais próximo, mais ela gira.
Pra tua simulação, eu recomendo que tenha esse mesmo cuidado com tamanho, massa, e pivôs.
Segue o projeto caso queira testar aí:
Executável
Projeto
Logo no início da simulação a gaiola gira bastante, mas não saiu no vídeo, baixe o executável para ter uma ideia melhor do comportamento dela.
Isabela- Avançado
- PONTOS : 2835
REPUTAÇÃO : 260
Idade : 24
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
cara esse seu script esta tudo errado, nunca se move um personagem usando o transform e sim o Rigidbody. passe para o C# e esqueça o Java.
use este script, fiz duas opção mover por aceleração e por velocidade, dai vc decide qual é melhor para o seu caso.
use este script, fiz duas opção mover por aceleração e por velocidade, dai vc decide qual é melhor para o seu caso.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]// adiciona automaticamente o Rigidbody
public class Movimento : MonoBehaviour {
public float Velocidade = 100;// a velocidade
public bool
Opcao1, // vai acelerar se pressionar e desacelerar se não
Opcao2;// vai andar na velocidade e quando não pressionar vai parar
void Start () {
}
void Update () {
Rigidbody Rig = GetComponent<Rigidbody>();// pega o rigidbody
if (Opcao1)
{
if (Input.GetKey("w"))// se aperar a tecla W vai para frente
{
Rig.AddForce(transform.forward * Time.deltaTime * Velocidade);
}
if (Input.GetKey("s"))// se aperar a tecla S vai para traz
{
Rig.AddForce(transform.forward * Time.deltaTime * -Velocidade);
}
}
if (Opcao2)
{
if (Input.GetKey("w"))// se aperar a tecla W vai para frente
{
Rig.velocity = transform.forward* Time.deltaTime * Velocidade;
}
if (Input.GetKey("s"))// se aperar a tecla S vai para traz
{
Rig.velocity = transform.forward * Time.deltaTime * -Velocidade;
}
if (!Input.GetKey("w")&& !Input.GetKey("s"))// se não estiver precionando o w e nem o s ele para
{
Rig.velocity = transform.forward * Time.deltaTime * 0;
}
}
}
}
Re: [RESOLVIDO] Problema em um script
Isabela escreveu:Sua segunda dúvida deveria estar em um tópico à parte, mas enfim... Vamos lá.
Na humilde opinião de quem teve que assistir um vídeo no youtube pra entender como um SpaceLoop se comporta, acho você deveria se aproveitar quase que inteiramente da física para simular o que quer.
Eu modelei uma cena similar utilizando escala real, creio que a estrutura ficou com uns 6 a 8 metros de altura, além disso, apliquei massas próximas das reais em cada objeto.
gaiola: 1300 kg
Braço: 500 kg
Contrapeso: 800 kg
Usei hinge joint para as ligações, e para que o conjunto não ficasse infinitamente girando, adicionei 0.1F de drag na gaiola. Assim, ela faz o conjunto parar de oscilar, caso não haja a aplicação de torque no braço.
Para a movimentação do conjunto, utilizei apenas a gravidade, o resultado pode ser visto abaixo, o movimento de pêndulo é mais lento que o seu, mas é o que se espera de um objeto deste tamanho, inclua uma força externa de aceleração e você alcança um resultado bem similar ao real;
Caso queira aumentar a velocidade do braço, basta aplicar torque a ele. O giro da gaiola é proporcional a distância entre o eixo e o centro de massa, quanto mais longe, mais ela tente a fica na horizontal, quanto mais próximo, mais ela gira.
Pra tua simulação, eu recomendo que tenha esse mesmo cuidado com tamanho, massa, e pivôs.
Segue o projeto caso queira testar aí:
Executável
Projeto
Logo no início da simulação a gaiola gira bastante, mas não saiu no vídeo, baixe o executável para ter uma ideia melhor do comportamento dela.
Sua explicação foi a solução para o meu problema! meu modelo estava grande demais. Após a diminuição de tamanho e alguns ajustes, agora tudo está normal. Muito obrigado o/
pdsimulador- Avançado
- PONTOS : 3103
REPUTAÇÃO : 27
Áreas de atuação : Modelagem 3D
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
Dom3000 escreveu:cara esse seu script esta tudo errado, nunca se move um personagem usando o transform e sim o Rigidbody. passe para o C# e esqueça o Java.
use este script, fiz duas opção mover por aceleração e por velocidade, dai vc decide qual é melhor para o seu caso.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]// adiciona automaticamente o Rigidbody
public class Movimento : MonoBehaviour {
public float Velocidade = 100;// a velocidade
public bool
Opcao1, // vai acelerar se pressionar e desacelerar se não
Opcao2;// vai andar na velocidade e quando não pressionar vai parar
void Start () {
}
void Update () {
Rigidbody Rig = GetComponent<Rigidbody>();// pega o rigidbody
if (Opcao1)
{
if (Input.GetKey("w"))// se aperar a tecla W vai para frente
{
Rig.AddForce(transform.forward * Time.deltaTime * Velocidade);
}
if (Input.GetKey("s"))// se aperar a tecla S vai para traz
{
Rig.AddForce(transform.forward * Time.deltaTime * -Velocidade);
}
}
if (Opcao2)
{
if (Input.GetKey("w"))// se aperar a tecla W vai para frente
{
Rig.velocity = transform.forward* Time.deltaTime * Velocidade;
}
if (Input.GetKey("s"))// se aperar a tecla S vai para traz
{
Rig.velocity = transform.forward * Time.deltaTime * -Velocidade;
}
if (!Input.GetKey("w")&& !Input.GetKey("s"))// se não estiver precionando o w e nem o s ele para
{
Rig.velocity = transform.forward * Time.deltaTime * 0;
}
}
}
}
Obrigado pelo código amigo, mas meu problema já foi solucionado com a dica da Isabela e os scripts estão funcionando normalmente. Mas vou guardar esse que vc fez kk
pdsimulador- Avançado
- PONTOS : 3103
REPUTAÇÃO : 27
Áreas de atuação : Modelagem 3D
Respeito as regras :
Re: [RESOLVIDO] Problema em um script
cara o script acima de movimento vai passar as paredes e tudo o mais, pois ele não leva em consideração a física tipo collider, se vc usar em um personagem vai dar bugJonathanDiego escreveu:Dom3000 escreveu:cara esse seu script esta tudo errado, nunca se move um personagem usando o transform e sim o Rigidbody. passe para o C# e esqueça o Java.
use este script, fiz duas opção mover por aceleração e por velocidade, dai vc decide qual é melhor para o seu caso.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]// adiciona automaticamente o Rigidbody
public class Movimento : MonoBehaviour {
public float Velocidade = 100;// a velocidade
public bool
Opcao1, // vai acelerar se pressionar e desacelerar se não
Opcao2;// vai andar na velocidade e quando não pressionar vai parar
void Start () {
}
void Update () {
Rigidbody Rig = GetComponent<Rigidbody>();// pega o rigidbody
if (Opcao1)
{
if (Input.GetKey("w"))// se aperar a tecla W vai para frente
{
Rig.AddForce(transform.forward * Time.deltaTime * Velocidade);
}
if (Input.GetKey("s"))// se aperar a tecla S vai para traz
{
Rig.AddForce(transform.forward * Time.deltaTime * -Velocidade);
}
}
if (Opcao2)
{
if (Input.GetKey("w"))// se aperar a tecla W vai para frente
{
Rig.velocity = transform.forward* Time.deltaTime * Velocidade;
}
if (Input.GetKey("s"))// se aperar a tecla S vai para traz
{
Rig.velocity = transform.forward * Time.deltaTime * -Velocidade;
}
if (!Input.GetKey("w")&& !Input.GetKey("s"))// se não estiver precionando o w e nem o s ele para
{
Rig.velocity = transform.forward * Time.deltaTime * 0;
}
}
}
}
Obrigado pelo código amigo, mas meu problema já foi solucionado com a dica da Isabela e os scripts estão funcionando normalmente. Mas vou guardar esse que vc fez kk
Tópicos semelhantes
» [RESOLVIDO] Problema com um Script
» [RESOLVIDO] Problema com script
» [RESOLVIDO] Problema com script de random na scale de um objeto
» [RESOLVIDO] Problema com script básico
» [RESOLVIDO] Estou com um problema no script de animação
» [RESOLVIDO] Problema com script
» [RESOLVIDO] Problema com script de random na scale de um objeto
» [RESOLVIDO] Problema com script básico
» [RESOLVIDO] Estou com um problema no script de animação
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos