Unity3d模拟GetAxis

时间:2015-03-27 00:46:44

标签: input unity3d touch

我试图模拟Input.GetAxis(" Horizo​​ntal")和Input.GetAxis(" Vertical")的加速度,这取决于我触摸的位置屏幕。所以假设我的屏幕中间有一个名为" middle_Object"的对象。我想要做的是,如果我触摸对象的右侧,模拟从0到1逐渐增加Input.GetAxis(" Horizo​​ntal")然后如果我放了我的话手指向左,它快速回到0,然后逐渐减少到-1。基本上将input.getaxis转换为触摸友好版本。我有什么想法可以做到这一点吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

听起来你需要Lerp魔力:)(线性插值)

基本上,如果您在参考点的左侧或右侧(或上方或下方),您想要计算出来。在这种情况下,让我们说屏幕的中心。如果是,请相应地向1或-1移动。

在触摸屏上,这意味着除非您添加“死区”,否则您将永远不会为零,这是一种痛苦,因此您还应该检查距离中心的距离是否太小而无法照顾。

然后,您可以使用Lerp功能以您选择的速度从现在的位置移动到您想要的位置。

以下是一些带有评论的代码,向您展示我是如何做到的。

// for this example, using the actual screen centre as our central point
// change this if you like :)
Vector2 myCentre = new Vector2( Screen.width/2, Screen.height/2 );
Vector2 touchPos = new Vector2( Screen.width/2, Screen.height/2 );

// change this to affect how quickly the number moves toward its destination
float lerpSpeed = 0.3f;

// set this as big or small as you want. I'm using a factor of the screen's size
float deadZone = 0.1f * Mathf.Min( Screen.width, Screen.height );   

public void Update()
{
    Vector2 delta = (Vector2)Input.mousePosition - myCentre;

    // if the mouse is down / a touch is active...
    if( Input.GetMouseButton( 0 ) == true )
    {
        // for the X axis...
        if( delta.x > deadZone )
        {
            // if we're to the right of centre and out of the deadzone, move toward 1
            touchPos.x = Mathf.Lerp( touchPos.x, 1, lerpSpeed );
        }
        else if( delta.x < -deadZone )
        {
            // if we're to the left of centre and out of the deadzone, move toward -1
            touchPos.x = Mathf.Lerp( touchPos.x, -1, lerpSpeed );
        }
        else
        {
            // otherwise, we're in the deadzone, move toward 0
            touchPos.x = Mathf.Lerp( touchPos.x, 0, lerpSpeed );
        }

        // repeat for the Y axis...
        if( delta.y > deadZone )
        {
            touchPos.y = Mathf.Lerp( touchPos.y, 1, lerpSpeed );
        }
        else if( delta.y < -deadZone )
        {
            touchPos.y = Mathf.Lerp( touchPos.y, -1, lerpSpeed );
        }
        else
        {
            touchPos.y = Mathf.Lerp( touchPos.y, 0, lerpSpeed );
        }
    }
    else
    {
        // the mouse is up / no touch recorded, so move both axes toward 0
        touchPos.x = Mathf.Lerp( touchPos.x, 0, lerpSpeed );
        touchPos.y = Mathf.Lerp( touchPos.y, 0, lerpSpeed );
    }

    Debug.Log("TouchPos: " + touchPos );

}