почему моя игра не получает нормальную скорость с этим кодом?

59
7

void OnMouseDown () {
if(name == "SlowButton"){
PlaneMovement.GameSpeed = 0.5f;
}
if(name == "MediumButton"){
PlaneMovement.GameSpeed = 1f;
}
if(name == "FastButton"){
PlaneMovement.GameSpeed = 2f;
}
if(name == "VeryFastButton"){
PlaneMovement.GameSpeed = 3f;
}
Application.LoadLevel("game");
}

Я вхожу с этим кодом в следующую сцену, и там у меня есть код для некоторой дополнительной мощности, такой как ускорение, в то время как столкновение происходит для этого кода:

if(C.tag == "Dimond"){
Camera.main.GetComponent<StoneInitiate>().DimondList.Remove(C.gameObject);
Destroy (C.gameObject);
Camera.main.GetComponent<StoneInitiate>().StoneCounter+=20;
smooth = 4f;
SpeedUpTimer = 5f;
SpeedUp = true;
}

код ускорения:

PlaneMovement.GameSpeed = Mathf.Lerp (PlaneMovement.GameSpeed,smooth,Time.time);
if(SpeedUp){
SpeedUpTimer -= Time.deltaTime;
print(SpeedUpTimer);
if(SpeedUpTimer <= 0){
SpeedUp = false;
smooth = PlaneMovement.GameSpeed;
}

Он работает отлично, когда происходит столкновение, но гладкая принимает значение 4f и не получает форму значения

PlaneMovement.GameSpeed

пожалуйста, помогите мне, что я новичок в Unity. Заранее спасибо.

спросил(а) 2014-08-20T13:03:00+04:00 6 лет, 3 месяца назад
1
Решение
74

Я просто делаю это, и это работает.

float smooth;
float smooth1;

void Start () {

smooth = PlaneMovement.GameSpeed;
smooth1 = PlaneMovement.GameSpeed;
}

PlaneMovement.GameSpeed = Mathf.Lerp (PlaneMovement.GameSpeed,smooth,Time.deltaTime);
if(SpeedUp){
SpeedUpTimer -= Time.deltaTime;
if(SpeedUpTimer <= 0){
SpeedUp = false;
smooth = smooth1;
}

ответил(а) 2014-08-21T08:11:00+04:00 6 лет, 3 месяца назад
59

Проблема здесь

PlaneMovement.GameSpeed = Mathf.Lerp (PlaneMovement.GameSpeed,smooth,Time.time);
if(SpeedUp){
SpeedUpTimer -= Time.deltaTime;
print(SpeedUpTimer);
if(SpeedUpTimer <= 0){
SpeedUp = false;
smooth = PlaneMovement.GameSpeed;
}
}

Вы неправильно используете Lerp, первый аргумент - значение From, второе - значение To, а третье - это расстояние между From и To, позволяет называть его t.

Например, скажем, что ваши From = 1 и To = 2.

Если t = 0, то оно вернет From и, следовательно, 1

если t = 1, то оно вернет To и, следовательно, 2

если t = 0,5, то он вернет значение на полпути между 1 и 2, таким образом, 1,5

t зажимается до 0 и 1


Вы используете Time.time, число которого больше 1, что означает, что оно всегда будет возвращать ваш плавный. таким образом, GameSpeed всегда будет ровным после того, как вы позвоните

PlaneMovement.GameSpeed = Mathf.Lerp (PlaneMovement.GameSpeed,smooth,Time.time);

То, что вы хотите сделать, это вызывать эту строку несколько раз с примерно чем-то вроде 0,5

Допустим, GameSpeed равен 1, а ровный - 4. Когда вы вызываете это

PlaneMovement.GameSpeed = Mathf.Lerp (PlaneMovement.GameSpeed,smooth,0.5f);

GameSpeed теперь будет 2.5. Если вы снова назовете его с GameSpeed, теперь он будет 2,5, он станет 3,25 и в третий раз за 3,625. Чем больше вы его назовете, тем ближе он дойдет до 4.

Как указал Рудольфм, вы можете сделать эту независимую фрейм-рамку, используя дельта-время, подобное этому

PlaneMovement.GameSpeed = Mathf.Lerp (PlaneMovement.GameSpeed,smooth,0.5f * Time.deltaTime);

ответил(а) 2014-08-20T16:46:00+04:00 6 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема