首页 > 解决方案 > Unity:停止角色上山(最后位置和当前位置之间的角度?!)

问题描述

我目前正在 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 之间。无论我是跑上陡峭的山还是平山都没有关系。

有任何想法吗?!(如果有更好的解决方案,而不是获得两点之间的角度,我很感兴趣!!):)

谢谢你的帮助!

标签: c#unity3d

解决方案


您可以尝试使用角色的 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);
    }
}

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


推荐阅读