我有一个团结的2D游戏,我有一个跟随我的主角的相机 目前,当我将角色向左移动时,我可以看到地图之外的内容,如下所示:
说地图大小是15X15。我有一个脚本生成大小为1X1的15X15块,意味着地图边界是(-1,-1) - > (15,15)。
我想要完成两件事:
1)让相机不要离开地图边界
2)当地图尺寸比相机小时,请让相机改变尺寸。
第2点的例子
地图是5列15行,因此与相机相比非常窄,如下所示:
甚至10列和3行,如下所示:
我希望相机的尺寸能够改变,因此它不会比地图更宽或更高。
我该怎么做这两件事?
This is the github to the current scripts in the game。 CameraController
脚本是添加应该是
答案 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变量并根据需要进行设置。