如何使用曲线平滑地制作跳跃动画?
How to make the Jump animations using curves smoothly?
我一直在研究一些示例,使用 unity 5 引擎开发无尽的跑酷游戏。我对我的角色应用了跳跃动作。它确实工作得很好,但我希望它有点完美,所以我用这个 example 使用曲线植入了跳跃,遇到了这个问题。那是在为角色控制器应用曲线并进行一些调整后,现在当我跳跃时,曲线在我接触平台(地面)后开始调整控制器,这使得跳跃变得不真实。我确实尝试使用固定更新方法实现跳跃,因为游戏是一个无尽的跑步者,它基本上逐帧更新所有内容,但它不起作用。
如何实现逼真的跳跃?以下是我到目前为止所尝试的。
if (controller.isGrounded)
{
verticalVelocity = -0.5f; //upward thrust / jump height
if (currentBaseState.fullPathHash == locoState) // is character in moving state
{
if (Input.GetButtonDown("Jump"))
{
verticalVelocity = 18f;
anim.SetBool("Jump", true);
}
}
else if (currentBaseState.fullPathHash == jumpState) //Is character in jump state
{
if (!anim.IsInTransition(0))
{
if (useCurves)
{
controller.height = anim.GetFloat("ColliderHeight"); //get the controller height using curves
controller.center = new Vector3(0f, anim.GetFloat("ColliderY"), 0f); //Get the controller Y axis using the curves (center of chr ctrlr)
}
anim.SetBool("Jump", false);
}
// Applying curves
Ray ray = new Ray(transform.position + Vector3.up, -Vector3.up);
RaycastHit hitInfo = new RaycastHit();
if (Physics.Raycast(ray, out hitInfo))
{
print(ray.ToString());
if (hitInfo.distance > 1.75f)
{
anim.MatchTarget(hitInfo.point, Quaternion.identity, AvatarTarget.Root, new MatchTargetWeightMask(new Vector3(0, 1f, 0), 0), 0.03f, 0.6f);
}
}
}
}
开始时角色跳跃
触地的字符控制器
落地后的结果
不胜感激
您根据曲线调整控制器的代码位于询问角色是否接地的 if 语句中。
if (controller.isGrounded)
{
...
}
这样它只会在角色接触地面时进行调整。
你的游戏对象有刚体吗?如果没有,则尝试将刚体添加并制作为 iskinematic,因为当您使用对撞机而不是刚体移动对象时,需要重新计算完整的静态碰撞数据,这很慢。
或者,可能是,尝试播放动画跳帧率不要太小
我一直在研究一些示例,使用 unity 5 引擎开发无尽的跑酷游戏。我对我的角色应用了跳跃动作。它确实工作得很好,但我希望它有点完美,所以我用这个 example 使用曲线植入了跳跃,遇到了这个问题。那是在为角色控制器应用曲线并进行一些调整后,现在当我跳跃时,曲线在我接触平台(地面)后开始调整控制器,这使得跳跃变得不真实。我确实尝试使用固定更新方法实现跳跃,因为游戏是一个无尽的跑步者,它基本上逐帧更新所有内容,但它不起作用。 如何实现逼真的跳跃?以下是我到目前为止所尝试的。
if (controller.isGrounded)
{
verticalVelocity = -0.5f; //upward thrust / jump height
if (currentBaseState.fullPathHash == locoState) // is character in moving state
{
if (Input.GetButtonDown("Jump"))
{
verticalVelocity = 18f;
anim.SetBool("Jump", true);
}
}
else if (currentBaseState.fullPathHash == jumpState) //Is character in jump state
{
if (!anim.IsInTransition(0))
{
if (useCurves)
{
controller.height = anim.GetFloat("ColliderHeight"); //get the controller height using curves
controller.center = new Vector3(0f, anim.GetFloat("ColliderY"), 0f); //Get the controller Y axis using the curves (center of chr ctrlr)
}
anim.SetBool("Jump", false);
}
// Applying curves
Ray ray = new Ray(transform.position + Vector3.up, -Vector3.up);
RaycastHit hitInfo = new RaycastHit();
if (Physics.Raycast(ray, out hitInfo))
{
print(ray.ToString());
if (hitInfo.distance > 1.75f)
{
anim.MatchTarget(hitInfo.point, Quaternion.identity, AvatarTarget.Root, new MatchTargetWeightMask(new Vector3(0, 1f, 0), 0), 0.03f, 0.6f);
}
}
}
}
不胜感激
您根据曲线调整控制器的代码位于询问角色是否接地的 if 语句中。
if (controller.isGrounded)
{
...
}
这样它只会在角色接触地面时进行调整。
你的游戏对象有刚体吗?如果没有,则尝试将刚体添加并制作为 iskinematic,因为当您使用对撞机而不是刚体移动对象时,需要重新计算完整的静态碰撞数据,这很慢。 或者,可能是,尝试播放动画跳帧率不要太小