Unity3d 将相机拖动到极限(x、y轴)-单位
我做了一个关于在2D或3D世界地图上进行相机拖动的教程 代码正在运行。如下所示: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=最大宽度; /
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;
}
}
返回距离视图;
}
}