C# 将力添加到局部变换

C# 将力添加到局部变换,c#,unity3d,C#,Unity3d,我目前正在尝试制作一个游戏,以测试我相对较新的编码知识。我想通过做一些事情,看看会发生什么,我会学得更快。我目前正在一架飞机上工作,最近几天我制作了一个功能性的摄像系统(基于鼠标围绕播放器旋转)和一些飞机动画。我目前正在尝试创建一个移动系统,在这个系统中,向下键使玩家向上旋转。然而,我注意到我的AddForce函数并没有达到我想要的效果。我希望这个平面在Z轴上移动,这取决于这个平面的当前旋转,而不是它只是朝向世界的Z角 我目前正在编写以下代码段: //Acceleration if (gam

我目前正在尝试制作一个游戏,以测试我相对较新的编码知识。我想通过做一些事情,看看会发生什么,我会学得更快。我目前正在一架飞机上工作,最近几天我制作了一个功能性的摄像系统(基于鼠标围绕播放器旋转)和一些飞机动画。我目前正在尝试创建一个移动系统,在这个系统中,向下键使玩家向上旋转。然而,我注意到我的AddForce函数并没有达到我想要的效果。我希望这个平面在Z轴上移动,这取决于这个平面的当前旋转,而不是它只是朝向世界的Z角

我目前正在编写以下代码段:

 //Acceleration
 if (gameObject.CompareTag("Player") && playerRb.velocity.z > -349)
 {
     playerRb.AddRelativeForce(0, 0, -playerSpeed, ForceMode.Acceleration);
 }
 else if (gameObject.CompareTag("Player") && playerRb.velocity.z < -349)
 {
     playerRb.velocity = new Vector3(playerRb.velocity.x, playerRb.velocity.y, -350);
 }
 //

 //Movement
 //Up/down controls
 if (gameObject.CompareTag("Player") && Input.GetKey(KeyCode.DownArrow))
 {
     transform.Rotate((0.07f * playerSpeed) * Time.deltaTime, 0, 0);
 }
//加速
if(gameObject.CompareTag(“玩家”)和&playerRb.velocity.z>-349)
{
playerRb.AddRelativeForce(0,0,-playerSpeed,ForceMode.Acceleration);
}
else if(gameObject.CompareTag(“玩家”)和&playerRb.velocity.z<-349)
{
playerRb.velocity=新矢量3(playerRb.velocity.x,playerRb.velocity.y,-350);
}
//
//运动
//上/下控制
if(gameObject.CompareTag(“Player”)&&Input.GetKey(KeyCode.DownArrow))
{
变换.旋转((0.07f*播放速度)*时间增量,0,0);
}
正如你所看到的,我已经尝试将AddRelativeForce作为提到的另一个主题,但这似乎对我不起作用。当它撞到边缘时,不管它的旋转方向如何,它都会坠入深渊

此外,我考虑在旋转上使用另一个AddForce函数,因为它不会离开地面(考虑到它一直用尾巴撞击地板),有没有办法从特定位置/角度对对象施加力?(如飞机前部)


提前谢谢

我认为你的飞机动作奇怪的原因不是因为你的“相对力”指令,而是因为你在设定速度<代码>playerRb.velocity=新矢量3(playerRb.velocity.x,playerRb.velocity.y,-350)指定在世界z轴上推动你的速度-350,这可能不是你想要的。速度是在全球空间。把它拿走,看看会发生什么

更一般地说,如果你用的是物理,试着只用力和力矩。使用
transform.Rotate
在物理活动时更改刚体的旋转只会使你的生活变得困难,并使刚体做奇怪的事情。有时我确实会改变刚体的速度,但不是在每一帧中。我只是对物理学了解不够,所以不能用这种方式来干扰速度


此外,请确保您在
FixedUpdate
函数中执行这些操作,因为这是检查影响物理的输入的地方。

哦,这实际上很有意义。我希望有一个最大的速度,因此这条线,但我可以看到其中的愚蠢。因为如果在油门打开时,每一帧都施加一次力,那么它就会继续前进。有没有办法限制施加的力的大小?只是降低addrelativeforce函数的值?另外,我会看看FixeUpdate,我以前在上面看到过一些东西,但我可能会用到它!你仍然可以有一个最大速度——只需确保你的速度向量的
playerb.magnity
值不高于某个点!大小与向量的大小相同。我会通过检查向量的大小来做到这一点。如果超过你的最大速度,则对矢量进行规格化(基本上得到方向),然后再乘以你的最大速度。这将允许玩家在以最大速度前进时改变方向。