Unity32 (2D!) Camera problem....

Discussion in 'Computer Programming, Emulation, and Game Modding' started by Pleng, Jan 7, 2015.

  1. Pleng
    OP

    Pleng GBAtemp Advanced Maniac

    Member
    1,704
    849
    Sep 14, 2011
    Thailand
    Well as usual my question had no response from Stack Overflow, so perhaps somebody here can help fill the void...


    I am creating a game which has up to 4 orthographic cameras (for up to 4 players), which take up various amounts of the screen, depending on the amount of players, for example...
    [​IMG] [​IMG]

    I have a script which controls all the cameras, setting their position relative to the players they are watching.
    What I want to achieve is a simple overhead-runner style of movement, whereby the camera will follow the player, but not go outside the bounds of the map.

    [​IMG]

    I have managed to get the boundaries working in the top-left camera, when the cameras are 'square' (as in the 4-player layout). However, the other cameras don't track properly at all, and in the rectangular 2-player mode, the top camera still goes too far left-and right. I'm pretty sure I know exactly which line of code is causing the problem... but I don't know what I need to do to fix it...

    Code:
    SpriteRenderer spriteBounds = GameObject.Find("Map").GetComponentInChildren<SpriteRenderer>();
    float leftBound =0;
    float rightBound =0;
    float bottomBound =0;
    float topBound = 0;
     
    if((trackPlayer1 == null))
    {
        camPlayer1.transform.position = this.transform.position;
    }
    else
    {
        float vertExtent = camPlayer1.orthographicSize;
        float horzExtent = vertExtent * Screen.width / Screen.height; //I guess the problem is here... but how do I fix this??
     
        leftBound = (float)(horzExtent - spriteBounds.sprite.bounds.size.x / 2.0f);
        rightBound = (float)(spriteBounds.sprite.bounds.size.x / 2.0f - horzExtent);
        bottomBound = (float)(vertExtent - spriteBounds.sprite.bounds.size.y / 2.0f);
        topBound = (float)(spriteBounds.sprite.bounds.size.y / 2.0f - vertExtent);
     
        camPlayer1.transform.position = new Vector3(Mathf.Clamp(trackPlayer1.transform.position.x, leftBound, rightBound), Mathf.Clamp(trackPlayer1.transform.position.y, bottomBound, topBound), camPlayer1.transform.position.z);
    }
    if((trackPlayer2 == null))
    {
        camPlayer2.transform.position = this.transform.position;
    }
    else
    {
        float vertExtent = camPlayer2.orthographicSize ;
        float horzExtent = vertExtent * Screen.width / Screen.height; //I guess the problem is here... but how do I fix this??
     
        leftBound = (float)(horzExtent - spriteBounds.sprite.bounds.size.x / 2.0f);
        rightBound = (float)(spriteBounds.sprite.bounds.size.x / 2.0f - horzExtent);
        bottomBound = (float)(vertExtent - spriteBounds.sprite.bounds.size.y / 2.0f);
        topBound = (float)(spriteBounds.sprite.bounds.size.y / 2.0f - vertExtent);
     
        camPlayer2.transform.position = new Vector3(Mathf.Clamp(trackPlayer2.transform.position.x, leftBound, rightBound), Mathf.Clamp(trackPlayer2.transform.position.y, topBound, bottomBound), camPlayer2.transform.position.z);
    }
    if((trackPlayer3 == null))
    {
        camPlayer3.transform.position = this.transform.position;
    }
    else
    {
        float vertExtent = camPlayer3.orthographicSize;
        float horzExtent = vertExtent * Screen.width / Screen.height; //I guess the problem is here... but how do I fix this??
     
        leftBound = (float)(horzExtent - spriteBounds.sprite.bounds.size.x / 2.0f);
        rightBound = (float)(spriteBounds.sprite.bounds.size.x / 2.0f - horzExtent);
        bottomBound = (float)(vertExtent - spriteBounds.sprite.bounds.size.y / 2.0f);
        topBound = (float)(spriteBounds.sprite.bounds.size.y / 2.0f - vertExtent);
     
        camPlayer3.transform.position = new Vector3(Mathf.Clamp(trackPlayer3.transform.position.x, leftBound, rightBound), Mathf.Clamp(trackPlayer3.transform.position.y, topBound, bottomBound), camPlayer3.transform.position.z);     
    }
    if((trackPlayer4 == null))
    {
        camPlayer4.transform.position = this.transform.position;
    }
    else
    {
        float vertExtent = camPlayer4.orthographicSize;
        float horzExtent = vertExtent * Screen.width / Screen.height; //I guess the problem is here... but how do I fix this??
     
        leftBound = (float)(horzExtent - spriteBounds.sprite.bounds.size.x / 2.0f);
        rightBound = (float)(spriteBounds.sprite.bounds.size.x / 2.0f - horzExtent);
        bottomBound = (float)(vertExtent - spriteBounds.sprite.bounds.size.y / 2.0f);
        topBound = (float)(spriteBounds.sprite.bounds.size.y / 2.0f - vertExtent);
     
        camPlayer4.transform.position = new Vector3(Mathf.Clamp(trackPlayer4.transform.position.x, leftBound, rightBound), Mathf.Clamp(trackPlayer4.transform.position.y, topBound, bottomBound), camPlayer4.transform.position.z);
    }
    So I'm pretty sure that I need to be checking against the cameras size and relative position on the screen, but I am lost as to exactly what I need to be doing.