正在使用检测模拟杆

时间:2017-11-28 09:09:03

标签: unity3d

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' A'和' D'当统一检测到A和D都没有按下时,按键将目标速度暂时设置为m_runSpeed,然后停止。游戏手柄端按预期工作。我显然需要一种更好的方法来确定布尔值,但我没有想法。

在我看来,如果我能够发现使用模拟摇杆我可以做到这一点,但我不认为我走的是正确的方式。

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

1 个答案:

答案 0 :(得分:0)

如果您在水平轴上查看编辑/输入管理器,您会看到默认情况下有两个。一个用于键盘,一个用于操纵杆:

enter image description here

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

另一个选择,如果你想要实现的是两个控件之间类似的速度行为,可能会让它们保持不变,但调整键盘上的灵敏度和死区更像是控制器一。那么你甚至不需要知道使用哪两个,从水平读取的同一行代码应该对两者都相同。