【问题标题】:Detecting analog stick is being used检测模拟摇杆正在使用
【发布时间】:2017-11-28 09:09:03
【问题描述】:
private Vector3 GroundVelocity(ref Vector3 vel)
{
    m_animator.SetBool("onGround", true);

    Vector2 input = new Vector2(Input.GetAxis("Horizontal"), 0);

    bool kbRun = Input.GetKey(KeyCode.LeftShift) && m_controller.isGrounded;
    bool gpRun = Mathf.Abs(input.x) > 0.5f && m_controller.isGrounded;
    var sortInputType = (Input.GetKey(KeyCode.A) ^ Input.GetKey(KeyCode.D)) ? kbRun : gpRun;

    float targetSpeed = ((sortInputType) ? m_runSpeed : m_walkSpeed) * input.x;
    m_curSpd = Mathf.SmoothDamp(m_curSpd, targetSpeed, ref m_speedSmoothVelocity, GetModifiedSmoothTime(m_speedSmoothTime * 3) * Time.fixedDeltaTime * m_playerTime);

    m_animSpdPer = Mathf.Lerp(0, 1, m_curSpd);

    vel = new Vector3(m_curSpd, 0, 0);

    return vel;
}

我的角色控制器同时使用游戏手柄和键盘和鼠标配置。以上是我如何获得 CharacterController.Move() 的地面速度。

这个问题是,当我通过“A”和“D”键水平移动时,当统一检测到 A 和 D 都没有按下时,目标速度会暂时设置为 m_runSpeed,然后停止。游戏手柄端按预期工作。我显然需要一种更好的方法来确定布尔值,但我没有想法。

在我看来,如果我可以检测到正在使用的模拟摇杆,我可以这样做,但我认为我的方法不正确。

任何修改或指导的建议都会非常有帮助。谢谢。

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    如果您查看水平轴的 Edit / InputManager,您会看到默认情况下有两个。一个用于键盘,一个用于操纵杆:

    没有什么可以阻止您,例如,将基于键的键重命名为 Horizo​​ntalKeys,然后在您的代码中您可以分别搜索这两个键。这样,如果常规 Horizo​​ntal 有一个非零 Vector2,你就会知道它是使用的控制器变体,如果 Horizo​​ntalKeys 有非零,那么它就是那个。

    另一种选择是,如果您想要实现的两个控件的速度行为相似,则可能会保持原样,但调整键盘上的灵敏度和死区,使其更像控制器一。那么您甚至不需要知道使用了两者中的哪一个,从 Horizo​​ntal 读取的同一行代码应该对两者都具有相同的影响。

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多