我目前正在使用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之间。如果我跑上一座陡峭的山峰或只是一座平坦的山丘并不重要。
任何想法?! (如果有更好的解决方案,而不是获得两点之间的角度,我非常感兴趣!!):)
感谢您的帮助!
答案 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);
}
}
只需将它放在你的角色对象上,它就可以直观地显示出来。场景视图中的光线投射。