团结:玩家在没有任何此类代码的情况下向上移动

时间:2018-06-19 13:31:14

标签: c# animation unity3d scripting

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

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'键或'downArrow'时,玩家按应有的方式移动-z,但具有讽刺意味的是,他也沿+ y轴移动。为了确保没有y轴功能,我尝试将跳转功能添加为注释,但仍然采用相同的方式。我认为这可能是某些特定于字符的问题,因此我尝试将代码添加到多维数据集(认为这是我的动画错误),但在任何时候都没有帮助。我确保字符控制器设置得很好(对撞机和东西);我已经附上了截图。 请帮忙! 预先感谢。

Screenshot

3 个答案:

答案 0 :(得分:2)

问题已经在这里被几个人指出,但是看来您仍然不理解该问题,从您的反应中得出结论。

此行将始终使您的角色向上移动。

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

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

如果您想在代码中使用强制,那么我建议遵循以下步骤:

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

  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

答案 1 :(得分:1)

让我猜..您的角色以大约摄像机当前的向下倾斜度向上移动?

以您的代码为例,例如,如果您的Camera为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 );

答案 2 :(得分:0)

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

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

您必须验证是否已将每个变量计算为期望值:

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

每个都会影响moveDirection.y的最终值。验证完每个单独的值后,最终的y值对您就有意义了。如果这些值都不是您期望的值,则说明该变量的计算存在错误。

打猎愉快!