Como freiar uma nave 2d
4 participantes
Página 1 de 1
Como freiar uma nave 2d
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShipMovement : MonoBehaviour
{
// Start is called before the first frame update
public Rigidbody2D rigidBody;
public float speed = 5f;
private float rotate = 0f;
private float front = 0f;
Vector2 m_EulerAngleVelocity;
public float revSpeed = 50.0f;
public float maxSpeed;
public float nowSpeed;
void Start()
{
rigidBody = GetComponent<Rigidbody2D>();
m_EulerAngleVelocity = new Vector3(0, 100, 0);
}
// Update is called once per frame
void Update()
{
nowSpeed = rigidBody.velocity.magnitude;
rotate = Input.GetAxis("Horizontal");
front = Input.GetAxis("Vertical");
if (rotate > 0f)
{
rigidBody.MoveRotation(rigidBody.rotation + -1 * revSpeed * Time.fixedDeltaTime);
}
else if (rotate < 0f)
{
rigidBody.MoveRotation(rigidBody.rotation + 1 * revSpeed * Time.fixedDeltaTime);
}
if (front > 0f && nowSpeed < maxSpeed)
{
rigidBody.AddRelativeForce(Vector2.up * speed * Time.deltaTime);
}
else if (front < 0f)
{
if (nowSpeed < 1)
{
rigidBody.AddRelativeForce(Vector2.down * speed * Time.deltaTime);
}
}
}
}
dknoob537- Membro
- PONTOS : 2565
REPUTAÇÃO : 7
Idade : 23
Respeito as regras :
Re: Como freiar uma nave 2d
dknoob537 escreveu:agr funciona mas nem tanto, ele fica quase parado
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShipMovement : MonoBehaviour
{
// Start is called before the first frame update
public Rigidbody2D rigidBody;
public float speed = 5f;
private float rotate = 0f;
private float front = 0f;
public float revSpeed = 50.0f;
public float maxSpeed;
public float nowSpeed;
public float nowSpeedy;
public Joint2D rb3;
void Start()
{
rigidBody = GetComponent<Rigidbody2D>();
rb3 = GetComponent<Joint2D>();
}
// Update is called once per frame
void Update()
{
nowSpeed = rigidBody.velocity.magnitude;
nowSpeedy = transform.InverseTransformDirection(rigidBody.velocity).y;
rotate = Input.GetAxis("Horizontal");
front = Input.GetAxis("Vertical");
if (rotate > 0f)
{
rigidBody.MoveRotation(rigidBody.rotation + -1 * revSpeed * Time.fixedDeltaTime);
}
else if (rotate < 0f)
{
rigidBody.MoveRotation(rigidBody.rotation + 1 * revSpeed * Time.fixedDeltaTime);
}
if (front > 0f && nowSpeedy < maxSpeed)
{
rigidBody.AddRelativeForce(Vector2.up * speed * Time.deltaTime);
}
else if (front < 0f )
{
if (nowSpeedy > 0)
{
rigidBody.AddRelativeForce(Vector2.down * speed * Time.deltaTime);
}
}
}
}
dknoob537- Membro
- PONTOS : 2565
REPUTAÇÃO : 7
Idade : 23
Respeito as regras :
Re: Como freiar uma nave 2d
dknoob537 escreveu:dknoob537 escreveu:agr é mt perto de parado mas n para
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShipMovement : MonoBehaviour
{
// Start is called before the first frame update
public Rigidbody2D rigidBody;
public float speed = 5f;
private float rotate = 0f;
private float front = 0f;
public float revSpeed = 50.0f;
public float maxSpeed;
public float nowSpeed;
public float nowSpeedy;
public float nowSpeedx;
public Joint2D rb3;
void Start()
{
rigidBody = GetComponent<Rigidbody2D>();
rb3 = GetComponent<Joint2D>();
}
// Update is called once per frame
void Update()
{
nowSpeed = rigidBody.velocity.magnitude;
nowSpeedy = transform.InverseTransformDirection(rigidBody.velocity).y;
nowSpeedx = transform.InverseTransformDirection(rigidBody.velocity).x;
rotate = Input.GetAxis("Horizontal");
front = Input.GetAxis("Vertical");
if (rotate > 0f)
{
rigidBody.MoveRotation(rigidBody.rotation + -1 * revSpeed * Time.fixedDeltaTime);
}
else if (rotate < 0f)
{
rigidBody.MoveRotation(rigidBody.rotation + 1 * revSpeed * Time.fixedDeltaTime);
}
if (front > 0f && nowSpeedy < maxSpeed)
{
rigidBody.AddRelativeForce(Vector2.up * speed * Time.deltaTime);
}
else if (front < 0f )
{
if (nowSpeedy > 0)
{
rigidBody.AddRelativeForce(Vector2.down * speed * Time.deltaTime);
}
if (nowSpeedx > 0)
{
rigidBody.AddRelativeForce(Vector2.left * speed * Time.deltaTime);
}
if (nowSpeedx < 0)
{
rigidBody.AddRelativeForce(Vector2.right * speed * Time.deltaTime);
}
}
}
dknoob537- Membro
- PONTOS : 2565
REPUTAÇÃO : 7
Idade : 23
Respeito as regras :
Re: Como freiar uma nave 2d
Rapaz, isso tudo é só para mover a nave ?
mecjo- Membro
- PONTOS : 2645
REPUTAÇÃO : 10
Respeito as regras :
Re: Como freiar uma nave 2d
Há bastante velocidade aí! No caso, não haveria uma forma de criar uma dependência com uma única variável de velocidade, assim, controlar a mesma afetaria todas as velocidades, ou seja, se colocar esta em 0, todo o sistema vai parar.
Tegh- Avançado
- PONTOS : 2654
REPUTAÇÃO : 97
Idade : 23
Respeito as regras :
Re: Como freiar uma nave 2d
sim, é que eu sou leigo mas tem algumas coisas q da pra ajeitarmecjo escreveu:Rapaz, isso tudo é só para mover a nave ?
dknoob537- Membro
- PONTOS : 2565
REPUTAÇÃO : 7
Idade : 23
Respeito as regras :
Re: Como freiar uma nave 2d
Tegh escreveu:Há bastante velocidade aí! No caso, não haveria uma forma de criar uma dependência com uma única variável de velocidade, assim, controlar a mesma afetaria todas as velocidades, ou seja, se colocar esta em 0, todo o sistema vai parar.
como eu faria isso?
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShipMovement : MonoBehaviour
{
// Start is called before the first frame update
public Rigidbody2D rigidBody;
public float speed = 5f;
private float rotate = 0f;
private float front = 0f;
public float revSpeed = 50.0f;
public float maxSpeed;
public float nowSpeed;
public float nowSpeedy;
public float nowSpeedx;
//public Joint2D rb3;
void Start()
{
rigidBody = GetComponent<Rigidbody2D>();
// rb3 = GetComponent<Joint2D>();
}
// Update is called once per frame
void Update()
{
// movimento
nowSpeed = rigidBody.velocity.magnitude;
nowSpeedy = transform.InverseTransformDirection(rigidBody.velocity).y;
nowSpeedx = transform.InverseTransformDirection(rigidBody.velocity).x;
rotate = Input.GetAxis("Horizontal");
front = Input.GetAxis("Vertical");
if (rotate > 0f)
{
rigidBody.MoveRotation(rigidBody.rotation + -1 * revSpeed * Time.fixedDeltaTime);
}
else if (rotate < 0f)
{
rigidBody.MoveRotation(rigidBody.rotation + 1 * revSpeed * Time.fixedDeltaTime);
}
if (front > 0f)
{
if (nowSpeedy < maxSpeed)
rigidBody.AddRelativeForce(Vector2.up * speed * Time.deltaTime);
if (nowSpeedx > 0)
{
rigidBody.AddRelativeForce(Vector2.left * speed * Time.deltaTime);
}
if (nowSpeedx < 0)
{
rigidBody.AddRelativeForce(Vector2.right * speed * Time.deltaTime);
}
}
else if (front < 0f )
{
if (nowSpeedy > 0)
{
rigidBody.AddRelativeForce(Vector2.down * speed * Time.deltaTime);
}
if (nowSpeedx > 0)
{
rigidBody.AddRelativeForce(Vector2.left * speed * Time.deltaTime);
}
if (nowSpeedx < 0)
{
rigidBody.AddRelativeForce(Vector2.right * speed * Time.deltaTime);
}
}
}
}
dknoob537- Membro
- PONTOS : 2565
REPUTAÇÃO : 7
Idade : 23
Respeito as regras :
Re: Como freiar uma nave 2d
eu atribui um variavel a magnitude da velocidade da nave porem quando falo q ele é zero n funciona pois o dado é apenas de leitura e nao modifica a velocidade do rigibodyTegh escreveu:Há bastante velocidade aí! No caso, não haveria uma forma de criar uma dependência com uma única variável de velocidade, assim, controlar a mesma afetaria todas as velocidades, ou seja, se colocar esta em 0, todo o sistema vai parar.
dknoob537- Membro
- PONTOS : 2565
REPUTAÇÃO : 7
Idade : 23
Respeito as regras :
Re: Como freiar uma nave 2d
- dknoob537:
- dknoob537 escreveu:Tegh escreveu:Há bastante velocidade aí! No caso, não haveria uma forma de criar uma dependência com uma única variável de velocidade, assim, controlar a mesma afetaria todas as velocidades, ou seja, se colocar esta em 0, todo o sistema vai parar.
como eu faria isso?- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShipMovement : MonoBehaviour
{
// Start is called before the first frame update
public Rigidbody2D rigidBody;
public float speed = 5f;
private float rotate = 0f;
private float front = 0f;
public float revSpeed = 50.0f;
public float maxSpeed;
public float nowSpeed;
public float nowSpeedy;
public float nowSpeedx;
//public Joint2D rb3;
void Start()
{
rigidBody = GetComponent<Rigidbody2D>();
// rb3 = GetComponent<Joint2D>();
}
// Update is called once per frame
void Update()
{
// movimento
nowSpeed = rigidBody.velocity.magnitude;
nowSpeedy = transform.InverseTransformDirection(rigidBody.velocity).y;
nowSpeedx = transform.InverseTransformDirection(rigidBody.velocity).x;
rotate = Input.GetAxis("Horizontal");
front = Input.GetAxis("Vertical");
if (rotate > 0f)
{
rigidBody.MoveRotation(rigidBody.rotation + -1 * revSpeed * Time.fixedDeltaTime);
}
else if (rotate < 0f)
{
rigidBody.MoveRotation(rigidBody.rotation + 1 * revSpeed * Time.fixedDeltaTime);
}
if (front > 0f)
{
if (nowSpeedy < maxSpeed)
rigidBody.AddRelativeForce(Vector2.up * speed * Time.deltaTime);
if (nowSpeedx > 0)
{
rigidBody.AddRelativeForce(Vector2.left * speed * Time.deltaTime);
}
if (nowSpeedx < 0)
{
rigidBody.AddRelativeForce(Vector2.right * speed * Time.deltaTime);
}
}
else if (front < 0f )
{
if (nowSpeedy > 0)
{
rigidBody.AddRelativeForce(Vector2.down * speed * Time.deltaTime);
}
if (nowSpeedx > 0)
{
rigidBody.AddRelativeForce(Vector2.left * speed * Time.deltaTime);
}
if (nowSpeedx < 0)
{
rigidBody.AddRelativeForce(Vector2.right * speed * Time.deltaTime);
}
}
}
}
Tegh- Avançado
- PONTOS : 2654
REPUTAÇÃO : 97
Idade : 23
Respeito as regras :
Re: Como freiar uma nave 2d
- Código:
float x = Input.GetAxis("Horizontal") * Time.deltaTime * Speed;
float y = Input.GetAxis("Vertical") * Time.deltaTime * Speed;
transform.Translate(x, y, 0);
Testa isso aqui
mecjo- Membro
- PONTOS : 2645
REPUTAÇÃO : 10
Respeito as regras :
Re: Como freiar uma nave 2d
Lembre-se de criar uma float Speed
mecjo- Membro
- PONTOS : 2645
REPUTAÇÃO : 10
Respeito as regras :
Re: Como freiar uma nave 2d
Lembrando que esse script é um script de movimento completo já, sem usar Rigidbody.
A partir disso a nave já anda sem ter que freia.
A partir disso a nave já anda sem ter que freia.
mecjo- Membro
- PONTOS : 2645
REPUTAÇÃO : 10
Respeito as regras :
Re: Como freiar uma nave 2d
- mecjo:
- mecjo escreveu:
- Código:
float x = Input.GetAxis("Horizontal") * Time.deltaTime * Speed;
float y = Input.GetAxis("Vertical") * Time.deltaTime * Speed;
transform.Translate(x, y, 0);
Testa isso aqui
Tegh- Avançado
- PONTOS : 2654
REPUTAÇÃO : 97
Idade : 23
Respeito as regras :
Re: Como freiar uma nave 2d
Tegh escreveu:O Translate, se não engano-me, ignora a física pelo o fato dele posicionar o objeto. Pode ser um problema caso trabalhe com objetos que implicam alguma força na nave.
- mecjo:
mecjo escreveu:
- Código:
float x = Input.GetAxis("Horizontal") * Time.deltaTime * Speed;
float y = Input.GetAxis("Vertical") * Time.deltaTime * Speed;
transform.Translate(x, y, 0);
Testa isso aqui
Exato, porem ele ta trabalhando 2d, acho que fisica não é um foco 100% útil.
mecjo- Membro
- PONTOS : 2645
REPUTAÇÃO : 10
Respeito as regras :
Re: Como freiar uma nave 2d
Olá amiguinhos, boa noite
Não consegui fazer direto na Unity então passei só pelo Visual Studio Code, então pode ter alguns errinhos de semântica, principalmente porque eu mexi em outras coisinhas, qualquer coisa cê traz aqui para a gente dar uma verificada, taok?
que meio que "suaviza" a transição de um vetor para outro, no caso, "Vector2.zero", ou seja, frear.
Pode não dar certo de primeira, mas tenho certeza que dá para entender a ideia que eu passei..
Depois cê explica a parte do último IF? Onde tem "nowSpeed < 1"? Não entendi, por que você colocou isso aí? O correto não seria: "front < 0"?
Referências Utilizadas (Para estudo):
Vector2 Lerp: https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
Velocity no Rigidbody: https://docs.unity3d.com/ScriptReference/Rigidbody2D-velocity.html
Não consegui fazer direto na Unity então passei só pelo Visual Studio Code, então pode ter alguns errinhos de semântica, principalmente porque eu mexi em outras coisinhas, qualquer coisa cê traz aqui para a gente dar uma verificada, taok?
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShipMovement : MonoBehaviour {
private Rigidbody2D rigidBody { get { return GetComponent<Rigidbody2D> (); } set { rigidBody = value; } }
public float speed = 5f;
public float revSpeed = 50.0f, maxSpeed = 4f; // <- Alterar o max speed
void FixedUpdate () { // Apenas cálculo de física, não adicione condições de inputs aqui!
float nowSpeed = rigidBody.velocity.magnitude;
float rotate = Input.GetAxis ("Horizontal");
float front = Input.GetAxis ("Vertical");
if (rotate != 0)
rigidBody.MoveRotation (rigidBody.rotation + (rotate > 0f ? -1 : 1) * revSpeed);
if (front != 0) {
if (front > 0f && nowSpeed < maxSpeed) // Ainda não chegou à velocidade máxima e o usuário está tentando acelerar
rigidBody.AddRelativeForce (Vector2.up * speed * Time.deltaTime);
/* Não entendi porque você colocou o nowSpeed < 1, poderia explicar? */
else if (nowSpeed < 1) // Usuário quer freiar
rigidBody.velocity = Vector2.Lerp ((Vector2) rigidBody.velocity, Vector2.zero, 0.01f);
}
}
}
que meio que "suaviza" a transição de um vetor para outro, no caso, "Vector2.zero", ou seja, frear.
Pode não dar certo de primeira, mas tenho certeza que dá para entender a ideia que eu passei..
Depois cê explica a parte do último IF? Onde tem "nowSpeed < 1"? Não entendi, por que você colocou isso aí? O correto não seria: "front < 0"?
Referências Utilizadas (Para estudo):
Vector2 Lerp: https://docs.unity3d.com/ScriptReference/Vector2.Lerp.html
Velocity no Rigidbody: https://docs.unity3d.com/ScriptReference/Rigidbody2D-velocity.html
NKKF- ProgramadorMaster
- PONTOS : 4818
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Tópicos semelhantes
» Script de Nave espacial com inteligência artificial
» Como eu faço um "Sprint" para minha nave:
» movimento de uma nave
» [Duvida] movimentação de nave
» Jogo para limitar a nave dentro da tela
» Como eu faço um "Sprint" para minha nave:
» movimento de uma nave
» [Duvida] movimentação de nave
» Jogo para limitar a nave dentro da tela
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos