Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使rts相机在放大时平滑_C#_Visual Studio_Unity3d - Fatal编程技术网

C# 如何使rts相机在放大时平滑

C# 如何使rts相机在放大时平滑,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,现在我正试图使rts相机在接近地面时通过平移进行缩放。我现在遇到的问题是,我使用鼠标滚轮进行缩放,这让缩放感觉很慢。它看起来像是跳跃了一些Y值,并传送而不是平稳地移动到所需的位置。另外,我想知道如何使相机停止在最小Y值,因为现在发生的是,它停止在22左右,而不是20左右,这是我相机移动的最小Y值 我试着在我的numpad上使用+和-进行缩放,它按照我想要的方式工作(平滑地放大和缩小而不跳过),但并不是所有的玩家都有numpad,我觉得它更适合使用鼠标滚轮进行缩放 { private const

现在我正试图使rts相机在接近地面时通过平移进行缩放。我现在遇到的问题是,我使用鼠标滚轮进行缩放,这让缩放感觉很慢。它看起来像是跳跃了一些Y值,并传送而不是平稳地移动到所需的位置。另外,我想知道如何使相机停止在最小Y值,因为现在发生的是,它停止在22左右,而不是20左右,这是我相机移动的最小Y值

我试着在我的numpad上使用+和-进行缩放,它按照我想要的方式工作(平滑地放大和缩小而不跳过),但并不是所有的玩家都有numpad,我觉得它更适合使用鼠标滚轮进行缩放

{

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;
}