- Home /
rigidbody2D.velocity.y always returns 0
Hi, I need some help with my code. I have searched evreywhere but i wasn't able to find a solution. The problem is that rigidbody2D.velocity.y and rigidbody2D.velocity.x always returns 0 even if the player is moving!
Maybe the problem could be that I use Vector3.MoveTowards...
Thank you for your help, this is making me crazy.
using UnityEngine;
using System.Collections;
public class playerControllerScript : MonoBehaviour
{
private float speed = 2.5f;
private float relSpeed;
private Vector3 target;
private float myScale = 1.15f;
float relativeScale;
private bool facingRight = true;
static public Vector3 playerPosition;
private bool move = true;
private Animator anim;
public float testSpeed;
void Start ()
{
target = transform.position;
relSpeed = speed;
oldPosition = transform.position;
anim = GetComponent<Animator>();
}
void Update ()
{
if (Input.GetMouseButtonDown(0))
{
// This part is for moving only if you click on certain layer
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit2D hit = Physics2D.GetRayIntersection(ray,Mathf.Infinity);
if(hit.collider != null && (hit.transform.gameObject.layer == LayerMask.NameToLayer("Floor")))
{
target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
target.z = transform.position.z;
}
move = true;
}
if (move == true)
transform.position = Vector3.MoveTowards(transform.position, target, relSpeed * Time.deltaTime);
// This is for changing the size of the player and it's speed (it depends on how much he is far away)
relativeScale = myScale - transform.position.y / 5;
if (target.x > transform.position.x && !facingRight)
facingRight = true;
else if (target.x < transform.position.x && facingRight)
facingRight = false;
if (!facingRight)
transform.localScale = new Vector3(relativeScale * -1, relativeScale, relativeScale);
else
transform.localScale = new Vector3(relativeScale, relativeScale, relativeScale);
relSpeed = speed - transform.position.y / 5;
playerPosition = transform.position;
}
void FixedUpdate ()
{
testSpeed = rigidbody2D.velocity.y;
anim.SetFloat ("vSpeed",rigidbody2D.velocity.y);
}
}
Answer by Le-Capitaine · Sep 06, 2014 at 03:35 PM
It's actually rigidbody.velocity that affects the position, and not the other way around. Note however that you can easily calculate your own "fake" velocity the other way around:
Vector3 velocity;
Vector3 oneFrameAgo;
void FixedUpdate () {
velocity = transform.position - oneFrameAgo;
oneFrameAgo = transform.position;
}
As well, you can apply that to rotation and even scale, if that's ever useful.
Answer by flaviusxvii · Sep 06, 2014 at 03:10 PM
Directly changing the transform will make the velocity useless I'm afraid. Velocity is used by the underlying physics system. http://gamedev.stackexchange.com/a/69586