Управление движением на основе light.enabled. C # - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть механик в моем новом проекте, где враги запрограммированы преследовать игрока, но только если у них включен «факел». Как вы увидите в скрипте, я делаю это с нулевой проверкой

Вот код:

public class chasePlayer : MonoBehaviour
{
    public Transform target;
    public float speed;
    public Light playerLight;

    void followLight()
    {
        if (playerLight != null)
        {
            speed = 1;
            float walkspeed = speed * Time.deltaTime;
            transform.position = Vector3.MoveTowards(transform.position, target.position, walkspeed);
        }
    }

    void stopFollowing()
    {
        if (playerLight = null)
        {
            speed = 0;
        }
    }

    void Update()
    {
        followLight();
        stopFollowing();
    }
}

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

Что я мог делать не так? Первый раз делаю оригинальный сценарий, так что, вероятно, многое не так

Ответы [ 2 ]

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

Ветеран здесь! * смеется *

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

Ваш код не работает, потому что вы проверяете свой Light компонент на null. null будет только тогда, когда ничего не назначено или назначенный объект уничтожен. Если вы хотите проверить состояние компонента, лучше используйте playerLight.enabled. Добавим некоторые незначительные улучшения в ваш общий код, и теперь он выглядит так:

public class ChasePlayer : MonoBehaviour
{
    public Light playerLight;
    public float speed;
    public Transform target;


    private void FollowLight()
    {
        // Does checking for given statement but is only executed in Debug mode.
        // Fairly good for fail-proofing private methods
        // Or clarifying, what values should be before invoking the method.
        Debug.Assert(playerLight != null);

        float walkspeed = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, target.position, walkspeed);      
    }

    private void Update()
    {
        if(playerLight != null && playerLight.enabled)
            FollowLight();
    }
}

ПРИМЕЧАНИЕ: не забудьте переименовать файл класса в ChasePlayer, поскольку у меня есть CamelCased имя класса (Unity требует, чтобы имена файлов и классов совпадали, чтобы иметь возможность назначить компоненты GameObjects в редакторе).

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

На основании вашего последнего комментария попробуйте это:

public class chasePlayer : MonoBehaviour
{
    public Transform target;
    public float speed;
    public Light playerLight;

    void followLight()
    {
        if (playerLight != null)
        {
            speed = 1;
        }
        float walkspeed = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, target.position, walkspeed);            
    }

    void stopFollowing()
    {
        if (playerLight == null)
        {
            speed = 0;
        }
    }

    void Update()
    {
        followLight();
        stopFollowing();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...