首页 > 解决方案 > 如果向相反方向移动太快,玩家无法集中在车道上的问题

问题描述

在上一个问题中,我遇到了获取 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;
    }
}

有人提到使用冷却计时器。在计时器达到零之前不要让用户再次移动。但是我需要玩家能够在他们越过所需车道时反转他的方向。随着游戏的进行,障碍物会越来越快地向玩家靠近,并且玩家的横向移动速度相对于障碍物的速度会增加。

由于游戏变得非常疯狂,我希望玩家能够在飞行中纠正他们的位置,而不必等待冷却时间。

任何帮助是极大的赞赏。

标签: c#unity3d

解决方案


我认为问题出在你的协程上。如果你在第一个协程完成之前重复相同的键(如果你的速度),他们将有两个不同的协程来修改你的变换的位置。

为了解决这个问题,您可以:

  1. 在未到达位置之前禁止移动。
  2. 将您的协程移动到 Update 函数中。

1:你可以在你的类中有一个布尔值(例如canMove),在调用MoveToPosition时将其赋值为false,然后在退出MoveToPosition函数之前将其赋值为true。在检查键是否关闭时,不要忘记检查条件中的变量。

2:您可以在您的类中存储一个 Vector3(例如 finalPos),并在按键按下时增加/减少他的 x 值。在条件之后,您只需要使用 finalPos 移动您的变换:

transform.position = Vector3.Lerp(transform.position, finalPos, Time.deltaTime * mSpeed);

推荐阅读