角色控制器不再掉落

问题描述 投票:0回答:1

这个问题可能已经在某个地方被问过并得到了回答,但我在 StackOverflow 上没有看到提到这样的情况。

问题:几天后,我的游戏对象附加了一个角色控制器组件,它们不再服从重力了。它们可以按预期在 X 和 Z 上移动,但 在任何情况下都不会掉落到地面。

我不认为问题出在我制作的脚本上,因为我用一个完全没有任何代码的对象进行了测试,但它仍然卡在空中。我以为这是我只在一个项目中意外修改的属性,但事实证明该问题影响了我的所有 Unity 项目。

我应该重新安装 Unity,还是从头开始重新创建所有项目?

“第三人称玩家”对象是一个空物体,圆柱体和头部是它的父级。

编辑:根据 amitklein 的要求,这是视图和检查器的图像:

[View and Inspector image

编辑2:根据reddit上的询问,这是移动脚本:

[代码]

// Character Controller
public CharacterController devonController;

//Values and movement tools
public float walkSpeed = 4.0f;
public float unchargedJumpForce = 10.0f;
public float chargedJumpForce;
public Vector3 floorMotionVector;
public Vector3 jumpVector;
public float Gravity = -9.81f;
void Start()
{
    devonController = GetComponent<CharacterController>();
}

void Update()
{
    float horizontal = Input.GetAxisRaw("Horizontal");
    float vertical = Input.GetAxisRaw("Vertical");

    floorMotionVector = new Vector3(horizontal, 0, vertical).normalized;

    if(floorMotionVector.magnitude >= 0.1f && Input.GetKey(KeyCode.LeftShift))
    {
        devonController.Move(floorMotionVector * (6 * walkSpeed) * Time.deltaTime);
    }

    else
    {
        devonController.Move(floorMotionVector * walkSpeed * Time.deltaTime);
    }
}

[/代码]

unity-game-engine controller game-physics
1个回答
0
投票

您需要自己为CharacterController.Move()函数添加重力。

*注意:如果您使用刚体,则需要以不同的方式创建运动。我不会混合使用 CharacterController 和 Rigidbody 组件。它们的内置功能会发生冲突并给您带来问题。我建议选择其中之一。

对于 CharacterController,在类中创建两个属性,分别称为

private float ySpeed;
public float gravity = 20;

    float horizontal = Input.GetAxisRaw("Horizontal");
    float vertical = Input.GetAxisRaw("Vertical");

    floorMotionVector = new Vector3(horizontal, 0, vertical).normalized;

    ySpeed -= gravity * Time.deltaTime; // Apply a constant gravity every frame
    floorMotionVector.y = ySpeed; // Apply gravity to your movement vector
    
    // update your CharacterController
    CharacterController.Move(MoveInput * Time.deltaTime); 
  • ySpeed
    将单独跟踪您的运动矢量的 Y 轴。这可以让你做重力和跳跃之类的事情。
  • 然后将 ySpeed 应用于您的运动矢量,然后将矢量发送到 CharacterController.Move()。
  • Time.deltaTime 在添加重力时应用,并在将移动向量发送到 Move 函数时再次应用。这使运动与帧速率保持同步。

希望有帮助!快乐编码。

© www.soinside.com 2019 - 2024. All rights reserved.