Unity:停止角色走上山(最后位置和当前位置之间的角度?!)

时间:2018-05-09 12:01:56

标签: c# unity3d

我目前正在使用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之间。如果我跑上一座陡峭的山峰或只是一座平坦的山丘并不重要。

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

显然,你想要为光线投射找出合适的最大距离,这样你就不会太快停止。

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

[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);
    }
}

只需将它放在你的角色对象上,它就可以直观地显示出来。场景视图中的光线投射。