using System.Collections; using UnityEngine; /* * Переменные и основные функции * в порядке иерархии выполнения сверху вниз */ public class Lesson_2 : MonoBehaviour { #region Control State public bool ShowSceneRenderingString = false; public bool ShowMouseEventString = false; public bool ShowUpdateString = false; public bool ShowFixedUpdateString = false; public bool ShowLateUpdateString = false; #endregion #region Поля /// /// Публичные поля /// public int PoleK = 0; /// /// Закрытые поля /// private int PoleI = 0; /// /// Поля публичные в рамках скрипта /// как для объектов скрипта так и для редактора Unity /// закрытые в рамках обращения из других скриптов /// [SerializeField] private int PoleG = 0; #endregion /// /// Свойства /// public bool StatusReset { get { print($"Reset {StatusReset}"); return true; } } /// /// (Больше работает в Unity) /// Сброс вызывается, когда пользователь нажимает /// кнопку «Сброс» в контекстном меню Инспектора /// или при первом добавлении компонента. /// Эта функция вызывается только в режиме редактора. /// Сброс чаще всего используется для получения /// хороших значений по умолчанию в Инспекторе. /// [ContextMenu("Reset")] private void Reset() { ShowSceneRenderingString = false; ShowMouseEventString = false; ShowFixedUpdateString = false; ShowUpdateString = false; ShowLateUpdateString = false; print($"Reset {this.GetType().Name}"); } /// /// Всегда вызывается до любых функций Start /// и также после того, как префаб был вызван в сцену /// (если GameObject неактивен на момент старта, /// Awake не будет вызван, /// пока GameObject не будет активирован, /// или функция в каком-нибудь прикреплённом скрипте не вызовет Awake). /// private void Awake() { print($"Awake {this.GetType().Name}"); } /// /// (вызывается только если объект активен): /// Эта функция вызывается сразу после включения объекта. /// Это происходит при создании образца MonoBehaviour, /// например, при загрузке уровня или был вызван /// GameObject с компонентом скрипта. /// private void OnEnable() { print($"OnEnable {this.GetType().Name}"); } /// /// Вызывается до обновления первого кадра(first frame) /// только если скрипт включен. /// private void Start() { print($"Start {this.GetType().Name}"); } /// /// Зачастую случается, что FixedUpdate вызывается чаще чем Update. /// FU может быть вызван несколько раз за кадр, если FPS низок /// и функция может быть и вовсе не вызвана между кадрами, если FPS высок. /// Все физические вычисления и обновления происходят сразу после FixedUpdate. /// При применении расчётов передвижения внутри FixedUpdate, /// вам не нужно умножать ваши значения на Time.deltaTime. /// Потому что FixedUpdate вызывается в соответствии с надёжным таймером, /// независящим от частоты кадров. /// Другие методы физики: /// yield WaitForFixedUpdate /// OnTriggerXXX /// OnCollisionXXX /// private void FixedUpdate() { if(ShowFixedUpdateString == true) Debug.Log($"FixedUpdate {this.GetType().Name} time: {PoleK++}"); } /// /// Отправляется, когда мышь входит в элемент. /// private void OnMouseOver() { if(ShowMouseEventString == true) Debug.Log($"OnMouseOver {this.GetType().Name}"); } /// /// Отправляется, когда мышь входит в элемент или один из его потомков. /// private void OnMouseEnter() { if (ShowMouseEventString == true) Debug.Log($"OnMouseEnter {this.GetType().Name}"); } /// /// Вызывается, когда пользователь щелкнул Collider и все еще удерживает мышь. /// private void OnMouseDrag() { if (ShowMouseEventString == true) Debug.Log($"OnMouseDrag {this.GetType().Name}"); } /// /// Отправляется, когда пользователь нажимает кнопку мыши /// в области GUIElement или Collider /// private void OnMouseDown() { if (ShowMouseEventString == true) Debug.Log($"OnMouseDown {this.GetType().Name}"); } /// /// Отправляется, когда пользователь отпускает кнопку мыши. /// private void OnMouseUp() { if (ShowMouseEventString == true) Debug.Log($"OnMouseUp {this.GetType().Name}"); } /// /// Вызывается, когда мышь больше не находится над Collider. /// private void OnMouseExit() { if (ShowMouseEventString == true) Debug.Log($"OnMouseExit {this.GetType().Name}"); } /// /// Вызывается раз за кадр. Это главная функция для обновлений кадров. /// private void Update() { if (ShowUpdateString == true) Debug.Log($"Update {this.GetType().Name} time: {Time.deltaTime}"); } /// /// Game Logic - строго после Update и перед LateUpdate /// yield return null - Сопрограмма продолжит выполнение, после того, как все Update функции были вызваны в следующем кадре. /// yield return new WaitForSeconds() - Продолжает выполнение после заданной временной задержки, и после все Update функций, вызванных в итоговом кадре. /// yield WWW - продолжает выполнение после завершения WWW-загрузки. /// yield StartCoroutine() - сцепляет сопрограмму, и будет ждать, пока не завершится сопрограмма MyFunc. /// /// private IEnumerator ShowGameLogic() { yield return new WaitForSeconds(1f); yield return StartCoroutine(ShowGameLogic()); print(PoleI); yield return null; } /// /// LateUpdate вызывается раз в кадр, после завершения Update. /// Любые вычисления произведённые в Update будут уже выполнены на момент начала LateUpdate. /// Часто LateUpdate используют для преследующей камеры от третьего лица. /// Если вы перемещаете и поворачиваете персонажа в Update, /// вы можете выполнить все вычисления перемещения и вращения камеры в LateUpdate. /// Это обеспечит то, что персонаж будет двигаться до того, как камера отследит его позицию. /// private void LateUpdate() { if(ShowLateUpdateString == true) Debug.Log($"LateUpdate {this.GetType().Name} time: {Time.deltaTime}"); } /// /// Scene rendering - строго после выполнения LateUpdate /// Вызывается один раз для каждой камеры, если объект в поле зрения. /// private void OnWillRenderObject() { if(ShowSceneRenderingString == true) Debug.Log($"OnWillRenderObject {this.GetType().Name}"); } /// /// Вызывается до того, как камера отсечёт сцену. Отсечение определяет, /// какие объекты будут видны в камере. OnPreCull вызывается прямо перед тем, /// как начинается отсечение. /// private void OnPreCull() { if (ShowSceneRenderingString == true) Debug.Log($"OnPreCull {this.GetType().Name}"); } /// /// Вызывается тогда, когда объект становится видимым любой камере. /// private void OnBecameVisible() { if (ShowSceneRenderingString == true) Debug.Log($"OnBecameVisible {this.GetType().Name}"); } /// /// Вызывается тогда, когда объект становится невидимым любой камере. /// private void OnBecameInvisible() { if (ShowSceneRenderingString == true) Debug.Log($"OnBecameInvisible {this.GetType().Name}"); } /// /// Вызывается перед тем, как камера начнёт рендерить сцену. /// private void OnPreRender() { if (ShowSceneRenderingString == true) Debug.Log($"OnPreRender {this.GetType().Name}"); } /// /// Вызывается, после того, как все обычные рендеры сцены завершатся. /// Вы можете использовать класс GL или Graphics.DrawMeshNow, /// чтобы рисовать пользовательскую геометрию в данной точке. /// private void OnRenderObject() { if (ShowSceneRenderingString == true) Debug.Log($"OnRenderObject {this.GetType().Name}"); } /// /// Вызывается после того, как камера завершит рендер сцены. /// private void OnPostRender() { if (ShowSceneRenderingString == true) Debug.Log($"OnPostRender {this.GetType().Name}"); } /// /// Вызывается после завершения рендера сцены, /// для возможности пост-обработки изображения экрана. /// /// текущий экран /// куда сохранить private void OnRenderImage(RenderTexture source, RenderTexture destination) { if (ShowSceneRenderingString == true) Debug.Log($"OnRenderImage {this.GetType().Name}"); } /// /// Используется для отрисовки гизмо в окне Scene View в целях визуализации. /// Только в Editor Unity /// private void OnDrawGizmos() { if (ShowSceneRenderingString == true) Debug.Log($"OnDrawGizmos {this.GetType().Name}"); } /// /// Вызывается несколько раз за кадр и отвечает за элементы интерфейса (GUI). /// Сначала обрабатываются события макета и раскраски, /// после чего идут события клавиатуры/мышки для каждого события. /// private void OnGUI() { if (ShowSceneRenderingString == true) Debug.Log($"OnGUI {this.GetType().Name}"); } /// /// (Работает один раз) /// Вызывается также после yield WaitForEndFrame /// Отправляется всем GameObjects, когда приложение приостанавливается. /// /// private void OnApplicationPause(bool pause) { Debug.Log($"OnApplicationPause {pause} {this.GetType().Name}"); } /// /// Вызывается, когда объект отключается или становится неактивным. /// private void OnDisable() { Debug.Log($"OnDisable {this.GetType().Name}"); } /// /// Вызывается для всех игровых объектов перед тем, /// как приложение закрывается. В редакторе вызывается тогда, /// когда игрок останавливает игровой режим. /// В веб-плеере вызывается по закрытия веб окна. /// private void OnApplicationQuit() { Debug.Log($"OnApplicationQuit {this.GetType().Name}"); } /// /// Эта функция вызывается после всех обновлений кадра /// в последнем кадре объекта, пока он ещё существует /// (объект может быть уничтожен при помощи Object.Destroy или при закрытии сцены). /// private void OnDestroy() { Debug.Log($"OnDestroy {this.GetType().Name}"); } }