如何将滑动速度和位置转换为对象速度

时间:2014-09-09 06:56:56

标签: unity3d

我正在开发一个"踢场地"为了教自己Unity 3d的类型游戏。我有我想要的界面和功能,这样游戏就像这样:

enter image description here

我在OnUpdate中使用一些代码来检测鼠标按钮何时被按下(或触摸阶段开始)以及何时释放(或触摸阶段结束)并计算滑动方向,距离和持续时间。我想把这些信息翻译成一个初始速度到#34;启动"足球,但似乎数学稍微超出了我。

我从这样的事情开始:

rigidbody.velocity = new Vector3(
    Mathf.Min(15, swipeDelta.x * .13f),
    Mathf.Min(20, swipeDelta.y * yRatio),
    5 / swipeDuration);

这当然在我的初始分辨率和宽高比方面效果很好,但是一改变其中任何一个就失败了。我希望代码能够获得更高的分辨率和宽高比,或者至少是相对的。上面代码中使用的数字是完全随意的,并且被发现在我基于迭代测试的初始分辨率下产生期望的结果。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我们的想法是获取起点和终点之间的距离和持续时间,并将它们用于速度。

我使用ScreenToWorldPoint来获取从屏幕坐标到世界坐标的鼠标位置,以便计算世界中的距离,而不是屏幕的像素密度或分辨率。

预期的最小/最大值是在进行任何调整之前获得的功率值。要获得良好的值,您可以进行慢/短滑动以及最快的快速扫描。

所需的最小值/最大值是您的任意值,可以产生理想的结果。

您可能需要根据游戏的方向旋转速度。现在向上滑动给出正y值,向右滑动给出正x值。

Vector3 startPos;
float startTime;

void Update () 
{
    if (Input.GetMouseButtonDown(0))
    {
        //Store initial values
        startPos = Input.mousePosition;
        startTime = Time.time;
    }

    if (Input.GetMouseButtonUp(0))
    {
        //Get end values
        Vector3 endPos = Input.mousePosition;
        float endTime = Time.time;

        //Mouse positions distance from camera. Might be a better idea to use the cameras near plane
        startPos.z = 0.1f
        endPos.z = 0.1f

        //Makes the input pixel density independent
        startPos = Camera.main.ScreenToWorldPoint(startPos);
        endPos = Camera.main.ScreenToWorldPoint(endPos);

        //The duration of the swipe
        float duration = endTime - startTime;

        //The direction of the swipe
        Vector3 dir = endPos - startPos;

        //The distance of the swipe
        float distance = dir.magnitude;

        //Faster or longer swipes give higher power
        float power = distance / duration;

        //expected values are what power you get when you try 
        //desired values are what you want
        //you might want these as public values so they can be set from the inspector
        const float expectedMin = 50;
        const float expectedMax = 60;
        const float desiredMin = 15;
        const float desiredMax = 20;

        //Measure expected power here
        Debug.Log(power);

        //change power from the range 50...60 to 0...1
        power -= expectedMin;
        power /= expectedMax - expectedMin;

        //clamp value to between 0 and 1
        power = Mathf.Clamp01(power);

        //change power to the range 15...20
        power *= desiredMax - desiredMin;
        power += desiredMin;

        //take the direction from the swipe. length of the vector is the power
        Vector3 velocity = (transform.rotation * dir).normalized * power
    }