C# 检查角色是否正在下落

C# 检查角色是否正在下落,c#,unity3d,C#,Unity3d,我制作这个脚本是为了检查角色是否在下落(我需要它来设置下落动画),但它只在从非常大的高度下落时起作用。如果我在角色下落时跳跃,“坠落”将不会被打印,而当我开始从更远的距离下落时,它将被激活。有人能帮我或指示另一种方法来检查它是否在下降吗 void Update() { float previousHeight = 0f; var currentHeight = Controller.velocity.y; if(Controller.isGrounded) currentHeight

我制作这个脚本是为了检查角色是否在下落(我需要它来设置下落动画),但它只在从非常大的高度下落时起作用。如果我在角色下落时跳跃,“坠落”将不会被打印,而当我开始从更远的距离下落时,它将被激活。有人能帮我或指示另一种方法来检查它是否在下降吗

void Update()
{
  float previousHeight = 0f;
  var currentHeight = Controller.velocity.y;
  if(Controller.isGrounded) currentHeight = 0f;
  if(currentHeight < previousHeight) print("fallen");
  previousHeight = currentHeight;
}
void Update()
{
浮动高度=0f;
var currentHeight=控制器速度y;
如果(Controller.isground)currentHeight=0f;
如果(当前高度<先前高度)打印(“下降”);
前一高度=当前高度;
}
首先在

float previousHeight = 0f;
您始终使用值
0
创建一个新的
float
。。。因此,对它进行任何检查并最终为其存储一个值都是毫无用处的


我怀疑你已经有了一些领域,但不小心被它遮蔽了。应该是这样

// Renamed it to make my point below clear
private float previousVelocity;

private void Update()
{
    var currentVelocity = Controller.velocity.y;
    if(Controller.isGrounded) currentVelocity = 0f;
    if(currentVelocity < previousVelocity) print("fallen");
    previousVelocity = currentVelocity;
}
//将其重命名以明确我下面的观点
私人浮动速度;
私有void更新()
{
var currentVelocity=控制器.velocity.y;
如果(控制器isground)currentVelocity=0f;
如果(当前速度<先前速度)打印(“下降”);
前速度=当前速度;
}
现在看看这个,你会发现它仍然没有多大意义。我重新命名了变量以明确我的观点:您正在检查之前的速度是否小于当前速度。这意味着只有你放慢了速度,而不一定是你在摔倒


您或者更希望存储和比较绝对位置,例如

private float previousHeight;

private void Update()
{
    var currentHeight = Controller.transform.position.y;
    if(currentHeight < previousHeight) print("fallen");
    previousHeight = transform.position.y;
}
private float-previousHeight;
私有void更新()
{
var currentHeight=控制器.transform.position.y;
如果(当前高度<先前高度)打印(“下降”);
previousHeight=transform.position.y;
}
或者您也可以直接使用速度

private void Update()
{
    var currentVelocity = Controller.velocity.y;
    if(Controller.isGrounded) currentVelocity = 0f;
    if(currentVelocity < 0f) print("fallen");
}
private void Update()
{
var currentVelocity=控制器.velocity.y;
如果(控制器isground)currentVelocity=0f;
如果(当前速度<0f)打印(“下降”);
}
首先在

float previousHeight = 0f;
您始终使用值
0
创建一个新的
float
。。。因此,对它进行任何检查并最终为其存储一个值都是毫无用处的


我怀疑你已经有了一些领域,但不小心被它遮蔽了。应该是这样

// Renamed it to make my point below clear
private float previousVelocity;

private void Update()
{
    var currentVelocity = Controller.velocity.y;
    if(Controller.isGrounded) currentVelocity = 0f;
    if(currentVelocity < previousVelocity) print("fallen");
    previousVelocity = currentVelocity;
}
//将其重命名以明确我下面的观点
私人浮动速度;
私有void更新()
{
var currentVelocity=控制器.velocity.y;
如果(控制器isground)currentVelocity=0f;
如果(当前速度<先前速度)打印(“下降”);
前速度=当前速度;
}
现在看看这个,你会发现它仍然没有多大意义。我重新命名了变量以明确我的观点:您正在检查之前的速度是否小于当前速度。这意味着只有你放慢了速度,而不一定是你在摔倒


您或者更希望存储和比较绝对位置,例如

private float previousHeight;

private void Update()
{
    var currentHeight = Controller.transform.position.y;
    if(currentHeight < previousHeight) print("fallen");
    previousHeight = transform.position.y;
}
private float-previousHeight;
私有void更新()
{
var currentHeight=控制器.transform.position.y;
如果(当前高度<先前高度)打印(“下降”);
previousHeight=transform.position.y;
}
或者您也可以直接使用速度

private void Update()
{
    var currentVelocity = Controller.velocity.y;
    if(Controller.isGrounded) currentVelocity = 0f;
    if(currentVelocity < 0f) print("fallen");
}
private void Update()
{
var currentVelocity=控制器.velocity.y;
如果(控制器isground)currentVelocity=0f;
如果(当前速度<0f)打印(“下降”);
}

var currentHeight=Controller.velocity.y
是一种非常糟糕的命名方式,你得到的是y轴上的速度,而不是通过transform.position.y改变角色的高度。现在它可以工作,但最初它在上升时也会激活,因为之前的高度是局部的,所以总是零。我如何解决所有问题?你有什么建议吗?
var currentHeight=Controller.velocity.y
是一种非常糟糕的命名方式,你得到的是y轴上的速度,而不是通过transform.position.y改变角色的高度。现在它可以工作,但最初它在上升时也会激活,因为之前的高度是局部的,所以总是零。我如何解决所有问题?你有什么建议吗?非常感谢你的澄清。那么currenVelocity就不适合我了,因为如果salty这个角色达到了大于零的速度,并且下降了,它就不会被检测到。另一种选择几乎是完美的。唯一的缺陷是,当我在地面上时,它仍然向我发出“坠落”的信号。我加上:如果(Controller.isground)currentVelocity=0f;通过这种方式,它可以工作,但如果你将角色移动到立方体上,它会下落,尽管没有下落(立方体有一个与地面类似的碰撞器,但我认为问题是我使用Controller.isground检查它是否在地面上,并不总是可靠)。但是我不明白为什么当角色停止时,会打印下落。通过这种方式,如果它接触地面,我被迫将两个高度都设置为0,但当遇到阻力时,结果一定不是0….?非常感谢您的澄清。那么currenVelocity就不适合我了,因为如果salty这个角色达到了大于零的速度,并且下降了,它就不会被检测到。另一种选择几乎是完美的。唯一的缺陷是,当我在地面上时,它仍然向我发出“坠落”的信号。我加上:如果(Controller.isground)currentVelocity=0f;通过这种方式,它可以工作,但如果你将角色移动到立方体上,它会下落,尽管没有下落(立方体有一个与地面类似的碰撞器,但我认为问题是我使用Controller.isground检查它是否在地面上,并不总是可靠)。但是我不明白为什么当角色停止时,会打印下落。以这种方式,如果它接触地面,我被迫将两个高度都设置为0,但当它被阻挡时,它无论如何都不能是结果0。。?