如何用手动代码替换“ input.getaxis”

时间:2019-06-06 12:12:57

标签: c# unity3d

我需要用我编写的代码统一替换“ input.getaxis(“ Horizo​​ntal”),以便从python文件获取输入。

我试图了解它是如何工作的,但是不幸的是我不太了解它,这是我所做的一些代码,我想知道它是否可以完成工作以及如何进行改进。

private void FixedUpdate()
    var h = hh ;//h is the horizontal axis and hh is the previous value
    var v = vv ;//v is the horizontal axis and vv is the previous value
    if (inout == "W" || inout == "w")
    {
        if (v < 1)
        {
            v += 0.01f * wn; //wn is the multiplication for when the user 
                             //presses the key continously {momentum}
        }
        wn += 1;
        sn = 1;//number of presses
    }
    else if (inout == "S" || inout == "s")
    {
        if (v > (-1))
        {
            v -= 0.01f * sn;
        }
        wn = 1;
        sn += 1;
    }
    else if (inout == "A" || inout == "a")
    {
        if (h > (-1))
        {
            h -= 0.01f*an;
        }
        an += 1;
        dn = 1;
    }
    else if (inout == "D" || inout == "d")
    {
        if (h < 1)
        {
            h += 0.01f * dn;
        }
        an = 1;
        dn += 1;
    }
    //Decaying of the momentum
    if (inout != "W" && inout != "S"&& inout != "w" && inout != "s")
    {
        if (v > 0)
        {
            if (wn>1)
            {
                wn--;
            }
            v -= 0.01f * wn;
        }
        else if (v < 0)
        {
            if (sn>1)
            {
                sn--;
            }
            v += 0.01f * sn;
        }
    }
    else if (inout != "A" && inout != "D"&& inout != "a" && inout != "d")
    {
        if (h > 0)
        {
            if (dn>1)
            {
                dn--;
            }
            h -= 0.01f * dn;
        }
        else if (h < 0)
        {
            if (an>1)
            {
                an--;
            }
            h += 0.01f * an;
        }
    }
    hh = h;
    vv = v;
简而言之,

所有这些代码所做的就是当python文件发送输入“ W”时,例如,它将垂直轴的值增加(0.01)乘以w键的按下次数我们有机会建立动力,因为一旦使用者缓慢按下它,便会逐渐建立起来,然后迅速上升。 衰减部分是当用户释放键时,我们要释放我们建立的所有动量,以便撤消所有操作。

  • 我只想要一个可以描述getaxis如何工作的人
  • 了解此代码是否有效,以及如何对其进行修改以使其更好 还是有更好的方法做到这一点。

2 个答案:

答案 0 :(得分:1)

分离接受输入和移动对象之间的关注点

如果您分开执行任务,则可以使用所需的任何机制替换输入。您可以使用Input.GetAxis进行测试,然后在输出相同的情况下将输入切换为Python。

FixedUpdate由Unity用于物理计算。相反,请接受Update方法中的输入,然后将更改应用于FixedUpdate中启用了物理的对象。

您所做的大部分工作都是通过内置的Unity Physics引擎实现的。为此,请使用Rigidbody组件,而不是直接设置Transform。您仍然可以基于FixedUpdate内部的未输入而恶化,并立即应用所有更改,然后让物理引擎进行实际计算。

关于问题的注释位于问题的底部

  • Input.GetAxis返回一个float,范围是-1到1
  • 一旦您将两个任务分开,您的代码应该自然流淌
  • 由于Input.GetAxis根据操纵杆离中心的距离输出的范围是-1到1,因此0.01是微小的测量值。您必须按100次键才能获得与完全按下控制杆到一侧相同的输出。我将使用更接近-1和1的值,然后乘以Inspector中设置的某个值来产生良好的感觉
  • 对于如何直接从Python向Unity获取输入,我没有答案。这可能取决于它是网络解决方案还是同一台计算机。无论如何,网络解决方案的输出都无关紧要

答案 1 :(得分:1)

使用键盘,Unity的GetAxisRaw("Horizontal")GetAxisRaw("Vertical")为每个轴返回-1、0或1。 GetAxis("Horizontal")GetAxis("Vertical")的值通过使用这些原始输入的算法进行平滑处理。

这是一种可以近似化Unity平滑算法的方法,该方法可以平滑从键盘控制器的输入计算出的原始-1、0或1值:

private float slidingH;
private float slidingV;

private void FixedUpdate()
{
    float h = 0f;
    float v = 0f;
    Vector2 smoothedInput;

    if (inout.ToLower() == "w") 
    {
        v = 1f;
    }
    else if (inout.ToLower() == "s")
    {
        v = -1f;
    }
    else if (inout.ToLower() == "a")
    {
        h = -1f;
    }
    else if (inout.ToLower() == "d")
    {
        h = 1f;
    }

    smoothedInput = SmoothInput(h,v);

    float smoothedH = smoothedInput.x;
    float smoothedV = smoothedInput.y;

}


private Vector2 SmoothInput(float targetH, float targetV)
{
    float sensitivity = 3f;
    float deadZone = 0.001f;

    slidingH = Mathf.MoveTowards(slidingH,
                  targetH, sensitivity * Time.deltaTime);

    slidingV = Mathf.MoveTowards(slidingV ,
                  targetV, sensitivity * Time.deltaTime);

    return new Vector2(
           (Mathf.Abs(slidingH) < deadZone) ? 0f : slidingH ,
           (Mathf.Abs(slidingV) < deadZone) ? 0f : slidingV );
}
.

这是Unity QA网站上this answer by fafase中代码的修改版本。

作为旁注,根据您的需要,您可能希望添加一种从控制器发送多个同时按下的键的方法。