c# - isGrounded 由 Rigidbody 和 CapsuleCollider
问题描述
尝试了不同的射线长度,仍然不起作用!如何正确配置?下面是跳转相关的代码部分
bool isRolling = false;
bool wannaJump = false;
void FixedUpdate()
{
rb.AddForce(new Vector3(0, Physics.gravity.y * 4, 0), ForceMode.Acceleration);
if (wannaJump && isGrounded())
{
rb.AddForce(new Vector3(0, JumpSpeed, 0), ForceMode.Impulse);
wannaJump = false;
}
}
void Update()
{
if (isGrounded())
{
if (Input.GetAxisRaw("Vertical") > 0)
wannaJump = true;
}
}
bool isGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, 0.05f);
}
解决方案
您的问题在于您的 IsGrounded 方法。
而不是从对象的底部投射光线,而是从中心投射。
我建议创建一个 Vector3 来定义对象的底部并从那里投射光线而不是 transform.position。
如果您使用以下变量,它应该可以工作:
Vector3 playerBottom = new Vector3(transform.x, transform.y - (transform.localScale.y / 2), transform.z);
IsGrounded 方法应该在 playerBottom 变量而不是 transform.position 上初始化 Raycast
您还应该确保 Ray 不会与 playermodel 本身交互。只需给玩家一个图层蒙版,然后让光线投射忽略所说的图层蒙版。
有关这方面的更多信息: https ://docs.unity3d.com/ScriptReference/Physics.Raycast.html
我希望这会有所帮助!
推荐阅读
- javascript - Nodejs:将函数作为参数传递给另一个文件中的另一个函数
- python - 使用 loc 函数将行附加到数据帧的末尾
- python - 使用 Python 的 Scikit-Learn 库对文本数据进行聚类并绘图
- javascript - 获取“来自本机模块的非法回调调用。此回调类型仅允许从本机代码进行一次调用”
- reactjs - jsPDF addSvgAsImage,canvg未定义
- javascript - 更新状态后组件未重新渲染(调用了 mapStateToProps)
- batch-file - 为什么在使用 FOR 处理文件名列表时,文件名部分直到第一个空格输出?
- entity-framework - 按外键对象的属性排序
- reactjs - 两次调用 componentDidMount
- compilation - 使用 Agda 编译的问题