C# 如果球员在相反方向移动过快,球员不能在车道上居中

C# 如果球员在相反方向移动过快,球员不能在车道上居中,c#,unity3d,C#,Unity3d,在前面的一个问题中,我有一个问题。这个问题的解决又带来了另一个问题 如果用户反复按一个键以过快地向相反方向移动,玩家可能会超出车道中心。每条车道宽1个单位,每次按下一个键时,当前代码将玩家左右移动1个单位 我如何确保球员无论在移动循环中的哪个位置都会一直走到车道中心 这是玩家的移动代码: public float mSpeed; private Rigidbody rb; // Start is called before the first frame update void Start

在前面的一个问题中,我有一个问题。这个问题的解决又带来了另一个问题

如果用户反复按一个键以过快地向相反方向移动,玩家可能会超出车道中心。每条车道宽1个单位,每次按下一个键时,当前代码将玩家左右移动1个单位

我如何确保球员无论在移动循环中的哪个位置都会一直走到车道中心

这是玩家的移动代码:

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;
    }
}
public float mSpeed;
私人刚体;
//在第一帧更新之前调用Start
void Start()
{
rb=GetComponent();
}
//每帧调用一次更新
无效更新()
{
//左移
if(Input.GetKeyDown(KeyCode.A))
start例程(MoveToPosition(rb.transform,newvector3(transform.position.x-1,transform.position.y,transform.position.z),mSpeed));
//右移
if(Input.GetKeyDown(KeyCode.D))
start例程(MoveToPosition(rb.transform,新向量3(transform.position.x+1,transform.position.y,transform.position.z),mSpeed));
Debug.Log(transform.position);
}
公共IEnumerator移动位置(变换、向量3位置、浮点时间移动)
{
var currentPos=变换位置;
var t=0f;
而(t<1)
{
t+=Time.deltaTime/timeToMove;
transform.position=Vector3.Lerp(currentPos,position,t);
收益返回空;
}
}
有人提到使用冷却计时器。在计时器达到零之前不允许用户再次移动。但我需要球员能够扭转他的方向,如果他们超过了理想的车道。随着游戏的进行,障碍物会越来越快地向玩家袭来,玩家的侧向移动速度相对于障碍物的速度会增加

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


非常感谢您的帮助。

我想问题来自您的合作。 如果在第一次协同路线完成之前重复相同的关键点(以您的速度为准),它们将有两个不同的协同路线,用于修改变换的位置

要解决该问题,您可以:

  • 在未到达该位置之前禁止移动
  • 在更新函数中移动协同程序
  • 1: 您可以在类中有一个布尔值(例如canMove),在调用MoveToPosition时将其赋值为false,然后在退出MoveToPosition函数之前将其赋值为true。当检查键是否按下时,不要忘记在条件中检查变量

    2: 您可以在类中存储Vector3(例如finalPos),并在关键点关闭时递增/递减其x值。条件之后,只需使用finalPos移动变换:

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