Home > Blockchain >  Object following mouse using ScreenPointToRay lagging
Object following mouse using ScreenPointToRay lagging

Time:04-08

I am building a 3d topdown shooter. The player controls the avatar with the keyboard and the reticule with the mouse.

I found a simple way to implement the reticule based on this article: https://gamedevbeginner.com/how-to-convert-the-mouse-position-to-world-space-in-unity-2d-3d/

I defined an object which represents the reticule and attached this script:

public class Reticule : MonoBehaviour
{
    Camera mainCamera;
    Plane plane;
    float distance;
    Ray ray;

    // Start is called before the first frame update
    void Start()
    {
        mainCamera = Camera.main;
        plane = new Plane(Vector3.up, 0);
        
        // This would be turned off in the game. I set to on here, to allow me to see the cursor
        Cursor.visible = true;
    }

    // Update is called once per frame
    void Update()
    {
        ray = mainCamera.ScreenPointToRay(Input.mousePosition);

        if (plane.Raycast(ray, out distance))
        {
            transform.position = ray.GetPoint(distance);
        }
    }
}

This works, but the issue is that the reticule is lagging behind the mouse cursor, and catches up when I stop moving the mouse. Is this because this method is just slow. Is there another simple way to achieve the same result?

CodePudding user response:

the issue is that the reticule is lagging behind the mouse cursor, and catches up when I stop moving the mouse

That's normal, your mouse cursor is drawn by the graphics driver (with the help of WDM) as fast as the mouse data information comes over the wire, while your game only renders at a fixed framerate (or slower). Your hardware mouse will always be ahead of where your game draws it or anything related to it.

Some things that can help with working around this:

  • Don't show the system cursor, instead show your own. That way the cursor you show will always be in the same place your game thinks it is (since it drew it) and you won't have this issue. Careful with this however, because if your game's frame rate starts dipping it will be VERY noticeable when your cursor movement isn't smooth anymore.

  • Don't tie objects to your cursor. The issue doesn't show with normal interactions, like clicking buttons. You will notice this in RTS games when drawing boxes around units, but I struggle to think of another example of this.

  • Like above, but less restrictive, you could lerp the objects tied to your cursor in place, so they're always and intentionally behind it. It makes it look more gamey, which isn't that bad for a, you know, game. Though I wouldn't do this for a twitchy shooter, of course.

  • Related