将相机绑定到地图

时间:2015-12-26 18:47:51

标签: c# unity3d camera

我有一个团结的2D游戏,我有一个跟随我的主角的相机 目前,当我将角色向左移动时,我可以看到地图之外的内容,如下所示:

map out of bounds

说地图大小是15X15。我有一个脚本生成大小为1X1的15X15块,意味着地图边界是(-1,-1) - > (15,15)。

我想要完成两件事:
1)让相机不要离开地图边界
2)当地图尺寸比相机小时,请让相机改变尺寸。

第2点的例子

地图是5列15行,因此与相机相比非常窄,如下所示:

map narrow

甚至10列和3行,如下所示:

map small

我希望相机的尺寸能够改变,因此它不会比地图更宽或更高。

我该怎么做这两件事?

This is the github to the current scripts in the gameCameraController脚本是添加应该是

的地方

1 个答案:

答案 0 :(得分:1)

正交尺寸定义垂直尺寸的一半,水平尺寸基于纵横比。

从那里你可以定义当居中时应该是最大值。

下面的脚本可以帮到你。只要您的级别是矩形(显然包括方形),它就会很好:

public float speed = 2f;
public Transform min;
public Transform max;
private float aspect;
private float maxSize;

private void Start () 
{
    this.aspect = Camera.main.aspect;
    this.maxSize = max.position.x <= max.position.y ? max.position.x /2f / this.aspect :max.position.y / 2f;
}

private void Update () 
{
    float size = Input.GetAxis ("Mouse ScrollWheel");
    Camera.main.orthographicSize += size;
    if (Camera.main.orthographicSize > maxSize) 
    {
        Camera.main.orthographicSize = maxSize;
    }

    float x = Input.GetAxis ("Horizontal");
    float y = Input.GetAxis ("Vertical");

    Vector3 position = this.transform.position;
    position.x += x * Time.deltaTime * this.speed;
    position.y += y * Time.deltaTime * this.speed;
    float orthSize = Camera.main.orthographicSize;

    if (position.x < (this.min.position.x + orthSize * this.aspect)) 
    {
        position.x = this.min.position.x + orthSize * this.aspect;
    } 
    else if (position.x > (this.max.position.x - orthSize * this.aspect)) 
    {
        position.x = this.max.position.x - orthSize * this.aspect;
    }
    if (position.y < (this.min.position.y + orthSize))
    {
        position.y = this.min.position.y + orthSize;
    }
    else if(position.y > (this.max.position.y - orthSize)) 
    {
        position.y = this.max.position.y - orthSize;
    }
    this.transform.position = position;
}

这个想法是你在左下角和右上角有两个空的游戏对象。左下角被拖入最小值,右上角被拖入最大值。速度变量就是摄像机转换的速度。它附在相机对象上。相机的最小尺寸没有限制,但你可以做到。

关键在于你为自己的项目做到这一点,因为这更通用。

其余的只是考虑相机位置,当前大小和宽高比(您无法在运行时更改它,或者您必须修改代码)。

编辑: 如果您希望将相机缩放到移动范围,请删除关于尺寸的第一行,并在获得水平/垂直移动后添加以下内容:

if (x != 0f || y != 0f) {
    Camera.main.orthographicSize = Mathf.MoveTowards (Camera.main.orthographicSize, largeSize,  Time.deltaTime);
} else {
    Camera.main.orthographicSize = Mathf.MoveTowards (Camera.main.orthographicSize, size, Time.deltaTime);
}

考虑声明size,largeSize变量并根据需要进行设置。