Unity3d 将相机拖动到极限(x、y轴)-单位

Unity3d 将相机拖动到极限(x、y轴)-单位,unity3d,camera,drag,Unity3d,Camera,Drag,我做了一个关于在2D或3D世界地图上进行相机拖动的教程 代码正在运行。如下所示: void Update\u CameraDrag() { if(Input.GetMouseButtonUp(0)) { Log(“取消相机拖动”); CancelUpdateFunc(); 回来 } //现在,我们需要的只是摄像头控制 Vector3 hitPos=鼠标地平面(输入.鼠标位置); //浮动最大宽度=10; //如果(hitPos.x>maxWidth) //{ //hitPos.x=最大宽度; /

我做了一个关于在2D或3D世界地图上进行相机拖动的教程

代码正在运行。如下所示:

void Update\u CameraDrag()
{
if(Input.GetMouseButtonUp(0))
{
Log(“取消相机拖动”);
CancelUpdateFunc();
回来
}
//现在,我们需要的只是摄像头控制
Vector3 hitPos=鼠标地平面(输入.鼠标位置);
//浮动最大宽度=10;
//如果(hitPos.x>maxWidth)
//{
//hitPos.x=最大宽度;
//}
Vector3 diff=lastMouseGroundPlanePosition-hitPos;
Log(diff.x+Space.World);
Camera.main.transform.Translate(diff,Space.World);
lastMouseGroundPlanePosition=hitPos=MouseToGroundPlane(输入.mousePosition);
}
现在我的问题是,您可以将未复制的文件拖动到任何方向。 我更愿意定义x轴和y轴上的边界。 基本上是相机的最大值。如果相机将超过这些值,其位置值将设置为给定的最大值。
不幸的是,我不确定它是如何工作的,特别是因为教程将所有内容都设置为与Space.World相关的,我甚至不确定这是什么。我的意思是,我知道“diff”是指当前位置和新位置之间相对于空间的变化,然后相机相应地移动。我只想定义一个相机无法超过的最大值。你知道怎么做吗。不幸的是,我仍在学习——这对我来说有点难,我希望能得到帮助。

如果您要记录相机在变量中的X和Y位置,并使用MathF函数。即

如果您有一张100(x)x150(y)单位的地图,您可以使用

xPositionOfCamera = Mathf.Clamp(xPositionOfCamera, -50, 50);
yPositionOfCamera = Mathf.Clamp(YPositionOfCamera, -75, 75);

我不能100%确定这是否是您想要它做的,但这是我将如何限制它。

我为我的游戏编写了一个简单可靠的脚本,用于处理相机拖动和滑动以获得任何相机纵横比。每个人都可以轻松地使用此代码:)只需调整xBoundWorld和yBoundWorld的值

using UnityEngine;

public class CameraDragController : MonoBehaviour
{
    [SerializeField] private Vector2 xBoundWorld;
    [SerializeField] private Vector2 yBoundWorld;
    [SerializeField] public bool HorizentalDrag = true;
    [SerializeField] public bool VerticalDrag = true;
    [SerializeField] public float speedFactor = 10;

    private float leftLimit;
    private float rightLimit;
    private float topLimit;
    private float downLimit;

    public bool allowDrag = true;
    private void Start()
    {
        CalculateLimitsBasedOnAspectRatio();
    }

    public void UpdateBounds(Vector2 xBoundNew, Vector2 yBoundNew)
    {
        xBoundWorld = xBoundNew;
        yBoundWorld = yBoundNew;
        CalculateLimitsBasedOnAspectRatio();
    }

    private void CalculateLimitsBasedOnAspectRatio()
    {
        leftLimit = xBoundWorld.x - Camera.main.ViewportToWorldPoint(new Vector3(0, 0, 0)).x;
        rightLimit = xBoundWorld.y - Camera.main.ViewportToWorldPoint(new Vector3(1, 0, 0)).x;
        downLimit = yBoundWorld.x - Camera.main.ViewportToWorldPoint(new Vector3(0, 0, 0)).y;
        topLimit = yBoundWorld.y - Camera.main.ViewportToWorldPoint(new Vector3(0, 1, 0)).y;
    }

