How to move 2D Object within camera view boundary

后端 未结 4 1631
感动是毒
感动是毒 2020-12-21 23:47

I have a scene that my camera doesn\'t follow my player. When player reaches the end of camera I want player to can\'t go further (out of camera view). How can I do this?

4条回答
  •  长情又很酷
    2020-12-22 00:18

    I noticed you used a Collider2D. You should be using Rigidbody2D.MovePosition instead of transform.Translate or you'll likely run into issues when transform.Translate is used.

    1.Take the final move position and convert it to new position in ViewPortPoint with Camera.main.WorldToViewportPoint

    2.Apply a limit with Mathf.Clamp to the result in #1.

    3.Convert the ViewPortPoint back to world point with Camera.main.ViewportToWorldPoint.

    4.Finally, move it with Rigidbody2D.MovePosition.


    The code below is modified from this answer to include restriction to screen boundary.

    Move without Rigidbody:

    Use only if collision and physics are NOT required:

    public float speed = 100;
    public Transform obj;
    
    public void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
    
        //Move only if we actually pressed something
        if ((h > 0 || v > 0) || (h < 0 || v < 0))
        {
            Vector3 tempVect = new Vector3(h, v, 0);
            tempVect = tempVect.normalized * speed * Time.deltaTime;
    
    
            Vector3 newPos = obj.transform.position + tempVect;
            checkBoundary(newPos);
        }
    }
    
    void checkBoundary(Vector3 newPos)
    {
        //Convert to camera view point
        Vector3 camViewPoint = Camera.main.WorldToViewportPoint(newPos);
    
        //Apply limit
        camViewPoint.x = Mathf.Clamp(camViewPoint.x, 0.04f, 0.96f);
        camViewPoint.y = Mathf.Clamp(camViewPoint.y, 0.07f, 0.93f);
    
        //Convert to world point then apply result to the target object
        obj.position = Camera.main.ViewportToWorldPoint(camViewPoint);
    }
    

    Move Object with Rigidbody2D:

    Use if collision and physics are required:

    public float speed = 100;
    public Rigidbody2D rb;
    
    public void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
    
        //Move only if we actually pressed something
        if ((h > 0 || v > 0) || (h < 0 || v < 0))
        {
            Vector3 tempVect = new Vector3(h, v, 0);
            tempVect = tempVect.normalized * speed * Time.deltaTime;
    
            //rb.MovePosition(rb.transform.position + tempVect);
    
            Vector3 newPos = rb.transform.position + tempVect;
            checkBoundary(newPos);
        }
    }
    
    void checkBoundary(Vector3 newPos)
    {
        //Convert to camera view point
        Vector3 camViewPoint = Camera.main.WorldToViewportPoint(newPos);
    
        //Apply limit
        camViewPoint.x = Mathf.Clamp(camViewPoint.x, 0.04f, 0.96f);
        camViewPoint.y = Mathf.Clamp(camViewPoint.y, 0.07f, 0.93f);
    
        //Convert to world point then apply result to the target object
        Vector3 finalPos = Camera.main.ViewportToWorldPoint(camViewPoint);
        rb.MovePosition(finalPos);
    }
    

提交回复
热议问题