如何在2D游戏中创建“冲刺”能力

时间:2019-06-07 17:33:55

标签: c# unity3d

我正在尝试在具有能量条的2d Unity(C#)中创建冲刺功能,因此不能无休止地使用它。我想念什么?

我试图使sprint成为函数,并在按下X键时调用它。试图乘以它的位置,但是我在短距离内有眨眼的能力。

\\ this is my movement script, other variables we're declared earlier in the code

void Update() { 
        Vector2 mi = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
        mv = mi.normalized * speed;
    }

    private void FixedUpdate() {
        rb.MovePosition(rb.position + mv * Time.fixedDeltaTime);
    }

我希望该代码使按下X键时播放器的速度达到正常速度的两倍,但只能在能量用尽时使用。

2 个答案:

答案 0 :(得分:0)

看不到您对“能源”的实现,但我只是使用

public float energy;
// How much is energy reduced per second?
public float decreaseSpeed;

如果按x,则提高速度

private void Update()
{
    Vector2 mi = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
    mv = mi.normalized * speed;

    if(Input.GetKey(KeyCode.X) && energy > 0)
    {
        // Reduce energy by decreaseSpeed per second
        energy -= decreaseSpeed * Time.deltaTime;

        // if needed avoid negative value
        energy = Mathf.Max(0, energy);

        // double the move distance
        mv *= 2;
    }
}

建议在Time.deltaTime中也使用Time.fixedDeltaTime代替FixedUpdate(请参见Time.fixedDeltaTime

答案 1 :(得分:0)

Update中检查是否是sprint轴(在项目输入设置中创建一个Sprint轴)。另外,有一个变量来确定短跑过程中能量棒的消耗速度:

public float energyBarDrainRate = 1f;
private bool isSprinting = false;

void Update() { 
    isSprinting = Input.GetAxis("Sprint") > 0f;
    Vector2 mi = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
    mv = mi.normalized * speed;
}

然后在fixedupdate中,检查能量条是否足以耗尽该框架,如果确实耗尽了能量并提高该框架的有效移动速度:

private void FixedUpdate() {
    float energyToDrain = energyBarDrainRate * Time.deltaTime
    bool drainSprint = energyAmount > energyToDrain ;
    float effectiveMv = mv;

    if (drainSprint && isSprinting) {
        effectiveMv = mv * 2f;
        energyAmount -= energyToDrain;
    }

    rb.MovePosition(rb.position + effectiveMv * Time.deltaTime);
}