gpt4 book ai didi

c# - 使用角色 Controller 使物体在靠近边缘时掉落

转载 作者:行者123 更新时间:2023-12-05 07:23:17 24 4
gpt4 key购买 nike

我正在使用 unity 的角色 Controller 工具。

问题是如果下方存在与默认角色 Controller 的胶囊碰撞器的碰撞,它不会滑下或掉落,除非无法检测到与表面的任何接触。

它是这样的: enter image description here

我是这样使用自己的引力的:

private void ApplyGravity() {
if (!characterController.isGrounded) {
gravity += Physics.gravity * Time.deltaTime * gravityFactor;
if (gravity.y > 0 && !Input.GetButton(jumpButton))
gravity += Physics.gravity * Time.deltaTime * gravityFactor * (lowJumpMultiplier - 1);
}
else if (!isJumping) gravity = Vector3.down;

CheckCollisionFlags();
movement += gravity;
}

我还没有找到任何方法来修改角色 Controller 的属性以应用任何光滑或添加新的碰撞器来进行碰撞。

我已经尝试减小胶囊碰撞器的半径,但这会导致角色可以稍微穿过墙壁。

我曾考虑过使用多条射线来检查 body 的中间部分是否超出边缘,然后施加一个力使其下落,但我认为这可能是解决此问题的一种更简单、更优化的方法。

最佳答案

我终于设法解决了这个问题。

我首先要做的是检查角色的中间是否接地。我通过在物体的位置发射一条射线来实现这一点。然后,我想让两个人知道哪一侧没有与表面发生碰撞。我又射了四条射线,在胶囊对撞机周围的每个基数处射出一条。我检索了每个未接地的点并计算了与当前字符位置的差异。它给了我一个坐标,我将其添加到物体的运动中,该坐标会增加直到它掉落。

让我们看看:

这就是我创建每条光线的方式。我需要这两个值 (x,z) 来修改必须放置每条射线的基数点。然后,我通过减去胶囊对撞机高度的一半来将 y 设置在地面上。

private Ray CreateEdgeCheckRay(float x, float z) {
Vector3 rayPos = transform.position;
rayPos.y -= characterController.height / 2;
rayPos.x += x;
rayPos.z += z;
return new Ray(rayPos, Vector3.down);
}

我使用这种方法只是一次创建每条光线:

private Ray[] CreateSideRays() {
Ray[] sideRays = new Ray[4];
sideRays[0] = CreateEdgeCheckRay(0.5f, 0);
sideRays[1] = CreateEdgeCheckRay(-0.5f, 0);
sideRays[2] = CreateEdgeCheckRay(0, 0.5f);
sideRays[3] = CreateEdgeCheckRay(0, -0.5f);

return sideRays;
}

我使用 Physics.RaycastNonAlloc 在长度为 1 的数组中检索结果以提高性能。

private bool RayGrounded(Ray ray) {
return Physics.RaycastNonAlloc(ray, rayResults, groundRayLength) < 1;
}

最后,我把所有的东西都结合在一起了。我不需要任何垂直移动,因为我之前实现了重力。

private void CheckGroundRays() {
Ray middleRay = CreateEdgeCheckRay(0, 0);
if (RayGrounded(middleRay)) {
Vector3 inEdgeMovement = Vector3.zero;
foreach(Ray ray in CreateSideRays()) {
if(RayGrounded(ray))
inEdgeMovement += (ray.origin - transform.position);
}
inEdgeMovement.y = 0;
movement += inEdgeMovement;
}
}

关于c# - 使用角色 Controller 使物体在靠近边缘时掉落,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56067785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com