Обновление X, Y, Z с плавающей точкой и конкретного сценария цикла L - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть 2 проблемы, которые я хочу решить.

1-я проблема. Изменение движения X, Y, Z и его обновление.

В моей игре есть водитель, который, если пользователь нажимает, движется. Проблема в том, что я хочу, чтобы скорость была уменьшена с 15f до 5f, когда S (назад) нажата и удерживается до отпускания.

Вот мой код ниже моего скрипта игрока. Пожалуйста, обратитесь к void playerwalk () и движению в обратном направлении ()

public class Move : MonoBehaviour
{

public float speed;

private Rigidbody rb;

private int count;

public Text countText;



// Use this for initialization
void Start()
{
    rb = GetComponent<Rigidbody>();
    count = 0;
    SetCountText();
}

void playerWalk()
{
    var x = Input.GetAxis("Horizontal") * Time.deltaTime * 75f;
    var z = Input.GetAxis("Vertical") * Time.deltaTime * 15f;

    transform.Rotate(0, x, 0);
    transform.Translate(0, 0, -z);

}

void backwardMotion()
{
    if (Input.GetKeyDown(KeyCode.S))
    {
        var z = Input.GetAxis("Vertical") * Time.deltaTime * 5f;
    }
}


void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("Collectable"))
    {
        other.gameObject.SetActive(false);
        count = count + 1;
        SetCountText();
    }
}

void SetCountText()
{
    countText.text = "Count: " + count.ToString();
}
// Update is called once per frame
void Update () 
{
    backwardMotion();
    playerWalk();

}
}

В настоящее время это ни на что не влияет, и пустота backwardsmotion(), похоже, не действует. Нужен ли мне цикл while? Какой синтаксис для do используется в C #?

2-я проблема: делать до цикла?

Для тех из вас, кто не видел мои последние посты, у меня также есть механик фонарика на моей модели автомобиля, где, если вы нажмете L, фонари включатся (переключатся), а если вы нажмете S, подсветка будет, как и вы задний ход.

Вот мой код механики игрового фонарика: Пожалуйста, обратитесь к Void switchoffLights ()

public class headLights : MonoBehaviour
{

public Light frontlights;
public Light frontlights2;
public Light frontlights3;
public Light frontlights4;
public Light backlights;
public Light backlights2;
public Light backlights3;
public Light backlights4;

// Use this for initialization
void Start()
{
    frontlights.enabled = !frontlights.enabled;
    frontlights2.enabled = !frontlights2.enabled;
    frontlights3.enabled = !frontlights3.enabled;
    frontlights4.enabled = !frontlights4.enabled;

}

void switchoffLight()
{

}
// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.L))
    {
        if (frontlights && frontlights2 && frontlights3 && frontlights4 != null)
        {
            frontlights.enabled = !frontlights.enabled;
            frontlights2.enabled = !frontlights2.enabled;
            frontlights3.enabled = !frontlights3.enabled;
            frontlights4.enabled = !frontlights4.enabled;

        }
    }

    if (Input.GetKeyDown(KeyCode.S))
    {
        if (backlights && backlights2 && backlights3 && backlights4 != null)
        {
            backlights.enabled = !backlights.enabled;
            backlights2.enabled = !backlights2.enabled;
            backlights3.enabled = !backlights3.enabled;
            backlights4.enabled = !backlights4.enabled;

        }
    }
}

}

Однако подсветка не выключается при отпускании клавиши S.

Я не мог четко понять, что происходит с другими кодами и ответами, поэтому я спрашиваю здесь.

Заранее спасибо! Я только начинаю занятия по программированию в 10 классе, поэтому, пожалуйста, объясните, как вы, молодому человеку.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Для первого вопроса вы объявили var z дважды, но на самом деле это отдельные значения.

var z = Input.GetAxis("Vertical") * Time.deltaTime * 15f; // playerWalk()

и

var z = Input.GetAxis("Vertical") * Time.deltaTime * 5f; // backwardMotion()

относится к двум различным переменным с тем же именем z, но каждая живет только в том методе, который объявлен в . z в playerWalk() и z в backwardMotion() не имеют ничего общего друг с другом. z в backwardMotion(), по сути, не имеет смысла, так как переменная объявляется, но никогда не используется в методе.

Правильный способ добиться того, чего вы хотите, будет:

void playerWalk()
{
    var x = Input.GetAxis("Horizontal") * Time.deltaTime * 75f;
    var z = Input.GetAxis("Vertical") * Time.deltaTime * 15f;

    if (Input.GetKeyDown(KeyCode.S))
    {
        // If "S" is pressed, the z speed would be reduced to 5f.
        z = Input.GetAxis("Vertical") * Time.deltaTime * 5f; 
    }

    transform.Rotate(0, x, 0);
    transform.Translate(0, 0, -z);
}

По второму вопросу есть три способа получения ввода: Input.GetKeyDown, Input.GetKey и Input.GetKeyUp.

Input.GetKeyDown вызывается только один раз для кадра, на котором вы нажали клавишу.

Input.GetKey вызывается каждый кадр, когда нажата клавиша.

Input.GetKeyUp вызывается только один раз для кадра, на котором вы отпустили ключ.

В вашем случае подсветка вашего автомобиля включается при обнаружении Input.GetKeyDown(KeyCode.S), но ничто не позволяет ему выключиться при обнаружении выпуска.

Решением было бы просто проверить выпуск и выключить фару:

if (Input.GetKeyUp(KeyCode.S)) // Detects a release of "S" key
{
    if (backlights && backlights2 && backlights3 && backlights4)
    {
        backlights.enabled = false;
        backlights2.enabled = false;
        backlights3.enabled = false;
        backlights4.enabled = false;
    }
}
0 голосов
/ 01 сентября 2018

Вы не применяете никаких изменений для преобразования или вращения при нажатии

if (Input.GetKeyDown(KeyCode.S))
    {var z = Input.GetAxis("Vertical") * Time.deltaTime * 5f;         
    }

// Куда идет этот г ????? // Добавить это или что вы хотите "transform.Translate (0, 0, -z);"

Для второго вопроса Используйте GetKeyUp () в другом условии или используйте getkey в том же состоянии

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