c# - 如果向相反方向移动太快,玩家无法集中在车道上的问题
问题描述
在上一个问题中,我遇到了获取 Rigidbody 的精确定位的问题。正在解决的问题会产生另一个问题。
如果用户反复敲击一个键以太快地向相反方向移动,则玩家可能会越过车道的中心。每条车道宽 1 个单位,每次按下一个键时,当前代码都会将玩家左/右移动 1 个单位。
我如何确保玩家无论在移动周期中的哪个位置,都将始终走到车道的中心?
这是 Player_Movement 代码:
public float mSpeed;
private Rigidbody rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
//For Moving Left
if (Input.GetKeyDown(KeyCode.A))
StartCoroutine(MoveToPosition(rb.transform, new Vector3(transform.position.x - 1, transform.position.y, transform.position.z), mSpeed));
//For Moving Right
if (Input.GetKeyDown(KeyCode.D))
StartCoroutine(MoveToPosition(rb.transform, new Vector3(transform.position.x + 1, transform.position.y, transform.position.z), mSpeed));
Debug.Log(transform.position);
}
public IEnumerator MoveToPosition(Transform transform, Vector3 position, float timeToMove)
{
var currentPos = transform.position;
var t = 0f;
while (t < 1)
{
t += Time.deltaTime / timeToMove;
transform.position = Vector3.Lerp(currentPos, position, t);
yield return null;
}
}
有人提到使用冷却计时器。在计时器达到零之前不要让用户再次移动。但是我需要玩家能够在他们越过所需车道时反转他的方向。随着游戏的进行,障碍物会越来越快地向玩家靠近,并且玩家的横向移动速度相对于障碍物的速度会增加。
由于游戏变得非常疯狂,我希望玩家能够在飞行中纠正他们的位置,而不必等待冷却时间。
任何帮助是极大的赞赏。
解决方案
我认为问题出在你的协程上。如果你在第一个协程完成之前重复相同的键(如果你的速度),他们将有两个不同的协程来修改你的变换的位置。
为了解决这个问题,您可以:
- 在未到达位置之前禁止移动。
- 将您的协程移动到 Update 函数中。
1:你可以在你的类中有一个布尔值(例如canMove),在调用MoveToPosition时将其赋值为false,然后在退出MoveToPosition函数之前将其赋值为true。在检查键是否关闭时,不要忘记检查条件中的变量。
2:您可以在您的类中存储一个 Vector3(例如 finalPos),并在按键按下时增加/减少他的 x 值。在条件之后,您只需要使用 finalPos 移动您的变换:
transform.position = Vector3.Lerp(transform.position, finalPos, Time.deltaTime * mSpeed);
推荐阅读
- ms-access - 访问显示弹出窗口的更新查询
- sql - 如何计算字符串中的字符但如果它存在于引号之间则排除该字符-T-SQL?
- ios - 在 UITableView 后面添加图像使大标题在滚动时停止折叠
- python - PySpark 将模型预测与未转换的数据对齐:最佳实践
- go - 在 go 模板中通过字段名动态访问结构值
- c# - 为什么 Unity 程序集定义会引发错误
- c# - C#如何指定子文件夹中可用的程序集
- vue.js - Vue-router 访问对应路径时不显示组件
- tensorflow - 如何在检测对象时删除/删除边界框?
- flutter - 我如何在颤动中获得设备日期时间?