c# - 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 之间。无论我是跑上陡峭的山还是平山都没有关系。
有任何想法吗?!(如果有更好的解决方案,而不是获得两点之间的角度,我很感兴趣!!):)
谢谢你的帮助!
解决方案
您可以尝试使用角色的 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);
}
}
只需将它放在您的角色对象上,它就会在场景视图中“可视化”光线投射。
推荐阅读
- r - 尝试使用“R”过滤掉具有特定 GPA 的数据框中的学生
- javascript - 需要一些资源和测试帮助
- javascript - 将 CSRF 令牌添加到请求标头纯 JS 时无法读取未定义的属性“值”
- java - Java 音频错误,试图播放声音
- python - PyTorch中元组grad_fn.next_functions的解释
- angular - 少数用户的 Chrome CORS 阻塞和少数用户的工作正常:Spring boot + Angular App
- python - 如何通过比较使用元组存储的部分值从 dict{} 中删除重复项
- python - Django form_valid 错误。任何人都可以找到错误吗?
- c++ - C ++从cstring中删除重复项
- apache-spark - 根据下一次特定值出现在数据帧 pyspark 中更新行