Как создать способность «спринт» в 2d игре - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь создать способность к спринту в 2d Unity (C #), у которого есть энергетический батончик, поэтому его нельзя бесконечно использовать. Чего мне не хватает?

Я пытался сделать спринт функцией и вызывать ее при нажатии клавиши 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 голосов
/ 07 июня 2019

В Update проверьте, если ось спринта (создайте ось 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);
}
0 голосов
/ 07 июня 2019

Не вижу вашей реализации "энергии", но я бы просто использовал

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...