Unity:向播放器控制器添加划线

时间:2019-01-17 16:19:45

标签: c# unity3d 3d

几周来,我一直在努力为我的播放器增加弹奏。我现在有一个有效的脚本,但是当我尝试使用鼠标旋转播放器和相机时,脚本反应异常。当播放器面向Z方向时,播放器正常行走和奔跑,但是一旦我转过身,他就会减速并超慢移动。这是代码:

    void Update () {
    // input
    Vector2 input = new Vector2 (Input.GetAxisRaw ("Horizontal"), Input.GetAxisRaw ("Vertical"));
    Vector2 inputDir = input.normalized;
    bool running = Input.GetKey (KeyCode.LeftShift);

    if (!Input.GetMouseButtonDown(0) || Input.GetKey(KeyCode.JoystickButton2)) {
        Move (inputDir, running);
        Time.timeScale = 1;
    }

    if (Input.GetKeyDown (KeyCode.Space) || Input.GetKeyDown (KeyCode.JoystickButton0)) {
        Jump ();
    }
    // animator
    float animationSpeedPercent = ((running) ? currentSpeed.magnitude / runSpeed : currentSpeed.magnitude / walkSpeed * .5f);


void Move(Vector2 inputDir, bool running) {


        float targetRotation = cameraT.eulerAngles.y;
        transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref turnSmoothVelocity, GetModifiedSmoothTime(turnSmoothTime));


        Vector2 targetSpeed = new Vector2(
            ((running) ? runSpeed : walkSpeed) * inputDir.normalized.x,
            ((running) ? runSpeed : walkSpeed) * inputDir.normalized.y);

        currentSpeed = Vector2.SmoothDamp(currentSpeed, targetSpeed,
               ref speedSmoothVelocity,
               GetModifiedSmoothTime(speedSmoothTime));

        velocityY += Time.deltaTime * gravity;
        Vector3 velocity = (transform.forward * currentSpeed.y) +
               (transform.right * currentSpeed.x) +
               Vector3.up * velocityY;

        controller.Move(velocity * Time.deltaTime);
        currentSpeed = new Vector2(controller.velocity.x, controller.velocity.z);

        if (controller.isGrounded)
        {
            velocityY = 0;
        }
}

1 个答案:

答案 0 :(得分:0)

为了允许玩家使用默认的PlayerController进行扫射,必须进行几次编辑。我不会为您编写代码,但是这是您需要执行的步骤,它们应该相对容易实现:

  1. 首先,您需要注释掉与轮换相关的代码

  2. 然后,您不应将目标速度作为标量浮点数来获取,而应将其计算为Vector2或作为2个独立的浮点数(最好是前者)来计算

    Vector2 targetSpeed = new Vector2(
        ((running) ? runSpeed : walkSpeed) * inputDir.normalized.x,
        ((running) ? runSpeed : walkSpeed) * inputDir.normalized.y);
    
  3. currentSpeed是一个浮点数,它依赖于targetSpeed,但是除了~~调整currentSpeed也成为Vector2之外,您可以计算targetSpeed.magnitude 时使用SmoothDamp 由于在Z上下文和X上下文中都需要速度,因此应该将currentSpeed设为Vector2,幸运的是,已经存在Vector2.SmoothDamp以便于重构。< / strong>

    currentSpeed = Vector2.SmoothDamp(currentSpeed, targetSpeed, 
                       ref speedSmoothVelocity,
                       GetModifiedSmoothTime(speedSmoothTime));
    
  4. 您需要在速度计算中包括X分量。 (请记住,Vector2的{​​{1}}和X分别对应Y上的XZ

    Vector3
  5. 最后,您希望调整Vector3 velocity = (transform.forward * currentSpeed.y) + (transform.right * currentSpeed.x) + Vector3.up * velocityY; 以包括适当的currentSpeedX速度。 这可以简单地通过基于Z而不是Vector3

    计算幅度来完成
    Vector2

顺便说一句,欢迎您使用StackOverflow-将来您要确保包含minimal, verifiable, and complete example,而不仅仅是默认的未修改代码。

如果您证明自己已经做出了自己的努力,人们会更愿意提供帮助。