在Unity中将2D相机移动限制在地图边缘

3

图片链接

我已经计算出了地图的边缘,现在需要将相机的边缘控制在地图范围内。

我的代码如下:

using UnityEngine;

公共类相机移动:MonoBehaviour {

public GameObject player;
public GameObject firstMap;
public GameObject lastMap;
private SpriteRenderer spriteRenderer1;
private SpriteRenderer spriteRenderer2;

public float smoothTimeX;
public float smoothTimeY;

public bool Bounds;

private Vector2 minCameraPos;
private Vector2 maxCameraPos;

// Use this for initialization
void Start()
{
    spriteRenderer1 = firstMap.GetComponent<SpriteRenderer>();
    spriteRenderer2 = lastMap.GetComponent<SpriteRenderer>();
}

void FixedUpdate()
{
    transform.position = new Vector3(player.transform.position.x, player.transform.position.y, transform.position.z);
}

void Update()
{
    Vector3 minCameraEdge = Camera.main.ViewportToWorldPoint(new Vector3(0, 0.5f, Camera.main.nearClipPlane)); // left edge of my camera in x
    Vector3 maxCameraEdge = Camera.main.ViewportToWorldPoint(new Vector3(1, 0.5f, Camera.main.nearClipPlane)); // right edge of my camera in x
    Vector3 minCameraHeight = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0, Camera.main.nearClipPlane)); // bottom edge of my camera in y
    Vector3 maxCameraHeight = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 1, Camera.main.nearClipPlane)); // top edge of my camera in y
    Debug.DrawLine(minCameraEdge, maxCameraEdge, Color.green); //use this to see the left & right edges of the camera update each frame
    Debug.DrawLine(minCameraHeight, maxCameraHeight, Color.green); //use this to see the top & bottom edges of the camera update each frame
    if (Bounds)
    {
        if (minCameraEdge.x < -spriteRenderer1.bounds.extents.x)
            minCameraEdge.x = -spriteRenderer1.bounds.extents.x;
        if (maxCameraEdge.x > spriteRenderer1.bounds.extents.x)
            maxCameraEdge.x = spriteRenderer1.bounds.extents.x;
        if (minCameraHeight.y < -spriteRenderer1.bounds.extents.y)
            minCameraHeight.y = -spriteRenderer1.bounds.extents.y;
        if (maxCameraHeight.y > spriteRenderer1.bounds.extents.y)
            maxCameraHeight.y = spriteRenderer1.bounds.extents.y;
    }
}

}


这可能会对你有所帮助:https://answers.unity.com/questions/174002/what-is-the-relationship-between-camera-size-units.html - derHugo
firstMaplastMap 分别是什么? - derHugo
firstMap是组成我的关卡的第一个精灵,lastMap是组成我的关卡的最后一个精灵。因此,在方程式中,firstMap用于计算第一个地图的左边缘,而lastMap用于计算最后一个地图的右边缘。 - user10231058
1个回答

1

只需为您的第一个和最后一个块添加碰撞器,将图层更改为新图层,在相机上放置一个框碰撞器,设置为其视图大小,然后将其设置为仅与该图层发生碰撞。

您可以使用图层蒙版确保它仅与您刚刚设置的“bounds”图层发生碰撞。

下面的代码仅与第9层发生碰撞。

var layerMask = (1 << 9);

请注意,这同样可以通过碰撞层矩阵轻松设置。
编辑-项目设置-物理(或物理2D)。
在检查器中,您可以看到哪些层与哪些层发生碰撞。如果您要使用此方法而不是代码,则还需要将摄像机设置为自己的层,然后取消其与除“bounds”之外的所有内容的碰撞。
您可以通过选择对象,然后在检查器右上角点击图层,然后添加图层来添加新的物理层。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接