首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >特征斜率行为

特征斜率行为
EN

Stack Overflow用户
提问于 2018-04-21 19:08:15
回答 1查看 4.4K关注 0票数 1

我正在开发一个主要集中在户外运动的游戏,因此我希望角色控制感觉尽可能好。

我目前正在研究的问题是斜坡的行为:当你站在不太陡峭的斜坡上时,这个角色不应该滑落,而在太陡的斜坡上滑行。

我通过激活和解除刚体约束来实现这一点,这取决于玩家下面地面的当前角度。

代码语言:javascript
复制
private const RigidbodyConstraints DefaultConstraints = RigidbodyConstraints.FreezeRotation;
private const RigidbodyConstraints StayOnSlope = RigidbodyConstraints.FreezePositionX | RigidbodyConstraints.FreezePositionZ | DefaultConstraints;
private const RigidbodyConstraints SlideDownSlope = DefaultConstraints;

用分离法计算地面的角度,以度为单位返回向上矢量与地面法线之间的夹角。

代码语言:javascript
复制
private float GetGroundAngle()
{
    RaycastHit hit;
    if (Physics.Raycast(transform.position, Vector3.down, out hit, 0.5f))
    {
        return Vector3.Angle(Vector3.up, hit.normal);
    }
    return 0;
}

约束的实际激活和失活在FixedUpdate方法中实现。另外,玩家的移动速度越慢,坡度越陡。

代码语言:javascript
复制
private void FixedUpdate()
{
    const float MAX_SLOPE_ANGLE = 45;

    // If the player is grounded, check the ground angle and prevent slope sliding
    float angle = GetGroundAngle();
    // Apply the constraints
    m_rigidbody.constraints = (m_movementVector.magnitude < Vector3.kEpsilon) && angle <= MAX_SLOPE_ANGLE ? StayOnSlope : SlideDownSlope;

    // Calculate the movement coefficient to ensure the player cannot run up slopes
    float slopeCoefficient = Mathf.Cos(angle * Mathf.Deg2Rad);
    // Calculate and apply the movement vector
    Vector3 movement = m_movementVector * slopeCoefficient * Time.fixedDeltaTime;
    m_rigidbody.MovePosition(m_rigidbody.position + movement);

    // ...
}

此功能的问题如下:

  • 当玩家站在斜坡上的时候,玩家会正确地停下来,但是当向太陡的斜坡移动时,玩家会滑落,但是会继续滑下去,直到运动矢量被改变或者根本没有输入为止。 预期的结果是,球员将停止滑落,只要他是在一个斜坡是足够平坦的步行,这是目前不是这样的。
  • 激活和解除约束似乎有点..。太烦躁,不能在控制器内使用。

有没有更好的方法使斜坡运动的行为?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-22 17:04:09

当角色站在不太陡峭的斜坡上时,不应该滑下去,而在太陡的斜坡上滑行。

我相信CharacterController组件可能对你有用。

注意,它有一个可调整的斜率限制变量。

https://docs.unity3d.com/Manual/class-CharacterController.html

在under资产中有第一个实现此功能的控制器,它可以在资产->导入包->字符中找到。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49959324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档