我正在为我的角色创建一个移动函数(我已经做了很多次,但是这次它不能正常工作),这是我的代码:
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轴功能,我尝试将跳转功能添加为注释,但仍然采用相同的方式。我认为这可能是某些特定于字符的问题,因此我尝试将代码添加到多维数据集(认为这是我的动画错误),但在任何时候都没有帮助。我确保字符控制器设置得很好(对撞机和东西);我已经附上了截图。 请帮忙! 预先感谢。
答案 0 :(得分:2)
问题已经在这里被几个人指出,但是看来您仍然不理解该问题,从您的反应中得出结论。
此行将始终使您的角色向上移动。
moveDirection.y = moveDirection.y + (Physics.gravity.y * Time.deltaTime * gravityScale);
您正在尝试结合使用重力(这是一种力)来操纵变换。在Unity中,您可以选择两者之一,而不是两者都选择。这将导致不希望的且难以修复的结果。
如果您想在代码中使用强制,那么我建议遵循以下步骤:
为角色添加一个RigidBody。选中“使用重力”复选框。
通过调用在控制器脚本中获取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
值对您就有意义了。如果这些值都不是您期望的值,则说明该变量的计算存在错误。
打猎愉快!