[RESOLVIDO] Movimento aleatório e suave de um objeto
+2
AndyShow
Marc7
6 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Movimento aleatório e suave de um objeto
Boa tarde pessoal,
estou querendo fazer um objeto se mover na tela de forma aleatória e suave.
o quero fazer é como o movimento do cavalo marinho no video abaixo
o cavalo marinho se move mais na vertical do que na horizontal se vocês repararem, mas eu queria um movimento em qualquer direção, bem aleatorio mesmo, e suave como no video, não um movimento com mudança de direção "quebrada".
como eu faço isso no script?
estou querendo fazer um objeto se mover na tela de forma aleatória e suave.
o quero fazer é como o movimento do cavalo marinho no video abaixo
o cavalo marinho se move mais na vertical do que na horizontal se vocês repararem, mas eu queria um movimento em qualquer direção, bem aleatorio mesmo, e suave como no video, não um movimento com mudança de direção "quebrada".
como eu faço isso no script?
Última edição por MarcosSchultz em Qua Fev 15, 2017 8:19 am, editado 2 vez(es) (Motivo da edição : Resolvido)
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
No transform.Posicion usa um Vector3 e um Mathf.Lerp(Posicao Atual,Nova posicao,time.deltaTime); que ele faz a transição dos Movimentos Suavemente! Só um Exemplo!
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
AndyShow valeu pela dica
bom eu tenho esse script aqui que faz o movimento aleatorio em x e y, mas de forma quebrada, mudança de direções quebradas:
o video é de um objeto movendo com esse script
eu queria que o movimento fosse suave, circular, e não quebrado.
tem como aproveitar esse script e mudar ou acrescentar o que for preciso para fazer esse efeito?
bom eu tenho esse script aqui que faz o movimento aleatorio em x e y, mas de forma quebrada, mudança de direções quebradas:
- Código:
using UnityEngine;
using System.Collections;
public class MoverAleatorio : MonoBehaviour {
public float speed = 1; //Velocidade que a nave se move
private float timer = 0f; //Duração até mudar de direção
private Vector3 direcao; //Direção que a nave segue
public float yMinimo; //Altura minima que a nave pode ir
public float yMaximo; //Altura máxima que a nave pode ir
public float xMinimo; //Altura minima que a nave pode ir
public float xMaximo; //Altura máxima que a nave pode ir
void Update() {
if (timer <= 0) {
timer = 2f; //Mantem nessa posição por 2 segundos
//Define a direção de forma aleatória
direcao.x = Random.Range(-1f, 1f); //Retorna um valor aletório entre -1 e 1
direcao.y = Random.Range(-1f, 1f); //Retorna um valor aletório entre -1 e 1
}
timer -= Time.deltaTime; //Faz a contagem regressiva
//Move a nave
transform.Translate(direcao * speed * Time.deltaTime); //Move a nave aleatória
//Ajusta a altura
var posicao = transform.position;
//Maxima e minima altura em Y.
posicao.y = Mathf.Clamp(posicao.y, yMinimo, yMaximo);
//Maxima e minima posicao em X.
posicao.x = Mathf.Clamp(posicao.x, xMinimo, xMaximo);
transform.position = posicao; //Define a posição com a altura ajustada
}
}
o video é de um objeto movendo com esse script
eu queria que o movimento fosse suave, circular, e não quebrado.
tem como aproveitar esse script e mudar ou acrescentar o que for preciso para fazer esse efeito?
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
o script que eu citei tentei modificar isso aqui:
porem não funcionou, não estou sabendo como ajustar isso.
alguem dá uma dica, aproveitando esse script? ou o script para fazer esse efeito deveria ser bem diferente?
- Código:
if (timer <= 0) {
timer = 2f; //Mantem nessa posição por 2 segundos
//Define a direção de forma aleatória
direcao.x = Mathf.Lerp(transform.position.x, Random.Range(-1f, 1f), Time.deltaTime); //Retorna um valor aletório entre -1 e 1
direcao.y = Mathf.Lerp(transform.position.y, Random.Range(-1f, 1f), Time.deltaTime); //Retorna um valor aletório entre -1 e 1
}
porem não funcionou, não estou sabendo como ajustar isso.
alguem dá uma dica, aproveitando esse script? ou o script para fazer esse efeito deveria ser bem diferente?
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
Bom...o Lerp trabalha com 3 Valores, Inicial e Final e o Tempo que Leva pra Fazer isso! Bem Como vc fez, mas eu nao sei se Funciona com Random.Range!
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
Tem várias formas, mas se o que procura é fazer um sistema parecido com o daquele cavalo marinho, eu faria o objeto flutuar em cena e adicionaria forças para direções aleatórias. Se precisar de ajuda com isso, avise aqui que eu lhe ajudo.
George Lucas Vieira- Avançado
- PONTOS : 3391
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
AndyShow eu tambem pensei isso, o lerp não vai funcionar porque ele tem dois valores somente, um inicial e outro final, enquanto que o movimento em questão terá valores infinitos enquanto o objeto existir.
George Lucas Vieira, agradeço sua ajuda, me explique por favor como fazer isso.
se não for pedir muito, me passe varios codigos para fazer esse efeito.
George Lucas Vieira, agradeço sua ajuda, me explique por favor como fazer isso.
se não for pedir muito, me passe varios codigos para fazer esse efeito.
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
Cara, você pode usar o Lerp sim, basta fazer um Random.Range em uma nova posição toda vez que Lerp chegar ao fim.
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
Marcos me Tira uma Duvida, se eu Der um Comando Inicial pro Lerp, que nao Seja no Update ele vai completar o Ciclo? ou precisa ser no Update?MarcosSchultz escreveu:Cara, você pode usar o Lerp sim, basta fazer um Random.Range em uma nova posição toda vez que Lerp chegar ao fim.
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
MarcosSchultz escreveu:Cara, você pode usar o Lerp sim, basta fazer um Random.Range em uma nova posição toda vez que Lerp chegar ao fim.
Ok MarcosSchultz, vou tentar isso, mas vou parando por aqui e de manhã eu volto com o resultado! valeu!
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
AndyShow eu tambem pensei isso, o lerp não vai funcionar porque ele tem dois valores somente, um inicial e outro final, enquanto que o movimento em questão terá valores infinitos enquanto o objeto existir.
Uma vez eu precisei de um lerp baseado em uma onda senoidal. Esse post Aqui
me abriu novos horizontes. Super recomendo!
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
Ok man, atendendo seu pedido, fiz esse projetinho aqui para você estudar ok? Não sei se é o efeito que procura, mas espero que ajude.
"http://www.mediafire.com/download/0rpuu5ccp814y00/Cavalo_Marinho.rar"
Explicações do script estão no próprio script.
"http://www.mediafire.com/download/0rpuu5ccp814y00/Cavalo_Marinho.rar"
Explicações do script estão no próprio script.
George Lucas Vieira- Avançado
- PONTOS : 3391
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
VOU ROUBAR MSM HAHAHAHAHAGeorge Lucas Vieira escreveu:Ok man, atendendo seu pedido, fiz esse projetinho aqui para você estudar ok? Não sei se é o efeito que procura, mas espero que ajude.
"http://www.mediafire.com/download/0rpuu5ccp814y00/Cavalo_Marinho.rar"
Explicações do script estão no próprio script.
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
Ae GeorgeLucasVieira é isso mesmo que eu queria fazer , muito bom!
Percebi que é só alterar a Min força, Max força e Max distancia para ter amplitudes diferentes.
O que vc fez foi criar um objeto empty PontoPivo e dentro dele colocar o objeto que vai ter esse movimento não é?
artplayer, vou testar esse codigo depois para ver como funciona!
AndyShow e MarcosSchultz, ainda não consegui acahr uma forma de encaixar o Random.Range com o Vecotr3 e Lerp para fazer isso, agradeço se puderem me explicar como fazer, aí fica sendo mais uma possibilidade além da que o George fez
Percebi que é só alterar a Min força, Max força e Max distancia para ter amplitudes diferentes.
O que vc fez foi criar um objeto empty PontoPivo e dentro dele colocar o objeto que vai ter esse movimento não é?
artplayer, vou testar esse codigo depois para ver como funciona!
AndyShow e MarcosSchultz, ainda não consegui acahr uma forma de encaixar o Random.Range com o Vecotr3 e Lerp para fazer isso, agradeço se puderem me explicar como fazer, aí fica sendo mais uma possibilidade além da que o George fez
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
Foi isso mesmo Marc7 :D
Eu criei o PontoPivo para que o objeto não vá pro além...
Usando o PontoPivo como centro, eu faço com que o objeto esteja sempre dentro do diâmetro desejado. Quando ele sai desse diâmetro, o script já manda uma força pra ele voltar novamente. Então o PontoPivo foi mais um limite pro objeto.
Que bom que ajudei, té mais
Eu criei o PontoPivo para que o objeto não vá pro além...
Usando o PontoPivo como centro, eu faço com que o objeto esteja sempre dentro do diâmetro desejado. Quando ele sai desse diâmetro, o script já manda uma força pra ele voltar novamente. Então o PontoPivo foi mais um limite pro objeto.
Que bom que ajudei, té mais
George Lucas Vieira- Avançado
- PONTOS : 3391
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
AndyShow escreveu:Marcos me Tira uma Duvida, se eu Der um Comando Inicial pro Lerp, que nao Seja no Update ele vai completar o Ciclo? ou precisa ser no Update?MarcosSchultz escreveu:Cara, você pode usar o Lerp sim, basta fazer um Random.Range em uma nova posição toda vez que Lerp chegar ao fim.
Precisa ser em alguma void de Update...
O Lerp vai fazer pequenas movimentações, do valor atual em direção ao destino... e estas pequenas movimentações vão acontecer toda vez que você chamar o comando, então ele tem que estar em alguma void que é chamada recorrentemente.
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
George Lucas Vieira, agradeço por essa ajuda com esse codigo mas eu tentei fazer a mesma coisa que vc fez só que em um projeto 2D, fiz um teste desse efeito em um objeto 2D mas não funcionou, o objeto fica parado.
no caso de objetos 2D como eu farei esse efeito de movimento suave do mesmo jeito que vc fez??
no caso de objetos 2D como eu farei esse efeito de movimento suave do mesmo jeito que vc fez??
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
Desculpe man, projeto meio antigo. Poderia colocar o script aqui pra mim analisar de novo? kkkkkkk
George Lucas Vieira- Avançado
- PONTOS : 3391
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
opa George, aqui esta:
to usando unity 5.5.1
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveSuave : MonoBehaviour {
public GameObject pontoPivo; //Objeto de referencia para a criação do diametro
public float minForça;
public float maxForça;
public float maxDistancia;
public float tempoRenovarForça;
private float fatorDeForça; //Variavel que vai receber a força
private float tempoCorrenteRenovar; //Tempo de influencia de força
private float distanciaDoPivo; //Variavel que mede a distancia do objeto para o pontoPivô
private Vector3 direçao; //Direçao na qual se aplica a força
private Rigidbody corpoRigido;
private bool novaDireçao; //Variavel auxiliar para mudar a direçao
void Start() {
corpoRigido = GetComponent<Rigidbody>();
novaDireçao = true;
}
void FixedUpdate() {
distanciaDoPivo = Vector3.Distance(transform.position, pontoPivo.transform.position);
//Se meu objeto estiver fora do diametro especificado pelo Spring Joint no PontoPivô
if (distanciaDoPivo >= maxDistancia) {
//A direçao da força sera aplicada para o PontoPivô, assim voltando para dentro do diametro
fatorDeForça = Random.Range(minForça, maxForça);
tempoCorrenteRenovar = 0;
direçao = (pontoPivo.transform.position - transform.position).normalized; //.normalized e utilizado para pegar a direçao de um Vector3
fatorDeForça = Random.Range(minForça, maxForça);
}
//Caso meu objeto estiver dentro do diametro especificado
if (distanciaDoPivo < maxDistancia) {
//Cronometro para alternar a direçao
tempoCorrenteRenovar += Time.deltaTime;
if (tempoCorrenteRenovar >= tempoRenovarForça) {
tempoCorrenteRenovar = 0;
novaDireçao = true;
}
//Direçao aleatoria
if (novaDireçao) {
direçao.x = Random.Range(-1f, 1f);
direçao.y = Random.Range(-1f, 1f);
fatorDeForça = Random.Range(minForça, maxForça);
novaDireçao = false;
}
}
//Objeto que receber a força
corpoRigido.AddForce(direçao * fatorDeForça - corpoRigido.velocity); //Eu tive que fazer o "-corpoRigido.velocity" para manter
} //a velocidade do objeto
}
to usando unity 5.5.1
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
Então amigo. Acho que se você simplesmente mudar a variável para RigidBody2D, já vai funcionar.
E mude também a linkagem dela no start:
- Código:
private Rigidbody2D corpoRigido;
E mude também a linkagem dela no start:
- Código:
corpoRigido = GetComponent<RigidBody2D>();
George Lucas Vieira- Avançado
- PONTOS : 3391
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
George troquei as linhas mas agora estou tendo problemas na ultima linha:
o que ta dentro o parenteses está dando erro
- Código:
corpoRigido.AddForce(direçao * fatorDeForça - corpoRigido.velocity);
o que ta dentro o parenteses está dando erro
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
faça as operações matemáticas fora dos parenteses... outra cosia, tem que ver se está trabalhando com grandezas iguais, se tudo é vetor.
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
Marcos não consegui resolver isso, tentei resolver retirando só o ' - corpoRigido.velocity ' de dentro do parenteses, o erro sumiu, mas o objeto vai aumentando a velocidade até sair da camera, por isso é que tem o comentario "// Eu tive que fazer o "- corpoRigido.velocity" para manter a velocidade do objeto"
no projeto em 3D esse codigo funciona por completo, só em 2D que ta dando erro
no projeto em 3D esse codigo funciona por completo, só em 2D que ta dando erro
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
alguem algo que eu possa fazer?
a ultima linha corpoRigido.AddForce(direçao * fatorDeForça - corpoRigido.velocity);
funciona em 3D, mas em 2D está com erro ainda, já tentei reescrever de varias formas, mas não dá certo.
seu tirar a linha - corpoRigido.velocity de dentro do parenteses o erro some, mas eu preciso dela para controlar a velocidade
a ultima linha corpoRigido.AddForce(direçao * fatorDeForça - corpoRigido.velocity);
funciona em 3D, mas em 2D está com erro ainda, já tentei reescrever de varias formas, mas não dá certo.
seu tirar a linha - corpoRigido.velocity de dentro do parenteses o erro some, mas eu preciso dela para controlar a velocidade
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
provavelmente está dando erro por que você não está usando comandos de Rigidbody2D...
Se o jogo é 2D, os comandos e as variáveis tem que ser do tipo 2D também.
Se o jogo é 2D, os comandos e as variáveis tem que ser do tipo 2D também.
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
MarcosSchultz escreveu:provavelmente está dando erro por que você não está usando comandos de Rigidbody2D...
Se o jogo é 2D, os comandos e as variáveis tem que ser do tipo 2D também.
o erro estpa ocorrendo dessa forma:
as variaveis eu já mudei de Rigidbody para Rigidbody2D. não consegui entender ainda onde está o erro, está notificando o problema no sinal de menos ' - '.
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Re: [RESOLVIDO] Movimento aleatório e suave de um objeto
Ok consegui resolver aqui, foi só trocar a variavel private Vector3 direcao; para Vector2 e corrigiu o erro. realmente tinha ambiguidade com Vector2 e Vector3 na mesma linha, por isso o erro.
Marc7- Mestre
- PONTOS : 3443
REPUTAÇÃO : 28
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] como desativar objeto aleatório de uma array
» Como deixar o movimento suave?
» [TUTORIAL] Movimento aleatório de um Rigidbody no chão
» [RESOLVIDO] como fazer um objeto trocar de cor ao colidir com outro objeto
» [RESOLVIDO] Sistema Aleatório
» Como deixar o movimento suave?
» [TUTORIAL] Movimento aleatório de um Rigidbody no chão
» [RESOLVIDO] como fazer um objeto trocar de cor ao colidir com outro objeto
» [RESOLVIDO] Sistema Aleatório
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos