Lee Geng
Lee Geng

Reputation: 19

Moving gameobject based on direction but the movement gets effected by distance of cursor

Im trying to make a peice of code that instantiates a gameobject, set its rotation to face the direction of the cursor from the player character at that moment and move towards that direction with constant speed for 2 seconds then stop. However my piece of coded is moving the gameobject towards the cursor direction but the speed gets changed depending on how far my cursor is from the player character.

private IEnumerator Rake()
{
    Vector3 relativepos = 
        Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;

    Quaternion rotation = Quaternion.LookRotation(relativepos, Vector3.up);
    float timepassed = 0;
    GameObject WcastRB = 
        Instantiate(Wcast, gameObject.transform.position, rotation);

    Rigidbody2D rg;
    rg = WcastRB.GetComponent<Rigidbody2D>();

    while (timepassed < 2)
    {
        timepassed += Time.deltaTime;
        rg.velocity = WcastRB.transform.forward * 1000 * Time.deltaTime;

        if (timepassed >= 2)
        {
            rg.velocity = WcastRB.transform.forward * 0;
        }
        yield return null;
    }
}

this is what I have made.

Upvotes: 1

Views: 130

Answers (1)

DekuDesu
DekuDesu

Reputation: 2292

Try this out, I found that because transform.forward was dependent on the object's rotation(and subsequently the original click position).

When the click was too close to the object the transform.forward Vector2 had a magnitude(length) of less than one, causing the speed to slow down.

By increasing the magnitude of the velocity to exactly 1f it should go consistent speeds in all directions

IEnumerator Rake()
{

    Vector3 relativepos = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;

    Quaternion rotation = Quaternion.LookRotation(relativepos, Vector3.up);

    float timepassed = 0;
    GameObject WcastRB = Instantiate(Wcast, gameObject.transform.position, rotation);
    Rigidbody2D rg;

    rg = WcastRB.GetComponent<Rigidbody2D>();

    Vector2 velocity = rg.transform.forward;

    velocity.Normalize();

    while (timepassed < 2)
    {
        timepassed += Time.deltaTime;

        rg.velocity = velocity * 1000 * Time.deltaTime;

        if (timepassed >= 2)
        {
            rg.velocity = new Vector2();
        }

        yield return null;

    }
}

Edit: Removed self-implemented .Normalize() because I forgot that i also used the built in .Normalize() literally right before it.

Upvotes: 1

Related Questions