    Vector3 lastPosView; // we use viewport because we don't want devices pixel density affect our swipe speed
    private void LateUpdate()
    {
        if (allowDrag)
        {
            if (Input.GetMouseButtonDown(0))
            {
                lastPosView = Camera.main.ScreenToViewportPoint(Input.mousePosition);
            }
            else if (Input.GetMouseButton(0))
            {
                var newPosView = Camera.main.ScreenToViewportPoint(Input.mousePosition);
                var cameraMovment = (lastPosView - newPosView) * speedFactor;
                lastPosView = newPosView;

                cameraMovment = Limit2Bound(cameraMovment);

                if (HorizentalDrag)
                    Camera.main.transform.Translate(new Vector3(cameraMovment.x, 0, 0));
                if (VerticalDrag)
                    Camera.main.transform.Translate(new Vector3(0, cameraMovment.y, 0));
            }
        }
    }

    private Vector3 Limit2Bound(Vector3 distanceView)
    {
        if (distanceView.x < 0) // Check left limit
        {
            if (Camera.main.transform.position.x + distanceView.x < leftLimit)
            {
                distanceView.x = leftLimit - Camera.main.transform.position.x;
            }
        }
        else // Check right limit
        {
            if (Camera.main.transform.position.x + distanceView.x > rightLimit)
            {
                distanceView.x = rightLimit - Camera.main.transform.position.x;
            }
        }

        if (distanceView.y < 0) // Check down limit
        {
            if (Camera.main.transform.position.y + distanceView.y < downLimit)
            {
                distanceView.y = downLimit - Camera.main.transform.position.y;
            }
        }
        else // Check top limit
        {
            if (Camera.main.transform.position.y + distanceView.y > topLimit)
            {
                distanceView.y = topLimit - Camera.main.transform.position.y;
            }
        }

        return distanceView;
    }
}
使用UnityEngine;
公共类CameraDragController:单行为
{
[SerializeField]私有向量2 xBoundWorld;
[SerializeField]私有向量2 yBoundWorld;
[SerializeField]public bool HorizentalDrag=true;
[SerializeField]public bool VerticalDrag=true;
[SerializeField]公共浮动速度因子=10;
私人浮动限制;
私人浮动权利限制;
私人浮动上限;
私人浮动下线;
公共bool allowDrag=true;
私有void Start()
{
CalculateLimitsBasedOnAspectRatio();
}
public void UpdateBounds(Vector2 xBoundNew、Vector2 yBoundNew)
{
xBoundWorld=xBoundNew;
yBoundWorld=yBoundNew;
CalculateLimitsBasedOnAspectRatio();
}
私有void CalculateLimitsBasedOnAspectRatio()
{
leftLimit=xBoundWorld.x-Camera.main.ViewportToWorldPoint(新矢量3(0,0,0)).x;
rightLimit=xBoundWorld.y-Camera.main.ViewportToWorldPoint(新矢量3(1,0,0)).x;
downLimit=yBoundWorld.x-Camera.main.ViewportToWorldPoint(新矢量3(0,0,0)).y;
topLimit=yBoundWorld.y-Camera.main.ViewportToWorldPoint(新矢量3(0,1,0)).y;
}
Vector3 lastPosView;//我们使用viewport是因为我们不希望设备像素密度影响我们的滑动速度
私有更新()
{
if(allowDrag)
{
if(Input.GetMouseButtonDown(0))
{
lastPosView=Camera.main.ScreenToViewportPoint(Input.mousePosition);
}
else if(Input.GetMouseButton(0))
{
var newPosView=Camera.main.ScreenToViewportPoint(Input.mousePosition);
var cameraMovment=(lastPosView-newPosView)*速度因子;
lastPosView=newPosView;
cameraMovment=Limit2Bond(cameraMovment);
if(水平方向)
Camera.main.transform.Translate(新矢量3(cameraMovment.x,0,0));
if(垂直阻力)
Camera.main.transform.Translate(新矢量3(0,cameraMovment.y,0));
}
}
}
专用Vector3 Limit2Bond(Vector3距离视图)
{
if(distanceView.x<0)//检查左极限
{
if(Camera.main.transform.position.x+distanceView.xrightLimit)
{
distanceView.x=rightLimit-Camera.main.transform.position.x;
}
}
if(distanceView.y<0)//检查下限
{
if(Camera.main.transform.position.y+distanceView.ytopLimit)
{
distanceView.y=topLimit-Camera.main.transform.position.y;
}
}
返回距离视图;
}
}