C# 统一平滑二维水平变换
目前,我有一个手机脚本,屏幕上只有一个球,当你触到球的左边时,它会向左移动,当你触到球的右边时,它会向右移动。然而,当它移动时,它是不平滑的,除非我降低它移动多少的浮动(这导致它太慢)。如何在运动平稳的同时保持快速的翻译速度C# 统一平滑二维水平变换,c#,unity3d,C#,Unity3d,目前,我有一个手机脚本,屏幕上只有一个球,当你触到球的左边时,它会向左移动,当你触到球的右边时,它会向右移动。然而,当它移动时,它是不平滑的,除非我降低它移动多少的浮动(这导致它太慢)。如何在运动平稳的同时保持快速的翻译速度 if (Input.touchCount > 0) { Touch touch = Input.GetTouch(0); var point = Camera.main.ScreenToWorldPoint(new Vecto
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
var point = Camera.main.ScreenToWorldPoint(new Vector3(touch.position.x, touch.position.y,
transform.position.z - Camera.main.transform.position.z));
float dx = point.x - transform.position.x;
if (point.x < transform.position.x)
{
//transform.Translate(-15f * Time.deltaTime, 0, 0);
transform.Translate (dx * (1 - Mathf.Pow (0.5f, Time.deltaTime / halfWayTime)), 0, 0);
}
else if (point.x >= transform.position.x + 0.5f)
{
//transform.Translate(15f * Time.deltaTime, 0, 0);
transform.Translate (dx * (1 - Mathf.Pow (0.5f, Time.deltaTime / halfWayTime)), 0, 0);
}
}
if(Input.touchCount>0)
{
Touch-Touch=Input.GetTouch(0);
var point=Camera.main.ScreenToWorldPoint(新矢量3(touch.position.x,touch.position.y,
transform.position.z-Camera.main.transform.position.z);
float dx=point.x-transform.position.x;
if(点x<变换位置x)
{
//transform.Translate(-15f*Time.deltaTime,0,0);
transform.Translate(dx*(1-Mathf.Pow(0.5f,Time.deltaTime/halfWayTime)),0,0;
}
else if(点x>=变换位置x+0.5f)
{
//transform.Translate(15f*Time.deltaTime,0,0);
transform.Translate(dx*(1-Mathf.Pow(0.5f,Time.deltaTime/halfWayTime)),0,0;
}
}
这会创建一个开始很快,但最后会变慢的运动模式,并且可以随时编辑targetXhalfWayTime
是对象将完成其到目标的一半路径的时间,如果为0.1,则在0.1s内,它将移动初始距离的50%,0.2s-75%,0.3s-87.5%,依此类推
顺便说一下,您可以修改此代码以使用所有坐标:
void Update () {
transform.position = Vector3.Lerp (
target,
transform.position,
Mathf.Pow (0.5f, Time.deltaTime / halfWayTime)
);
}
这很有效,但只沿负x轴,在正方向,它似乎跳了很多。你知道为什么>它应该以相同的方式在两个方向上工作吗@马特,你有没有把代码改成相反的方向?如果是,你不应该。请告诉我你是如何设置targetX的,也许是因为targetX,我计算出用户手指触摸的点,然后计算出它相对于世界而不是屏幕的位置,我知道这很好。我没有更改另一个方向的代码。我将更新我的问题以显示新代码。只需删除不必要的if语句就可以了!谢谢你的帮助!
void Update () {
transform.position = Vector3.Lerp (
target,
transform.position,
Mathf.Pow (0.5f, Time.deltaTime / halfWayTime)
);
}