微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将相机限制在等距的2D游戏中

如何解决如何将相机限制在等距的2D游戏中

我正在开发2D等距游戏,就像《帝国时代2》,《 TTD》,《闯入突破》等等。我正在使用Unity和C#

相关事实:我正在使用等距图块地图

我希望像上面提到的游戏一样,摄像机的限制与地图的边界保持一致,但是我遇到了困难,并且我花了很多时间,因此我开始怀疑自己是否值得使用Isometric Tilemap或执行通常的方法,并在旋转相机的情况下进行常规2D游戏。

这是我的第一个问题:“等距图块地图”真的值得还是用通常的方法更好(带旋转摄像机的非等距2D游戏)?如果是这样,如何在Unity中做到这一点?

尽管如此,我实现的代码如下,但是它有两个错误

  • 如果用户按下向右/向左键和向上/向下箭头键,则相机会卡在firstBasethirdBase
  • 如果相机在边框上移动,可能会逃脱
    void Start(){
        CameraMovement_Limits();
    }

    void CameraMovement_Limits(){
        Vector3 gridOrigin = tilemapFloor.GetCellCenterWorld(tilemapFloor.origin);
        float gridHypotenuse = ((tilemapFloor.size.x - 1) * tilemapFloor.cellSize.y);

        homePlate = gridOrigin + new Vector3(0,-10);
        firstBase = gridOrigin + new Vector3(gridHypotenuse,gridHypotenuse/2,-10);
        secondBase = gridOrigin + new Vector3(0,gridHypotenuse,-10);
        thirdBase = gridOrigin + new Vector3(-gridHypotenuse,-10);
    }

    void Update(){
        CameraDiagonalMovement();
    }

    bool CheckCameraPosition(Vector2 p1,Vector2 p2,Vector2 pos){
        //This is what this function do:
        //find the linear equation for the line formed by 'p1' and 'p2' coordinates
        //insert 'pos' coordinate on the equation and stores the result in 'ind'
        //if 'ind' is positive,it means that 'pos' is above the line
        //if its negative,its above
        //if its zero,its on the line
        //resuming,this funtion tells if 'pos' is above or below a line formet by 'p1' and 'p2'
        float a = (p1.y - p2.y) / (p1.x - p2.x);
        float ind = pos.y - p2.y - (a * (pos.x - p2.x));

        return ind >= 0;
    }

    void CameraDiagonalMovement(){
        Vector3 vecZero = Vector2.zero;
        camPos = (Vector2)transform.position;
        
        //Going to the left
        if(Input.GetAxis("Vertical") < 0){
            if(CheckCameraPosition(homePlate,thirdBase,camPos) && CheckCameraPosition(homePlate,firstBase,camPos)){
                vecZero.y = Input.GetAxis("Vertical");
            }else if(!CheckCameraPosition(homePlate,camPos)){
                vecZero.x = Input.GetAxis("Vertical") * .66f * -1;
                vecZero.y = Input.GetAxis("Vertical") * .33f;
            }else if(CheckCameraPosition(homePlate,camPos) && !CheckCameraPosition(homePlate,camPos)){
                vecZero.x = Input.GetAxis("Vertical") * .66f;
                vecZero.y = Input.GetAxis("Vertical") * .33f;
            }
        }

        //Going to the right
        if(Input.GetAxis("Vertical") > 0){
            if(!CheckCameraPosition(secondBase,camPos) && !CheckCameraPosition(firstBase,secondBase,camPos)){
                vecZero.y = Input.GetAxis("Vertical");
            }else if(CheckCameraPosition(secondBase,camPos)){
                vecZero.x = Input.GetAxis("Vertical") * .66f;
                vecZero.y = Input.GetAxis("Vertical") * .33f;
            }else if(!CheckCameraPosition(secondBase,camPos) && CheckCameraPosition(firstBase,camPos)){
                vecZero.x = Input.GetAxis("Vertical") * .66f * -1;
                vecZero.y = Input.GetAxis("Vertical") * .33f;
            }
        }

        //Going down
        if(Input.GetAxis("Horizontal") < 0){
            if(CheckCameraPosition(homePlate,camPos) && !CheckCameraPosition(secondBase,camPos)){
                vecZero.x = Input.GetAxis("Horizontal");
            }else if(!CheckCameraPosition(homePlate,camPos)){
                vecZero.x = Input.GetAxis("Horizontal") * .66f;
                vecZero.y = Input.GetAxis("Horizontal") * .33f * -1;
            }else if(CheckCameraPosition(homePlate,camPos) && CheckCameraPosition(secondBase,camPos)){
                vecZero.x = Input.GetAxis("Horizontal") * .66f;
                vecZero.y = Input.GetAxis("Horizontal") * .33f;
            }
        }

        //Going up
        if(Input.GetAxis("Horizontal") > 0){
            if(CheckCameraPosition(homePlate,camPos)){
                vecZero.x = Input.GetAxis("Horizontal");
            }else if(CheckCameraPosition(homePlate,camPos)){
                vecZero.x = Input.GetAxis("Horizontal") * .66f;
                vecZero.y = Input.GetAxis("Horizontal") * .33f * -1;
            }else if(!CheckCameraPosition(homePlate,camPos)){
                vecZero.x = Input.GetAxis("Horizontal") * .66f;
                vecZero.y = Input.GetAxis("Horizontal") * .33f;
            }
        }

        Vector3 newPos = new Vector3(vecZero.x,vecZero.y,0);
        transform.position += newPos * veLocity * Time.deltaTime;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。