【问题标题】:Unity: player moves up without any such codeUnity:玩家在没有任何此类代码的情况下向上移动
【发布时间】:2018-11-28 11:56:54
【问题描述】:

我正在为我的角色创建一个移动函数(我已经做了很多次,但这次它不能正常工作),这是我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(CharacterController))]
[RequireComponent(typeof(Animator))]
public class Movement : MonoBehaviour {

    public CharacterController controller;
    public float moveSpeed;
    public float jumpForce;
    public float gravityScale;
    public Animator animator;

    private bool shiftPressed = false;
    private void Update()
    {
        if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
            shiftPressed = true;
        else
            shiftPressed = false;

        if(shiftPressed)
        {
            moveSpeed = 20f;
        } else
        {
            moveSpeed = 10f;
        }

        Vector3 moveDirection = new Vector3(Input.GetAxisRaw("Horizontal") * moveSpeed, 0.0f, Input.GetAxis("Vertical") * moveSpeed);

        if(Input.GetKey(KeyCode.Space) && controller.isGrounded)
        {
            moveDirection.y = jumpForce;
        }

        if (moveDirection != Vector3.zero)
            animator.SetFloat("Speed", moveSpeed);
        else if (moveDirection == Vector3.zero)
            animator.SetFloat("Speed", 0f);
        else if (moveDirection != Vector3.zero)
            animator.SetFloat("Speed", moveSpeed);

        if(moveDirection != Vector3.zero)
            transform.rotation = Quaternion.LookRotation(moveDirection);

        moveDirection = Camera.main.transform.TransformDirection(moveDirection);
        moveDirection.y =  moveDirection.y + (Physics.gravity.y * Time.deltaTime * gravityScale);
        controller.Move(moveDirection * Time.deltaTime);
    }
}

正如你所见,除了跳转函数之外,在 y 轴上没有任何函数可以向上移动。神秘的是,当我按下“S”键或“向下箭头”时,玩家会按照他应该的方式移动 -z,但具有讽刺意味的是,他也会在 +y 轴上移动。为确保没有 y 轴功能,我尝试将跳转功能设为注释,但仍然采用相同的方式。我认为这可能是一些特定于角色的问题,所以我尝试将代码添加到立方体(认为这是我的动画错误),但它在任何时候都没有帮助。我确保角色控制器设置得很好(对撞机和其他东西);我附上了截图。 请帮忙! 提前致谢。

【问题讨论】:

  • 最后一个moveDirection.y 分配可能应该在您调用TransformDirection 之前
  • 或者应该是-而不是+? (Physics.gravity.ygravityScale的值是多少?)
  • 这使玩家在 x 上旋转 -90 度。由于真正翻转的力量黛西
  • +10 重力比例和physics.gravity的默认9.8
  • 那么你在这里不断增加moveDirection.y...你为什么不指望这会提升你的角色呢?

标签: c# animation unity3d scripting


【解决方案1】:
moveDirection.y =  moveDirection.y + (Physics.gravity.y * Time.deltaTime * gravityScale);

此行始终设置“y”,并被修改/设置为最终语句之前的最后一个函数。在这里,您应该验证和验证所有影响“y”最终计算的因素。

您必须验证每个变量的计算结果是否符合您的预期值:

moveDirection.y
Physics.gravity.y
Time.deltaTime
gravityScale

每个都会影响moveDirection.y 的最终值。一旦您验证了每个单独的值,最终的 y 值对您来说是有意义的。如果这些值中的任何一个不是您所期望的,那么您在该变量的计算中存在错误。

狩猎愉快!

【讨论】:

    【解决方案2】:

    这里已经有好几个人提出了这个问题,但是从你的反应来看,你似乎还是不明白这个问题。

    这条线总是会让你的角色向上移动。

    moveDirection.y =  moveDirection.y + (Physics.gravity.y * Time.deltaTime * gravityScale);
    

    您正在尝试将重力(这是一种力)与操纵变换结合使用。在 Unity 中,您可以选择两者之一,而不是两者。这将导致不受欢迎且难以修复的结果。

    如果你想在你的代码中使用强制,那么我建议如下:

    1. 为你的角色添加一个刚体。选中“使用重力”复选框。

    2. 在控制器脚本中调用 RigidBody 并对其施加力以移动它。

      var rb = getComponent<RigidBody>();
      rb.AddForce(10f);
      

    请注意,如果您添加强制,您可以在 Update 方法中连续添加它,或者通过传递第二个参数“forcemode”只添加一次。

    rb.AddForce(10, ForceMode.Impulse); // add instant force, using mass
    // Or
    rb.AddForce(10, ForceMode.VelocityChange); // add instant force, ignoring mass
    // Or
    rb.AddForce(10, ForceMode.Force); // add continuous force, using mass
    // Or
    rb.AddForce(10, ForceMode.Acceleration); // add continous force, ignoring mass
    

    【讨论】:

      【解决方案3】:

      让我猜猜……你的角色一直向上移动,大约是当前摄像机的向下坡度?

      就您的代码而言,例如,如果您的相机是 Vector3(10,0,0),并且您尝试移动 Vector3(5,0,5),则您已要求移动矢量为根据相机变换变换到世界空间。因此,您的新运动矢量将类似于 Vector3(5,1,5)。这应该可以解决问题:

      var worldDirection = Camera.main.transform.TransformDirection(moveDirection);
      moveDirection =  new Vector3(
        worldDirection.x,
        moveDirection.y + (Physics.gravity.y * Time.deltaTime * gravityScale),
        worldDirection.z );
      

      【讨论】:

      • 在这种情况下使用“你的”。好点子!在这种情况下,我所做的是获取相机方向,将其放入 Vector3 变量中,将 y 设置为 0,然后对其进行归一化。除非您从上方看 90°,否则该方法有效。
      • 在这里我通常会注意到你和你的违规行为!我还注意到我没有很好地解释这个问题,TransformDirection 不受位置的影响。所以 y 分量来自相机略微向下的事实。因此,输入 TransformDirection 的水平方向实际上会导致返回的方向略微向上。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多