Функции

Функции

Функция — участок кода с собственными именем, который принимает на вход какие-то данные, что-то с ними делает и возвращает обратно результат (хотя возможен вариант когда функция ничего не принимает и не возвращает,а просто что-то делает).

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Damage : MonoBehaviour {

    public float playerHealth; // здоровье Игрока
    public float playerArmor; // броня Игрока
    public float playerResistance; // сопротивление Игрока
    public float playerDamage; // урон Игрока

    public float enemyHealth; // здоровье Противника
    public float enemyArmor; // броня Противника
    public float enemyResistance; // сопротивление Противника
    public float enemyDamage; // урон Противника

    void Start () {
        playerHealth -= (enemyDamage - playerArmor) * playerResistance;
        enemyHealth -= (playerDamage - enemyArmor) * enemyResistance;
    }
}

Как ты видишь, мы дважды наносим урон — один раз Игроку, другой раз Противнику. Представь, что тебе предстоит делать это раз за разом и всегда писать одну и туже команду, а если расчет нанесенного урона будет сложнее, не в одно действие? Тогда тебе и пригодиться Функция:

    float DamageDeal(float damage, float armor, float resistance)
    {
        return (damage - armor) * resistance;
    }

Слово float означает, что функция вернет назад переменную типа float, DamageDeal(float damage, float armor, float resistance) — название функции и описание того, что она принимает на вход три числа.

Теперь та же программа будет выглядеть таким образом:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Damage : MonoBehaviour {

    public float playerHealth;
    public float playerArmor;
    public float playerResistance;
    public float playerDamage;

    public float enemyHealth;
    public float enemyArmor;
    public float enemyResistance;
    public float enemyDamage;

    void Start () {
        playerHealth -= DamageDeal(enemyDamage, playerArmor, playerResistance);
        enemyHealth -= DamageDeal(playerDamage, enemyArmor, enemyResistance);
    }

    float DamageDeal(float damage, float armor, float resistance)
    {
        return (damage - armor) * resistance;
    }
}

Функции событий

Unity немного не похож на традиционную идею программы, где код работает постоянно в цикле, пока не завершит свою задачу. Вместо этого, Unity периодически передаёт управление скрипту при вызове определённых объявленных в нём функций. Как только функция завершает исполнение, управление возвращается обратно к Unity. Эти функции известны как функции событий, так как их активирует Unity в ответ на события, которые происходят в процессе игры. Unity использует схему именования, чтобы определить, какую функцию вызвать для определённого события.

Например, ты уже видел функцию Update и функцию Start. Разберем несколько из самых важных и часто встречающихся событий, а вообще в Unity доступно гораздо большее количество функций.

Update

Игра — это что-то вроде анимации, в которой кадры генерируются на ходу. Ключевой концепт в программировании игр заключается в изменении позиции, состояния и поведения объектов в игре прямо перед отрисовкой кадра. Такой код в Unity обычно размещают в функции Update. Update вызывается перед отрисовкой кадра и перед расчётом анимаций.

void Update() {
    float distance = speed * Time.deltaTime * Input.GetAxis("Horizontal");
    transform.Translate(Vector3.right * distance);
}

Start

Функция Start вызывается до обновления первого кадра(first frame) только если скрипт включен.

Для объектов добавленных на сцену, функция Start будет вызываться во всех скриптах до функции Update. Естественно, это не может быть обеспечено при создании объекта непосредственно во время игры.

    void Start () {
        Player = GameObject.FindGameObjectWithTag("Player"); // Ищем игровой объект с тегом "Player"
    }

OnTriggerEnter

OnTriggerEnter вызывается, когда Collider other входит в триггер. Код, который будет размещен в этой функции, будет выполнен один раз.

    void OnTriggerEnter(Collider other) {
        Destroy(other.gameObject);
    }

OnTriggerExit

OnTriggerEnter вызывается, когда Collider other выходит из триггер. Код, который будет размещен в этой функции, будет выполнен один раз.

    void OnTriggerExit(Collider other) {
        Destroy(other.gameObject);
    }

OnTriggerStay

OnTriggerStay вызывается почти каждый кадр, пока Collider other находится в триггере. Код, который будет размещен в этой функции, будет выполнятся до тех пор, пока Collider other не выйдет за пределы триггера.

    // Применяет силу "вверх" ко всем игровым объектам с компонентом Rigidbody, которые входят в триггер.
    void OnTriggerStay ( Collider other )
    {
        if (other.attachedRigidbody)
            other.attachedRigidbody.AddForce ( Vector3.up * 10);
    }