O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

[Unity] Plataforma de Pulo

Iniciado por Cybermaker, 20/05/2018 às 19:34

20/05/2018 às 19:34 Última edição: 21/05/2018 às 11:28 por Corvo
Eu comecei a duas semanas a usar o Unity e estou começando a entender os códigos, na tentativa de criar uma plataforma 2D de pulo(semelhante a uma mola) criei esse codigo:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mola : MonoBehaviour {

   Rigidbody2D rb;
   public GameObject player;
   public float jumpForce = 900;

   // Use this for initialization
   void Start () {
   
   rb = gameObject.GetComponent<Rigidbody2D>();
      
   }
   
   // Update is called once per frame
   void Update () {
      
   }
   
   void OnTriggerEnter2D(Collider2D other)
   {
   
         if (other.gameObject.CompareTag("Player"))
         {
            player.gameObject.GetComponent<Rigidbody2D>().AddForce(new Vector2(0, jumpForce));
         }
   }
      
         
}

Minha duvida é que por alguma razão existe uma variabilidade na altura do salto, algumas vezes são muito pequenos e em outras o personagem sai da tela de tão alto. Eu acho que é causado pelo comando AddForce que dependendo da velocidade do Player acaba resultando em algo diferente, então eu gostaria de saber se existe outro método para fazer com que o personagem pule.

21/05/2018 às 05:12 #1 Última edição: 21/05/2018 às 05:13 por Sotelie
Sim, o [emphasys]AddForce[/emphasys] adiciona uma força baseada na massa e na velocidade do objeto. Bem coisa Newtoniana.
O mais viável nesse caso seria você modificar a velocidade literal do objeto [emphasys]rb.velocity[/emphasys], assim ele teria a mesma força de pulo toda vez que pisasse na mola.

Certo, eu tentei de alguns jeitos diferentes aqui e dei uma pesquisada na internet, porém eu ainda não descobri como se altera a velocidade do rigidbody do player em outro objeto.

Para isso você pode ver essa questão aqui: http://centrorpg.com/index.php?topic=20180.msg145753#msg145753
Mas caso você queira pegar o [emphasys]Rigidbody2D[/emphasys] de um objeto desconhecido (como o [emphasys]Collider2D other[/emphasys]), você pode obter o componente direto do [emphasys]gameObject[/emphasys]:

void OnTriggerEnter2D(Collider2D other)
{
        Rigidbody2D _body = other.gameObject.GetComponent<Rigidbody2D>();
        if (_body != null)
        {
                _body.velocity = new Vector2(_body.velocity.x, 20);
        }
}


Tome nota que o [emphasys]GetComponent[/emphasys] é um processo um tanto pesado para se usar em um game loop, e pode causar Lag Spike caso tenham muitos players ou objetos interagindo ao mesmo tempo. Para resolver o problema, recomendo o uso de um [emphasys]Dictionary[/emphasys]:

using System.Collections.Generic;

Dictionary<Transform, Rigidbody2D> rigidBodies = new Dictionary<Transform, Rigidbody2D>();

void OnTriggerEnter2D(Collider2D other)
{
        if (!rigidBodies.ContainsKey(other.gameObject.transform)
                rigidBodies.Add(other.gameObject.transform, other.gameObject.GetComponent<Rigidbody2D>();
        rigidBodies[other.gameObject.transform].velocity = new Vector2(rigidBodies[other.gameObject.transform].velocity.x, 20);
}


Ele vai registrar todos os [emphasys]Rigidbody2D[/emphasys] que colidirem com ele ao invés de obter o componente toda vez. Você provavelmente vai querer adicionar um limite de objetos que o [emphasys]Dictionary[/emphasys] vai segurar, mas isso só caso você tenha muitos objetos na [emphasys]Scene[/emphasys].

o/

Muito obrigado pelas explicações, agora fiz a plataforma funcionar da maneira que queria!