C# 如何使rts相机在放大时平滑
现在我正试图使rts相机在接近地面时通过平移进行缩放。我现在遇到的问题是,我使用鼠标滚轮进行缩放,这让缩放感觉很慢。它看起来像是跳跃了一些Y值,并传送而不是平稳地移动到所需的位置。另外,我想知道如何使相机停止在最小Y值,因为现在发生的是,它停止在22左右,而不是20左右,这是我相机移动的最小Y值 我试着在我的numpad上使用+和-进行缩放,它按照我想要的方式工作(平滑地放大和缩小而不跳过),但并不是所有的玩家都有numpad,我觉得它更适合使用鼠标滚轮进行缩放 {C# 如何使rts相机在放大时平滑,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,现在我正试图使rts相机在接近地面时通过平移进行缩放。我现在遇到的问题是,我使用鼠标滚轮进行缩放,这让缩放感觉很慢。它看起来像是跳跃了一些Y值,并传送而不是平稳地移动到所需的位置。另外,我想知道如何使相机停止在最小Y值,因为现在发生的是,它停止在22左右,而不是20左右,这是我相机移动的最小Y值 我试着在我的numpad上使用+和-进行缩放,它按照我想要的方式工作(平滑地放大和缩小而不跳过),但并不是所有的玩家都有numpad,我觉得它更适合使用鼠标滚轮进行缩放 { private const
private const int levelArea=100;
私有常量int scrollArea=25;
私有常量int scrollSpeed=25;
私有常数int dragSpeed=70;
私有常数int zoomSpeed=50;
//距地面的最大/最小缩放距离
公共整数zoomMin=20;
公共int zoomMax=120;
私人建筑内速度=40;
//摄像机的最小/最大角度
私有常数int panAngleMin=30;
panAngleMax的私有常数=90;
无效更新()
{
//此帧的初始摄影机平移。
var转换=向量3.0;
//放大或缩小
var zoomDelta=Input.GetAxis(“鼠标滚轮”)*zoomSpeed*Time.deltaTime;
如果(zoomDelta!=0)
{
平移-=向量3.up*缩放速度*缩放delta;
}
//如果放大到接近地面或只是缩小,则开始平移相机。
var pan=transform.eulerAngles.x-zoomDelta*panSpeed;
pan=主夹具(pan、panAngleMin、panAngleMax);
//什么时候开始摇摄相机
如果(zoomDelta<0 | | transform.position.y<(zoomMax-20))
{
transform.eulerAngles=新矢量3(平移,0,0);
}
//使用箭头键移动相机
translation+=新矢量3(Input.GetAxis(“水平”),0,Input.GetAxis(“垂直”);
//用鼠标移动相机
if(Input.GetMouseButton(2))//MMB
{
//按住按钮并拖动相机
平移-=新矢量3(Input.GetAxis(“鼠标X”)*dragSpeed*Time.deltaTime,0,
Input.GetAxis(“鼠标Y”)*dragSpeed*Time.deltaTime);
}
其他的
{
//如果鼠标指针到达屏幕边界,则移动相机
if(Input.mousePosition.x=Screen.width-scrollArea)
{
translation+=Vector3.right*滚动速度*Time.deltaTime;
}
if(Input.mousePosition.yScreen.height-滚动区域)
{
translation+=Vector3.forward*滚动速度*Time.deltaTime;
}
}
//将相机保持在水平和缩放区域内
var desiredPosition=变换位置+平移;
if(desiredPosition.x<-levelArea | | levelArea
}
我想有一个平稳的过渡,从相机现在的位置和所需的位置后,滚动进/出。我还想知道如何使相机停在最小/最大变焦距离,而不是停在靠近它的地方。谢谢你的帮助。摄像机运动的样子:好的,我在这里做三件事。首先,我将建议,如果你使用先进的相机行为,你可能想至少考虑使用。我会亲自带你去看的,但考虑到我在这方面缺乏个人经验,我甚至尝试都可能会对你造成伤害。有很多很好的教程。Youtube和谷歌应该提供 我要做的第二件事是以我能处理的最直接的方式解决你的问题,然后,我们会看看是否能想出更好的方法来解决你的问题 这里的关键是Unity的滚轮输入是非常二进制的。当您检查滚轮轴时,结果直接基于自上次帧更新以来滚轮经历的“单击”次数,但您真正想要的是带有一点give的东西。默认情况下,Unity实际上可以对其大多数轴输入执行此操作:您可能会注意到,如果在默认Unity项目中使用WASD,它会有一种“滞后”,您可以将手指从键上移开,但仍会在几帧内从
Input.GetAxis()
接收正值。这与输入设置中的Gravity
值有关,而input.GetAxisRaw()
实际上是用来完全避免这种情况的。不管出于什么原因,滚轮轴似乎不受轴重力的影响,所以我们必须自己实现类似的功能
//将此属性添加到类定义中(以便在更新之间保持):
专用浮动轮轴=0;
//删除此行:
var zoomDelta=Input.GetAxis(“鼠标滚轮”)*zoomSpeed*Time.deltaTime;
//把这三条新的线放在它的位置上:
wheelAxis+=Input.GetAxis(“鼠标滚轮”);
wheelAxis=数学移动方向(wheelTotal,0f,Time.deltaTime);
var zoomDelta=数学夹具(轮轴,-0.05f,0.05f)*缩放速度*时间增量;
好的,我们在这里做一些事情。每次更新,我们都会将当前的滚轮值添加到wheelAxis
。接下来,我们将当前的Time.deltatime
应用为
private const int levelArea = 100;
private const int scrollArea = 25;
private const int scrollSpeed = 25;
private const int dragSpeed = 70;
private const int zoomSpeed = 50;
// Maximum/minimum zoom distance from the ground
public int zoomMin = 20;
public int zoomMax = 120;
private const int panSpeed = 40;
// Minimal/maximal angles for camera
private const int panAngleMin = 30;
private const int panAngleMax = 90;
void Update()
{
// Init camera translation for this frame.
var translation = Vector3.zero;
// Zoom in or out
var zoomDelta = Input.GetAxis("Mouse ScrollWheel") * zoomSpeed * Time.deltaTime;
if (zoomDelta != 0)
{
translation -= Vector3.up * zoomSpeed * zoomDelta;
}
// Start panning camera if zooming in close to the ground or if just zooming out.
var pan = transform.eulerAngles.x - zoomDelta * panSpeed;
pan = Mathf.Clamp(pan, panAngleMin, panAngleMax);
// When to start panning up the camera
if (zoomDelta < 0 || transform.position.y < (zoomMax -20))
{
transform.eulerAngles = new Vector3(pan, 0, 0);
}
// Move camera with arrow keys
translation += new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
// Move camera with mouse
if (Input.GetMouseButton(2)) // MMB
{
// Hold button and drag camera around
translation -= new Vector3(Input.GetAxis("Mouse X") * dragSpeed * Time.deltaTime, 0,
Input.GetAxis("Mouse Y") * dragSpeed * Time.deltaTime);
}
else
{
// Move camera if mouse pointer reaches screen borders
if (Input.mousePosition.x < scrollArea)
{
translation += Vector3.right * -scrollSpeed * Time.deltaTime;
}
if (Input.mousePosition.x >= Screen.width - scrollArea)
{
translation += Vector3.right * scrollSpeed * Time.deltaTime;
}
if (Input.mousePosition.y < scrollArea)
{
translation += Vector3.forward * -scrollSpeed * Time.deltaTime;
}
if (Input.mousePosition.y > Screen.height - scrollArea)
{
translation += Vector3.forward * scrollSpeed * Time.deltaTime;
}
}
// Keep camera within level and zoom area
var desiredPosition = transform.position + translation;
if (desiredPosition.x < -levelArea || levelArea < desiredPosition.x)
{
translation.x = 0;
}
if (desiredPosition.y < zoomMin || zoomMax < desiredPosition.y)
{
translation.y = 0;
}
if (desiredPosition.z < -levelArea || levelArea < desiredPosition.z)
{
translation.z = 0;
}
// Move camera parallel to world axis
transform.position += translation;
}