C# 运动脚本赢得';I don’我的角色一转身,我就不前进

C# 运动脚本赢得';I don’我的角色一转身,我就不前进,c#,unity3d,C#,Unity3d,我把这个移动脚本附在我的播放器上,但是每当我旋转90度,如果我按w,它就不会前进,现在我知道这是因为z是不同的,因为我移动了相机,但是我如何修复它 using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(Rigidbody))] public class PlayerMovement : MonoBehaviour { public Rigid

我把这个移动脚本附在我的播放器上,但是每当我旋转90度,如果我按w,它就不会前进,现在我知道这是因为z是不同的,因为我移动了相机,但是我如何修复它

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class PlayerMovement : MonoBehaviour
{

public Rigidbody rb;
float forwardForce = 500f;
float sidewaysForce = 500f;
float jumpForce = 100f;
// Start is called before the first frame update
// Update is called once per frame
public Vector3 jump;

public bool isGrounded;
void Start()
{
    rb = GetComponent<Rigidbody>();
}
void OnCollisionStay()
{
    isGrounded = true;
}


void FixedUpdate()
{
    if (Input.GetKey("d"))
    {
        rb.AddForce(sidewaysForce * Time.deltaTime, 0, 0);
    }
    if (Input.GetKey("a"))
    {
        rb.AddForce(-sidewaysForce * Time.deltaTime, 0, 0);
    }
    if (Input.GetKey("w"))
    {
        rb.AddForce(0, 0, forwardForce * Time.deltaTime);
    }
    if (Input.GetKey("s"))
    {
        rb.AddForce(0, 0, -forwardForce * Time.deltaTime);
    }

    if (Input.GetKey("space") && isGrounded)
    {

        rb.AddForce(0, jumpForce, 0);
        isGrounded = false;

    }
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
[RequiredComponent(类型)(刚体))]
公共类玩家运动:单一行为
{
公共刚体;
浮力=500f;
浮子侧向力=500f;
浮力=100f;
//在第一帧更新之前调用Start
//每帧调用一次更新
公共矢量3跳跃;
公共学校停课;
void Start()
{
rb=GetComponent();
}
void OnCollisionStay()
{
isGrounded=true;
}
void FixedUpdate()
{
if(Input.GetKey(“d”))
{
rb.AddForce(侧向力*Time.deltaTime,0,0);
}
if(Input.GetKey(“a”))
{
rb.AddForce(-sidewaysForce*Time.deltaTime,0,0);
}
if(Input.GetKey(“w”))
{
rb.AddForce(0,0,forwardForce*Time.deltaTime);
}
if(Input.GetKey(“s”))
{
rb.AddForce(0,0,-forwardForce*Time.deltaTime);
}
if(Input.GetKey(“空格”)&&isground)
{
rb.附加力(0,跳跃力,0);
isfounded=false;
}
}
}
如果你想在单位中指向任何方向(或一般的数学),你需要一个单位或归一化的向量-所有分量加起来等于1

例如(假设
x,y,z
0,0,1
是单位向量,
0,0.5,0.5
也是单位向量

将此向量乘以标量值(单个数值)可以得到距离或大小

例如,将单位向量乘以50将得到一个向量,其中所有分量相加为50,因此在上述示例中,向量将变为
0,0,50
0,25,25

Unity中的
Vector3
类有一个重载,允许您将组件相乘:

考虑到这一点,任何单位向量都可以通过使用
*
运算符乘以它来缩放

var myUnitVector = new Vector3(0, 0.5, 0.5);

var myScaledVector = myUnitVector * 10; // myScaledVector is now (0, 5, 5)
AddForce
接受
Vector3
作为参数(您当前单独提供每个组件),因此为了获得移动力,只需将
forward
向量乘以力的大小即可

Unity通过
变换
组件对场景中存在的所有对象具有
向前
属性。
变换
组件表示场景中对象的位置和旋转

因此,对于您的情况,根据您想要使用摄影机旋转还是实际角色旋转,代码是类似的。我假设您现在要使用角色旋转:

// Keep hold of the transform component for this gameobject
Transform transform;
forwardForce = 500f;

void Start()
{
    // Get the transform object on startup
    transform = GetComponent<Transform>();
}

void FixedUpdate() 
{
    // Press forward or whatever the condition may be
    if (someCondition) 
    {
        rb.AddForce(transform.forward * forwardForce * Time.deltaTime);
    }
}    
//保留此游戏对象的转换组件
变换;
正向力=500f;
void Start()
{
//在启动时获取转换对象
transform=GetComponent();
}
void FixedUpdate()
{
//按“前进”键或任何可能出现的情况
如果(某些条件)
{
rb.AddForce(transform.forward*forwardForce*Time.deltaTime);
}
}    
这将根据游戏对象面对的方向向前施力

如果希望摄影机朝向(如果游戏对象未随摄影机旋转),则需要找到摄影机游戏对象,然后缓存摄影机而不是当前游戏对象的变换

请注意,
Transform
还有其他辅助属性:
Transform.up
Transform.right
。只需反转这些向量即可获得左/下方向,例如分别为
-transform.right
-transform.up

您可以使用这些属性为WASD进行横向移动。

使用世界空间。因此,无论对象如何旋转,它都会沿统一全局X、Y、Z轴应用力

您希望使用哪个来解释该对象局部空间中的给定值(因此使用其自己的X、Y、Z轴)

向刚体添加相对于其坐标系的力

通常,您可能希望使用与摄影机不同的对象进行移动

为什么?

因为不然

  • 如果你的相机向下看,你按下W->你向下加了一个力,试图把玩家压到地上
  • 如果你的相机向上看,然后按W->向上添加一个力,那么根据你的力的强度,这可能使玩家能够四处飞行^^
所以我宁愿使用一个层次结构,比如

Player (This one receives the movement WASD + ONLY global Y-axis rotation)
|--Camera (This one receives ONLY local X-axis rotation)
当然,您可以在一个脚本中处理这两个问题,但这就是您应该应用给定输入的地方。 这样一来,
播放器实际上永远不会向下或向上看,因为它只会绕全局Y轴旋转(向左和向右看)


摄影机是唯一向下和向上看的东西,但我们不使用其局部空间进行移动,而是使用
播放器的一个空间,因此摄影机方向对移动不重要。

您只需从角色获得一个指向
前方的标准化向量,并将力乘以该向量即可,然后将其输入到
AddForce
(您只需传递一个
Vector3
)-您可以使用
transform.forward
获取大多数对象的正向向量(这取决于您从中获取的
forward
)你能不能简化一下,或者给我一个示例代码,因为你解释的可能很简单,但我很笨。没有经验的人不=笨我的朋友-我会给出一个答案。如果不痛的话,你也知道怎么做吗?@RandomPerson我在帖子中提到过-这是最后两段。
Player (This one receives the movement WASD + ONLY global Y-axis rotation)
|--Camera (This one receives ONLY local X-axis rotation)