Как я могу включить и выключить свет, касаясь, а не касаясь сферического коллайдера? - PullRequest
0 голосов
/ 12 февраля 2020

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

public Light ceilingLight;
public bool LS;

private void Update()
{
    if (LS == true)
    {
        ceilingLight.enabled = true;
    }
    if(LS == false)
    {
        ceilingLight.enabled = false;
    }
}

private void OnTriggerEnter(Collider other)
{
    if(other.tag == "Player")
    {
        LS = true;
    }
    if(other.tag != "Player")
    {
        LS = false;
    }
}

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

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

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

Вы скорее хотите отключить его, когда игрок больше не касается и игнорировать все остальное.

Просто сделайте

public Light ceilingLight;
// optionally additionally configure whether the light should start enabled or not
public bool InitiallyEnabled;

private void Start()
{
    ceilingLight.enabled = InitiallyEnabled;
}

private void OnTriggerEnter(Collider other)
{
    if(!other.CompareTag("Player")) return;

    ceilingLight.enabled = true;
}

private void OnTriggerExit(Collider other)
{
    if(!other.CompareTag("Player")) return;

    ceilingLight.enabled = false;
}

В качестве альтернативы вы также можете использовать его в качестве переключателя, например

private void OnTriggerEnter(Collider other)
{
    if(!other.CompareTag("Player")) return;

    ceilingLight.enabled = ! ceilingLight.enabled;
}

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

0 голосов
/ 12 февраля 2020

Учтите, что вам может потребоваться, чтобы в вашем приложении впоследствии можно было нажимать все типы вещей, поэтому вы можете начать с базового c Pressable класса, чтобы справиться с основами. Затем вы можете добавить это поведение в композиционную смесь ваших соответствующих сборных объектов (которые могут быть Holdable, Steerable, Pressable и т. Д.):

using UnityEngine;

public class Pressable : MonoBehaviour
{
    [SerializeField] protected bool active = false;
    [SerializeField] AudioSource pressSound = null;

    protected virtual void Start()
    {
    }

    public virtual void Press()
    {
        if (pressSound != null) { pressSound.Play(); }

        active = !active;
    }

}

Обратите внимание на active bool появится в инспекторе, так что вы можете установить его на true при запуске. (Вы также можете передать Press(Person person) в случае, если что-то должно быть сделано с человеком, который нажимает.)

Теперь для заданного вами переключателя освещения c вы бы унаследовали это и добавили лог c для просто огни:

using UnityEngine;

public class LightPressable : Pressable
{
    Light light = null;

    protected override void Start()
    {
        base.Start();

        light = GetComponentInChildren<Light>();
        UpdateBasedOnActive();
    }

    public override void Press()
    {
        base.Press();

        UpdateBasedOnActive();
    }

    void UpdateBasedOnActive()
    {
        light.enabled = active;
    }
}

Удачи!

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