Objeto que pula
3 participantes
Página 1 de 1
Objeto que pula
Ok. Eu queria fazer um objeto pular constantemente, sempre que ele encostasse em algo... fiz esse script
O objeto pula sempre que colide... porém eu queria fazer ele pular em outra direção caso ele encostasse na borda de um objeto... mais ou menos o que acontece no jogo pong, se a bolinha tocar no centro da barra que o jogador controla ela vai reto, supondo que ela toque no canto superior da barra que o jogador controla ela vai se mover reto e um pouco pra cima, eu quero que isso aconteça no meu jogo... esse vídeo mostra a gemplay do pong e da para entender melhor...
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pulo : MonoBehaviour
{
private Rigidbody RB;
private int Correr = 1;
// Start is called before the first frame update
void Start()
{
RB = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.LeftShift))
Correr = 2;
else Correr = 1;
RB.velocity = new Vector3(Input.GetAxis("Horizontal") * 4 * Correr, RB.velocity.y, Input.GetAxis("Vertical") * 4 * Correr);
}
private void OnCollisionEnter()
{
RB.AddForce(new Vector3(0, 10, 0), ForceMode.Impulse);
}
}
O objeto pula sempre que colide... porém eu queria fazer ele pular em outra direção caso ele encostasse na borda de um objeto... mais ou menos o que acontece no jogo pong, se a bolinha tocar no centro da barra que o jogador controla ela vai reto, supondo que ela toque no canto superior da barra que o jogador controla ela vai se mover reto e um pouco pra cima, eu quero que isso aconteça no meu jogo... esse vídeo mostra a gemplay do pong e da para entender melhor...
GattiMene- Membro
- PONTOS : 2337
REPUTAÇÃO : 2
Respeito as regras :
Re: Objeto que pula
Então Você Que Que Ele Vá Para Diagonal ao Colidir com as Laterais?
é Só mudar o "RB.AddForce(new Vector3(0, 10, 0), ForceMode.Impulse);", dependendo de onde foi a colisao.
Exemplo:
caso a Colisão seja na Lateral Direita "RB.AddForce(new Vector3(10, 10, 0), ForceMode.Impulse);".
é Só mudar o "RB.AddForce(new Vector3(0, 10, 0), ForceMode.Impulse);", dependendo de onde foi a colisao.
Exemplo:
caso a Colisão seja na Lateral Direita "RB.AddForce(new Vector3(10, 10, 0), ForceMode.Impulse);".
Magnatah- Instrutor
- PONTOS : 3547
REPUTAÇÃO : 209
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras :
Re: Objeto que pula
neste caso, poderia comparar as alturas, por exemplo:
a barra esta na altura 5, e a bolinha na 7.
ou seja,Diferença = AltBolinha - AltBarra = 7 - 5 = 2.
ou seja a diferença é de 2 positivos, ou seja para cima.
coloque esta diferença no addforce. Diferença = 2
RB.AddForce(new Vector3(Diferença, 10, 0), ForceMode.Impulse);
obs: talvez esta chamada no rigidbory esteja errada, veja qual é o eixo lateral correto.
nisto ele ira para cima o quanto maior for a diferença, caso tiver números muito baixos, multíplice antes ou durante a força Diferença * intensidade.
caso a bolinha esteja abaixo da barra terá o mesmo efeito:
barra 5, bolinha 4.
AltBolinha - AltBarra = 4 - 5 = -1.
ou seja a bolinha está abaixo e a uma distancia de 1, ou seja ela esta mais perto do centro que na ultima vez, portanto ela irá com menos intensidade para o lado.
caso quando ela bater perto do meio não querer nenhuma ação:
bolinha altura - 8
barra altura - 7,5
Diferença = 8 - 7,5 (= 0,5).
if(Diferença >= 2){
RB.AddForce(new Vector3(Diferença, 10, 0), ForceMode.Impulse);
}else{
RB.AddForce(new Vector3(0, 10, 0), ForceMode.Impulse);
}
Ou seja neste caso somente se movera para o lado se a bolinha bater no cantinho, e batendo no centro ela vai exatamente no eixo reto
o que deve se considerar:
-checar isto somente quando a bolinha colidir na barra.
-rever os valores colocados por min, pois eles variam (ex, altura, intensidade, etc).
-o eixo de aplicação de força lateral no rigidbory.
-verificar se não vai ficar estranho(pois se a bola estiver descendo e bater em uma barra reta e ela passar a voltar descendo vai ser estranho. então será que não é preciso checar também o eixo de deslocamento da bolinha?)
note que apenas você calcula a distancia da altura da bolinha com a barra, nisto de a bola estiver mais alta que o meio da barra, então ela esta no canto de cima, se estiver mais baixo, esta no canto de baixo...
eu já fiz um jogo parecido com isto, por isto tenho algumas ideias, no meu caso foi breakout, é o mesmo sentido, uma bolinha que se movimenta e precisa ir pra esquerda e para direita, porem eu fiz diferente do que eu lhe disse.
O jeito que fiz:
-substitui a barra reta por uma levemente encurvada, parecendo um triangulo.
-coloquei a bola com um rigidbory e coloquei uma velocidade mínima e máxima, pois o meu jogo a velocidade é variável.
-se a bola colidisse em algo eu dava um pouco mais de velocidade, então quando ela batia na paleta meio triangula ela se desloca para o lado certo.
-se a bola estivesse com velocidade angular para a direita e batesse na paleta, era notável que respeitava as físicas normalmente, pois a paleta não dava mais velocidade angular para a bola
espero ter ajudado, ou no mínimo dado uma ideia.
a barra esta na altura 5, e a bolinha na 7.
ou seja,Diferença = AltBolinha - AltBarra = 7 - 5 = 2.
ou seja a diferença é de 2 positivos, ou seja para cima.
coloque esta diferença no addforce. Diferença = 2
RB.AddForce(new Vector3(Diferença, 10, 0), ForceMode.Impulse);
obs: talvez esta chamada no rigidbory esteja errada, veja qual é o eixo lateral correto.
nisto ele ira para cima o quanto maior for a diferença, caso tiver números muito baixos, multíplice antes ou durante a força Diferença * intensidade.
caso a bolinha esteja abaixo da barra terá o mesmo efeito:
barra 5, bolinha 4.
AltBolinha - AltBarra = 4 - 5 = -1.
ou seja a bolinha está abaixo e a uma distancia de 1, ou seja ela esta mais perto do centro que na ultima vez, portanto ela irá com menos intensidade para o lado.
caso quando ela bater perto do meio não querer nenhuma ação:
bolinha altura - 8
barra altura - 7,5
Diferença = 8 - 7,5 (= 0,5).
if(Diferença >= 2){
RB.AddForce(new Vector3(Diferença, 10, 0), ForceMode.Impulse);
}else{
RB.AddForce(new Vector3(0, 10, 0), ForceMode.Impulse);
}
Ou seja neste caso somente se movera para o lado se a bolinha bater no cantinho, e batendo no centro ela vai exatamente no eixo reto
o que deve se considerar:
-checar isto somente quando a bolinha colidir na barra.
-rever os valores colocados por min, pois eles variam (ex, altura, intensidade, etc).
-o eixo de aplicação de força lateral no rigidbory.
-verificar se não vai ficar estranho(pois se a bola estiver descendo e bater em uma barra reta e ela passar a voltar descendo vai ser estranho. então será que não é preciso checar também o eixo de deslocamento da bolinha?)
note que apenas você calcula a distancia da altura da bolinha com a barra, nisto de a bola estiver mais alta que o meio da barra, então ela esta no canto de cima, se estiver mais baixo, esta no canto de baixo...
eu já fiz um jogo parecido com isto, por isto tenho algumas ideias, no meu caso foi breakout, é o mesmo sentido, uma bolinha que se movimenta e precisa ir pra esquerda e para direita, porem eu fiz diferente do que eu lhe disse.
O jeito que fiz:
-substitui a barra reta por uma levemente encurvada, parecendo um triangulo.
-coloquei a bola com um rigidbory e coloquei uma velocidade mínima e máxima, pois o meu jogo a velocidade é variável.
-se a bola colidisse em algo eu dava um pouco mais de velocidade, então quando ela batia na paleta meio triangula ela se desloca para o lado certo.
-se a bola estivesse com velocidade angular para a direita e batesse na paleta, era notável que respeitava as físicas normalmente, pois a paleta não dava mais velocidade angular para a bola
espero ter ajudado, ou no mínimo dado uma ideia.
Re: Objeto que pula
Mais ou menos isso! Mas sem ser em uma barra nas matérias mas sim no chão, um chão que não se movimenta, só a bolinha que se movimenta, daí se encostar nas laterais do chão ela faz o que faria no jogo ping, vai mais pros lados... isso em um jogo totalmente 3d... desculpe se eu me expressei mal... obrigado...luiz12345 escreveu:neste caso, poderia comparar as alturas, por exemplo:
a barra esta na altura 5, e a bolinha na 7.
ou seja,Diferença = AltBolinha - AltBarra = 7 - 5 = 2.
ou seja a diferença é de 2 positivos, ou seja para cima.
coloque esta diferença no addforce. Diferença = 2
RB.AddForce(new Vector3(Diferença, 10, 0), ForceMode.Impulse);
obs: talvez esta chamada no rigidbory esteja errada, veja qual é o eixo lateral correto.
nisto ele ira para cima o quanto maior for a diferença, caso tiver números muito baixos, multíplice antes ou durante a força Diferença * intensidade.
caso a bolinha esteja abaixo da barra terá o mesmo efeito:
barra 5, bolinha 4.
AltBolinha - AltBarra = 4 - 5 = -1.
ou seja a bolinha está abaixo e a uma distancia de 1, ou seja ela esta mais perto do centro que na ultima vez, portanto ela irá com menos intensidade para o lado.
caso quando ela bater perto do meio não querer nenhuma ação:
bolinha altura - 8
barra altura - 7,5
Diferença = 8 - 7,5 (= 0,5).
if(Diferença >= 2){
RB.AddForce(new Vector3(Diferença, 10, 0), ForceMode.Impulse);
}else{
RB.AddForce(new Vector3(0, 10, 0), ForceMode.Impulse);
}
Ou seja neste caso somente se movera para o lado se a bolinha bater no cantinho, e batendo no centro ela vai exatamente no eixo reto
o que deve se considerar:
-checar isto somente quando a bolinha colidir na barra.
-rever os valores colocados por min, pois eles variam (ex, altura, intensidade, etc).
-o eixo de aplicação de força lateral no rigidbory.
-verificar se não vai ficar estranho(pois se a bola estiver descendo e bater em uma barra reta e ela passar a voltar descendo vai ser estranho. então será que não é preciso checar também o eixo de deslocamento da bolinha?)
note que apenas você calcula a distancia da altura da bolinha com a barra, nisto de a bola estiver mais alta que o meio da barra, então ela esta no canto de cima, se estiver mais baixo, esta no canto de baixo...
eu já fiz um jogo parecido com isto, por isto tenho algumas ideias, no meu caso foi breakout, é o mesmo sentido, uma bolinha que se movimenta e precisa ir pra esquerda e para direita, porem eu fiz diferente do que eu lhe disse.
O jeito que fiz:
-substitui a barra reta por uma levemente encurvada, parecendo um triangulo.
-coloquei a bola com um rigidbory e coloquei uma velocidade mínima e máxima, pois o meu jogo a velocidade é variável.
-se a bola colidisse em algo eu dava um pouco mais de velocidade, então quando ela batia na paleta meio triangula ela se desloca para o lado certo.
-se a bola estivesse com velocidade angular para a direita e batesse na paleta, era notável que respeitava as físicas normalmente, pois a paleta não dava mais velocidade angular para a bola
espero ter ajudado, ou no mínimo dado uma ideia.
GattiMene- Membro
- PONTOS : 2337
REPUTAÇÃO : 2
Respeito as regras :
Re: Objeto que pula
Não foi isso que eu quis dizer mas também seria legal saber uma coisa... como detectar onde foi a colisão, tipo que parte da bolinha colidiu... obrigadoMagnatah escreveu:Então Você Que Que Ele Vá Para Diagonal ao Colidir com as Laterais?
é Só mudar o "[size=39]RB[/size][size=39].[/size][size=39]AddForce[/size][size=39]([/size][size=39]new[/size][size=39] [/size][size=39]Vector3[/size][size=39]([/size][size=39]0[/size][size=39],[/size][size=39] [/size][size=39]10[/size][size=39],[/size][size=39] [/size][size=39]0[/size][size=39]),[/size][size=39] [/size][size=39]ForceMode[/size][size=39].[/size][size=39]Impulse[/size][size=39]);", dependendo de onde foi a colisao. [/size]
[size=39]Exemplo:[/size]
[size=39]caso a Colisão seja na Lateral Direita "[/size][size=39]RB[/size][size=39].[/size][size=39]AddForce[/size][size=39]([/size][size=39]new[/size][size=39] [/size][size=39]Vector3[/size][size=39](1[/size][size=39]0[/size][size=39],[/size][size=39] [/size][size=39]10[/size][size=39],[/size][size=39] [/size][size=39]0[/size][size=39]),[/size][size=39] [/size][size=39]ForceMode[/size][size=39].[/size][size=39]Impulse[/size][size=39]);".[/size]
GattiMene- Membro
- PONTOS : 2337
REPUTAÇÃO : 2
Respeito as regras :
Re: Objeto que pula
bem, pelo que entendi você quer fazer isto num espaço tridimensional (3D), eu penso em 4 jeitos:
1- colocar vários boxCollider com isTrigger marcado e desenvolver um script para cada um para poder checar onde no chão a colisão foi efetuada. por exemplo vc tem um chão de 100x100, se colocar colisores do tamanho de 1x1, terá 10000, porem a precisão será muito boa, e em cada um desse colisores você pode setar uma ação diferente para a bolinha (pode dar lag se você não souber otimizar o script, ou colocar muitos como eu disse).
2- você ainda usar o método antigo que eu disse, de ver o quão distante a bolinha está distante do chão, porem em vez de mecher na altura mecha na profundidade e na largura(visando ser um chão quadrado ou circular, se for um chão com curvas como por exemplo de uma casa, não dará certo).
3- colocar um rigidbory com is kinematic, aumentar o bounce na colisão, setar uma velocidade única a ele, e nos cantos que quiser colocar para ele ir mais pra certa área vc coloca um box colider com istrigger true e um script que depois de detectar a colisão ele movimenta a bola para esquerda/direita frente/traz.
4- fazer o jeito anterior (que no caso a bolinha já vai ir um poco pro lado se bater com velocidade angular) e colocar um box colider com istrigger true e um script que remova toda a velocidade angular porem em vez de ser colocado no canto ser colocado na parte do meio, onde a bola não se movera pro lado.
acho que é isso que procura, neste caso eu n saberia mt bem oque fazer, boa sorte.
bem, pelo visto você deve so ta querendo detectar colisão e ta todo mundo entendendo errado.
se vc somente quiser saber quando um objeto bate no outro:
-coloque um dos objetos com um colisor qualquer marcado como istrigger = true no inspector(colocque ele um pouco maior que o colisor sem o istrigger), depois coloque um script nele contendo esta void:
Void OnTriggerEnter(Collider Coll){ /* aqui bota o que ocorrer como na void update*/ }
nisto você pode deixar por exemplo um bool para true, ai quando esta bool ficar true você sabe que ele bateu em algo.
espero ter entendido, caso não. tente colocar mais detalhes, faça um esboço no paint e envia, sla.
1- colocar vários boxCollider com isTrigger marcado e desenvolver um script para cada um para poder checar onde no chão a colisão foi efetuada. por exemplo vc tem um chão de 100x100, se colocar colisores do tamanho de 1x1, terá 10000, porem a precisão será muito boa, e em cada um desse colisores você pode setar uma ação diferente para a bolinha (pode dar lag se você não souber otimizar o script, ou colocar muitos como eu disse).
2- você ainda usar o método antigo que eu disse, de ver o quão distante a bolinha está distante do chão, porem em vez de mecher na altura mecha na profundidade e na largura(visando ser um chão quadrado ou circular, se for um chão com curvas como por exemplo de uma casa, não dará certo).
3- colocar um rigidbory com is kinematic, aumentar o bounce na colisão, setar uma velocidade única a ele, e nos cantos que quiser colocar para ele ir mais pra certa área vc coloca um box colider com istrigger true e um script que depois de detectar a colisão ele movimenta a bola para esquerda/direita frente/traz.
4- fazer o jeito anterior (que no caso a bolinha já vai ir um poco pro lado se bater com velocidade angular) e colocar um box colider com istrigger true e um script que remova toda a velocidade angular porem em vez de ser colocado no canto ser colocado na parte do meio, onde a bola não se movera pro lado.
acho que é isso que procura, neste caso eu n saberia mt bem oque fazer, boa sorte.
bem, pelo visto você deve so ta querendo detectar colisão e ta todo mundo entendendo errado.
se vc somente quiser saber quando um objeto bate no outro:
-coloque um dos objetos com um colisor qualquer marcado como istrigger = true no inspector(colocque ele um pouco maior que o colisor sem o istrigger), depois coloque um script nele contendo esta void:
Void OnTriggerEnter(Collider Coll){ /* aqui bota o que ocorrer como na void update*/ }
nisto você pode deixar por exemplo um bool para true, ai quando esta bool ficar true você sabe que ele bateu em algo.
espero ter entendido, caso não. tente colocar mais detalhes, faça um esboço no paint e envia, sla.
Re: Objeto que pula
obs, o jeito 3 e 4 eu mandei colocar um rigidbory com iskinematic ativo, isto está errado era para remover a gravidade, não o kinematic, ele deixe desligado mesmo.
Tópicos semelhantes
» problema com script de pula pula
» Quero setar uma variavel de um objeto para outros objetos , mas o objeto esta dentro de uma array desse objeto
» Personagem não pula
» Como fazer o player pula
» Meu personagem pula mesmo quando ja está no ar pulando
» Quero setar uma variavel de um objeto para outros objetos , mas o objeto esta dentro de uma array desse objeto
» Personagem não pula
» Como fazer o player pula
» Meu personagem pula mesmo quando ja está no ar pulando
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos