【问题标题】:Unity: Stop Character walk up hills (Angles between last Position & current Position?!)Unity:停止角色上山(最后位置和当前位置之间的角度?!)
【发布时间】:2018-05-10 16:26:39
【问题描述】:

我目前正在 Unity 中开发一个小游戏,我使用 c# 编写代码。

该游戏是一款小型角色扮演游戏,您可以像在魔兽世界或龙腾世纪等游戏中一样控制角色。

你在小地图上跑来跑去,地图周围有山丘。目前,您可以在某些地方步行上山,我想阻止这种情况。

所以我想我写了一个代码来获取我的角色的最后位置和当前位置,而不是我得到它们之间的角度,如果角度太高,我会强制玩家返回(或禁用向前进)。

这是到目前为止我得到的代码:

Vector3 lastPos; // last Position
Vector3 curPos; // current Position
float slopeAngle; // The angle between curPos and lastPos

void Start()
{
    curPos = transform.position;
}

void FixedUpdate()
{
    lastPos = curPos;
    curPos = transform.position;
    slopeAngle = Vector3.Angle(lastPos, curPos);
}

不幸的是,slopeAngle 大多在 0 到 0.04 之间。无论我是跑上陡峭的山还是平山都没有关系。

有什么想法吗?! (如果有更好的解决方案,比得到两点之间的角度,我很感兴趣!!):)

感谢您的帮助!

【问题讨论】:

  • id 建议在应用移动之前仅使用当前点和下一个点的高度差(z 轴)。如果你需要根据角度来计算,你可以用三角函数将你的向前运动和所需的角度转换成高度
  • 我现在尝试使用 y 位置以及最后位置和当前位置之间的差异,到目前为止它对我有用!

标签: c# unity3d


【解决方案1】:

您可以尝试使用角色的 Raycast 来检查是否有足够高的坡度来阻止您的移动。

float maxSlopeAngle;
Transform raycastOrigin;

void FixedUpdate()
{
    RaycastHit hit;
    Vector3 direction = Quaternion.Euler(-MaxSlopeAngle, 0, 0) * transform.forward;
    if (Physics.Raycast(raycastOrigin.position, direction, out hit, 1f))
    {
         Debug.Log("Slope ahead!");
    }   
}

显然,您需要为光线投射找出正确的 maxDistance,以免过早停止。

另外,您可以使用以下脚本来帮助您找出正确的角度:

[ExecuteInEditMode]
public class SlopeAngleHelper : MonoBehaviour {

    public float MaxSlopeAngle;
    public Transform RayOrigin;

    void Update () 
    {
        Vector3 direction = Quaternion.Euler(-MaxSlopeAngle, 0, 0) * transform.forward;
        Debug.DrawRay(RayOrigin.position, transform.forward, Color.black, 0.01f, false);
        Debug.DrawRay(RayOrigin.position, direction, Color.red, 0.01f, false);
    }
}

只需将它放在你的角色对象上,它就会在场景视图中“可视化”光线投射。

【讨论】:

  • 我试过你的答案,但它告诉我“向前倾斜!”即使我走在平坦的地面上。我将角度增加到 45 度,它仍在检测平坦的地面?!
  • 尝试在 if 子句 Debug.Log(hit.collider.gameObject); 中添加以下行。这将显示 Raycast 与哪个对象发生碰撞。如果它与地面发生碰撞,请将 RayOrigin 变换稍微移高一点。如果它与玩家碰撞,请确保 RayOrigin 变换位于玩家碰撞器内部。
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多