Muzzle flash включается, но не выключается с помощью оператора else?

так это работает

if (Input.GetMouseButtonDown(0))
{
    _muzzleflash.SetActive(true);
    Ray rayOrigin = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0f));
    RaycastHit Hitinfo;
    // cast ray
    if (Physics.Raycast(rayOrigin, out Hitinfo))
    {            
        Debug.Log("hit" + Hitinfo.transform.name);
    }
}

а это не работает?

if (Input.GetMouseButtonDown(0))
{
    _muzzleflash.SetActive(true);
    Ray rayOrigin = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0f));
    RaycastHit Hitinfo;
    // cast ray
    if (Physics.Raycast(rayOrigin, out Hitinfo))
    {            
        Debug.Log("hit" + Hitinfo.transform.name);
    }
}
else
{
    _muzzleflash.SetActive(false);
}

это почему?

Мой мыслительный процесс заключался в том, что GetMouseButtonDown(0) будет работать, если его нажать, а затем вызвать мой игровой объект _muzzleflash.

И я предполагаю, что это было бы неправдой только в том случае, если бы щелчок мышью не удерживался.

Итак, нажатие вниз вызывает этот объект в первом примере. Но разве отпускание не удаляет объект, но объект даже не отображается при нажатии мыши?

Есть ли этот объект, но при отпускании объект не удаляется?

Кстати, это мой взгляд на проект единства.

image screenshot

При использовании второго скрипта ничего не произошло?

Ehsan Mohammadi 10.09.2018 08:52

@EhsanMohammadi правильно

Thomas Scheer 10.09.2018 09:07

OK; Во втором скрипте замените Input.GetMouseButtonDown(0) на Input.GetMouseButton(0). Когда вы используете Input.GetMouseButtonDown(0), он вызывает один раз, а затем переходит на else..., и дульная вспышка отключается. Но Input.GetMouseButton(0) возвращает истину, пока вы удерживаете левую кнопку мыши.

Ehsan Mohammadi 10.09.2018 09:11

@EhsanMohammadi, что сработало. Благодарю. но почему это работает?

Thomas Scheer 10.09.2018 09:16

Также я не знаю, как пометить ваш комментарий как «решение» .. вроде в новинку в этом

Thomas Scheer 10.09.2018 09:19

Пожалуйста мой друг. Если позволите, я могу опубликовать его в качестве ответа и полностью описать, как это работает.

Ehsan Mohammadi 10.09.2018 09:32

@ThomasScheer, что касается вашего вопроса о том, как отметить решение, вы можете принимать ответить. Вы не можете пометить комментарий как решение. При необходимости, вот краткое объяснение: stackoverflow.com/help/someone-answers

Basile Perrenoud 10.09.2018 17:08
0
7
148
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Проблема в том, что вы используете GetMouseButtonDown вместо GetMouseButton

Согласно документу GetMouseButtonDown, функция

Returns true during the frame the user pressed the given mouse button.

Хотя в документе GetMouseButton говорится, что функция

Returns whether the given mouse button is held down.

Это означает, что в вашем коде if вызывается только в одном кадре, а через несколько миллисекунд вы находитесь в новом кадре. Поскольку в новом кадре кнопка мыши не была нажата (она все еще удерживается, но момент, когда она была нажата, уже прошла), вместо этого вызывается оператор else и останавливает все.

Чтобы добиться желаемого поведения (функция должна оставаться верной, когда мышь удерживается), используйте GetMouseButton.

Что происходит, так это то, что дульная вспышка активна только в течение одного кадра, который GetMouseButtonDown возвращает true, а затем оператором else устанавливается значение false.

На самом деле я бы предложил, возможно, опустить оператор else и вместо этого добавить логику, при которой дульная вспышка отключается после того, как она была активна, может быть, в течение, может быть, 100 мс или как бы быстро она ни продолжалась.

Вы можете использовать input.getmousebuttonup (), чтобы установить active false ... Другое разумное использование метода вызова для установки активного ложного

Другие вопросы по теме