что такое monobehaviour unity

Что такое MonoBehaviour в Unity 3D?

Полный код находится здесь. Официальные руководства Unity.

Какова цель MonoBehaviour

Источник изображения: https://docs.unity3d.com/uploads/Main/monobehaviour_flowchart.svg

Хотя следующее утверждение верно,

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

MonoBehaviour это еще один класс, который VariablesAndFunctions наследуется от. Это позволяет наследнику использовать методы и переменные другого класса при условии, что у них установлен правильный модификатор уровня доступа.

В приведенном ниже примере Class1 наследуется от Base и поэтому можете использовать protected метод Method1

Обратите внимание, что в этом конкретном примере было бы лучше для Method1 быть отмеченным как abstract или virtual так тогда Class1 можно переопределить так:

В частности, хотя MonoBehaviour описывается как:

Поэтому при выполнении сценариев в единстве вы используете этот базовый класс, чтобы лучше контролировать доступ к объектам, поэтому вам не нужно делать это самостоятельно.

Источник

Русские Блоги

Базовый класс сценариев Unity MonoBehaviour и GameObject

1. Жизненный цикл MonoBehaviour

MonoBehaviour является базовым классом для всех сценариев в Unity. Если вы используете JS, сценарий автоматически наследует MonoBehaviour. Если вы используете C #, вам нужно явно наследовать MonoBehaviour.

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

Awake: когда создается сценарий, вызывается Awake. Большинство из нас завершают инициализацию переменных-членов в этом классе.

Start: вызывается только до того, как функция Update будет вызвана в первый раз. Поскольку он вызывается после Awake, мы можем поместить некоторые переменные, которые должны зависеть от Awake, для инициализации в Start. В то же время мы в основном выполняем StartCoroutine в этом классе, чтобы вызвать некоторые сопрограммы. Обратите внимание, что при написании скриптов на C # вы должны использовать StartCoroutine для запуска сопрограммы, но если вы используете JavaScript, вам не нужно это делать.

Обновление: когда игровой кадр начинает воспроизводиться (в данный момент создан экземпляр GameObject), его Обновление вызывается каждый кадр.

LateUpdate: LateUpdate вызывается после вызова всех функций обновления.

FixedUpdate: когда MonoBehaviour включен, его FixedUpdate вызывается каждый фиксированный кадр.

OnEnable: эта функция вызывается, когда объект становится доступным или активированным.

OnDisable: эта функция вызывается, когда объект становится недоступным или неактивным.

OnDestroy: эта функция вызывается, когда MonoBehaviour будет уничтожен.

Давайте используем картинку, чтобы более наглядно проиллюстрировать, как эти классы называются в жизненном цикле MonoBehaviour:

2. Ямы MonoBehaviour

Закрытые (приватные) и защищенные (защищенные) переменные могут отображаться только в экспертном режиме. Свойства не сериализуются и не отображаются на панели просмотра.

Не используйте пространство имен

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

В игре часто возникают проблемы, которые требуют определения расстояния между врагом и нами. В настоящее время, если вы хотите найти всех врагов, это, очевидно, слишком большие вычислительные затраты, поэтому лучше всего использовать коллайдер для выражения дальности атаки, а затем коллайдер. IsTrigger установлен в True. Наконец, используйте OnTriggerEnter для определения расстояния в пределах диапазона атаки, что значительно повысит производительность программы.

Три, Monobehaviour общие методы

function Invoke (methodName : string, time : float) : void
Через несколько секунд вызовите метод methodName;

function InvokeRepeating (methodName : string, time : float, repeatRate : float) : void
С первого вызова он вызывается каждый раз repeatRate.

function CancelInvoke () : void
Отмените все вызовы Invoke на этом MonoBehaviour.

function IsInvoking (methodName : string) : bool
Ожидание вызова указанной функции.

function StartCoroutine (routine : IEnumerator) : Coroutine
Во время выполнения сопрограммы вы можете использовать оператор yield в любой позиции. Возвращаемое значение yield контролирует, когда сопрограмма возобновляет выполнение. Сопрограмма превосходна во время выполнения собственного кадра объекта. Сопрограмма не имеет больше накладных расходов в производительности. Функция StartCoroutine возвращается немедленно, но yield может задержать результат. Пока выполнение кооперативной программы не завершено.

Когда создается экземпляр MonoBehaviour, Update вызывается каждый кадр.

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

При обработке Rigidbody вам нужно использовать FixedUpdate вместо Update. Например: при добавлении силы к твердому телу вы должны применить силу к фиксированному кадру в FixedUpdate, а не к кадру в обновлении. (Длина кадра у обоих разная)

Читайте также:  что такое таунт в доте

Пробуждение используется для инициализации переменных или состояния игры до ее запуска. Он вызывается только один раз за весь жизненный цикл сценария. Awake вызывается после инициализации всех объектов, поэтому вы можете безопасно общаться с другими объектами или искать их с помощью таких функций, как GameObject.FindWithTag. Пробуждение по каждому игровому объекту вызывается в случайном порядке. Следовательно, вы должны использовать Awake для установки ссылок между скриптами и использовать Start для передачи информации. Awake всегда вызывается перед Start. Его нельзя использовать для выполнения скоординированных программ.

Примечание для пользователей C # и Boo: Awake отличается от конструктора, а состояние сериализации компонента не определяется при создании объекта. Пробуждение вызывается только один раз как конструктор.

Старт вызывается только один раз в жизненном цикле поведения. Разница между ним и Awake заключается в том, что Start вызывается только тогда, когда включен экземпляр скрипта. Вы можете настроить код отложенной инициализации по мере необходимости. Пробуждение всегда выполняется до запуска.

OnMouseEnter /OnMouseOver / OnMouseExit / OnMouseDown / OnMouseUp / OnMouseDrag

OnMouseEnter вызывается, когда мышь входит / плавает / выходит / щелкает / отпускает / перетаскивает GUIElement (элемент GUI) или Collider (тело столкновения).

OnTriggerEnter / OnTriggerExit / OnTriggerStay

OnTriggerEnter вызывается, когда коллайдер входит / выходит / остается на триггере. OnTriggerStay будет вызываться каждый кадр.

OnCollisionEnter / OnCollisionExit / OnCollisionStay

Когда этот коллайдер / твердое тело запускает другое твердое тело / коллайдер, это называется. OnCollisionStay будет вызываться каждый кадр.

В-четвертых, связь между скриптом и GameObject

Сначала будут созданы экземпляры GameObject, которые явно добавлены в иерархию, и порядок, в котором создаются экземпляры GameObject, будет снизу вверх. Во время создания экземпляра GameObject загружается и создается его компонент компонента. Если компонент сценария монтируется, то при создании экземпляра компонента сценария будет вызываться метод Awake сценария, и порядок создания экземпляров компонента также снизу вверх. Игра не начнет воспроизводить кадры, пока не будут созданы все явные объекты GameObject и их компоненты.

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

Описание: сценарий, прикрепленный к GameObject, будет создан как член GameObject.

4.1 Ссылки на переменные скрипта

Объявите переменные другого скрипта в скрипте. Создать общедоступную переменную типа в ClassA является ClassB.

4.1.1 Ссылка на скрипт для не того же GameObject

детали как следующие:

На этом этапе, если член B в classA хочет сослаться на объект classB из GameObjectB new, просто перетащите GameObjectB в скрипт classA в GameObjectA.

4.1.2 Ссылка друг на друга в одном и том же GameObject

детали как следующие:

В это время я обнаружил, что путем перетаскивания невозможно установить ссылки на classA и classB. Поскольку привязка перетаскивания в редакторе Unity является уровнем GameObject.

Так как же решить проблему взаимных ссылок в это время? В этом случае вам нужно использовать переменную gameObject.

Когда создается экземпляр сценария, смонтированного в GameObject, член gameObject, который наследуется от Monobehavior внутри, будет привязан к монтируемому объекту GameObject. Можно отметить, что в этом примере classA и classB являются компонентами одного и того же GameObject, поэтому вы можете получить ссылку на другую переменную сценария через GetComponent.

4.1.3 Ссылка в GameObject отношения родитель-ребенок

Чтобы продлить задачу на один шаг, два скрипта ClassA, ClassB, но на этот раз не привязаны к одному GameObject, но различаются между двумя GameObjects: Parent (ClassA), Child (ClassB)

Во-первых, давайте попробуем перетаскивать. Несмотря на то, что невозможно перетаскивать ссылки на скрипты (Componet) друг друга в редакторе Unity, можно связать GameObject. Поэтому необходимо создать только две открытые переменные, а затем тип GameObject в Unity. Перетащите ссылки друг на друга и, наконец, вызовите его метод GetComponent через уже связанный gameObject в функции Start.

Возвращаться довольно сложно, потому что нет гарантии, что у родителя есть только один дочерний элемент, поэтому мы не можем просто использовать transform.child.gameObject для доступа к нему таким образом, но Unity предоставляет нам очень удобную функцию, а именно Find.

Следует отметить, что Find может найти только Child, для более сложного примера.

Источник

MonoBehaviour

class in UnityEngine

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Submission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Description

MonoBehaviour is the base class from which every Unity script derives.

Читайте также:  что значат цифры на покрышке авто

When you use C#, you must explicitly derive from MonoBehaviour.

This class doesn’t support the null-conditional operator (?.) and the null-coalescing operator (??).

For code samples, see the individual MonoBehaviour methods.

Note: There is a checkbox for enabling or disabling MonoBehaviour in the Unity Editor. It disables functions when unticked. If none of these functions are present in the script, the Unity Editor does not display the checkbox. The functions are:

See Also: The Deactivating GameObjects page in the manual.

Properties

runInEditMode Allow a specific instance of a MonoBehaviour to run in edit mode (only available in the editor).
useGUILayout Disabling this lets you skip the GUI layout phase.

Public Methods

CancelInvoke Cancels all Invoke calls on this MonoBehaviour.
Invoke Invokes the method methodName in time seconds.
InvokeRepeating Invokes the method methodName in time seconds, then repeatedly every repeatRate seconds.
IsInvoking Is any invoke on methodName pending?
StartCoroutine Starts a Coroutine.
StopAllCoroutines Stops all coroutines running on this behaviour.
StopCoroutine Stops the first coroutine named methodName, or the coroutine stored in routine running on this behaviour.

Static Methods

Messages

Awake Awake is called when the script instance is being loaded.
FixedUpdate Frame-rate independent MonoBehaviour.FixedUpdate message for physics calculations.
LateUpdate LateUpdate is called every frame, if the Behaviour is enabled.
OnAnimatorIK Callback for setting up animation IK (inverse kinematics).
OnAnimatorMove Callback for processing animation movements for modifying root motion.
OnApplicationFocus Sent to all GameObjects when the player gets or loses focus.
OnApplicationPause Sent to all GameObjects when the application pauses.
OnApplicationQuit Sent to all GameObjects before the application quits.
OnAudioFilterRead If OnAudioFilterRead is implemented, Unity will insert a custom filter into the audio DSP chain.
OnBecameInvisible OnBecameInvisible is called when the renderer is no longer visible by any camera.
OnBecameVisible OnBecameVisible is called when the renderer became visible by any camera.
OnCollisionEnter OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider.
OnCollisionEnter2D Sent when an incoming collider makes contact with this object’s collider (2D physics only).
OnCollisionExit OnCollisionExit is called when this collider/rigidbody has stopped touching another rigidbody/collider.
OnCollisionExit2D Sent when a collider on another object stops touching this object’s collider (2D physics only).
OnCollisionStay :ref::OnCollisionStay is called once per frame for every collider/rigidbody that is touching rigidbody/collider.
OnCollisionStay2D Sent each frame where a collider on another object is touching this object’s collider (2D physics only).
OnConnectedToServer Called on the client when you have successfully connected to a server.
OnControllerColliderHit OnControllerColliderHit is called when the controller hits a collider while performing a Move.
OnDestroy Destroying the attached Behaviour will result in the game or Scene receiving OnDestroy.
OnDisable This function is called when the behaviour becomes disabled.
OnDisconnectedFromServer Called on the client when the connection was lost or you disconnected from the server.
OnDrawGizmos Implement OnDrawGizmos if you want to draw gizmos that are also pickable and always drawn.
OnDrawGizmosSelected Implement OnDrawGizmosSelected to draw a gizmo if the object is selected.
OnEnable This function is called when the object becomes enabled and active.
OnFailedToConnect Called on the client when a connection attempt fails for some reason.
OnFailedToConnectToMasterServer Called on clients or servers when there is a problem connecting to the MasterServer.
OnGUI OnGUI is called for rendering and handling GUI events.
OnJointBreak Called when a joint attached to the same game object broke.
OnJointBreak2D Called when a Joint2D attached to the same game object breaks.
OnMasterServerEvent Called on clients or servers when reporting events from the MasterServer.
OnMouseDown OnMouseDown is called when the user has pressed the mouse button while over the Collider.
OnMouseDrag OnMouseDrag is called when the user has clicked on a Collider and is still holding down the mouse.
OnMouseEnter Called when the mouse enters the Collider.
OnMouseExit Called when the mouse is not any longer over the Collider.
OnMouseOver Called every frame while the mouse is over the Collider.
OnMouseUp OnMouseUp is called when the user has released the mouse button.
OnMouseUpAsButton OnMouseUpAsButton is only called when the mouse is released over the same Collider as it was pressed.
OnNetworkInstantiate Called on objects which have been network instantiated with Network.Instantiate.
OnParticleCollision OnParticleCollision is called when a particle hits a Collider.
OnParticleSystemStopped OnParticleSystemStopped is called when all particles in the system have died, and no new particles will be born. New particles cease to be created either after Stop is called, or when the duration property of a non-looping system has been exceeded.
OnParticleTrigger OnParticleTrigger is called when any particles in a Particle System meet the conditions in the trigger module.
OnParticleUpdateJobScheduled OnParticleUpdateJobScheduled is called when a Particle System’s built-in update job has been scheduled.
OnPlayerConnected Called on the server whenever a new player has successfully connected.
OnPlayerDisconnected Called on the server whenever a player disconnected from the server.
OnPostRender Event function that Unity calls after a Camera renders the scene.
OnPreCull Event function that Unity calls before a Camera culls the scene.
OnPreRender Event function that Unity calls before a Camera renders the scene.
OnRenderImage Event function that Unity calls after a Camera has finished rendering, that allows you to modify the Camera’s final image.
OnRenderObject OnRenderObject is called after camera has rendered the Scene.
OnSerializeNetworkView Used to customize synchronization of variables in a script watched by a network view.
OnServerInitialized Called on the server whenever a Network.InitializeServer was invoked and has completed.
OnTransformChildrenChanged This function is called when the list of children of the transform of the GameObject has changed.
OnTransformParentChanged This function is called when a direct or indirect parent of the transform of the GameObject has changed.
OnTriggerEnter When a GameObject collides with another GameObject, Unity calls OnTriggerEnter.
OnTriggerEnter2D Sent when another object enters a trigger collider attached to this object (2D physics only).
OnTriggerExit OnTriggerExit is called when the Collider other has stopped touching the trigger.
OnTriggerExit2D Sent when another object leaves a trigger collider attached to this object (2D physics only).
OnTriggerStay OnTriggerStay is called once per physics update for every Collider other that is touching the trigger.
OnTriggerStay2D Sent each frame where another object is within a trigger collider attached to this object (2D physics only).
OnValidate Editor-only function that Unity calls when the script is loaded or a value changes in the Inspector.
OnWillRenderObject OnWillRenderObject is called for each camera if the object is visible and not a UI element.
Reset Reset to default values.
Start Start is called on the frame when a script is enabled just before any of the Update methods are called the first time.
Update Update is called every frame, if the MonoBehaviour is enabled.
Читайте также:  что значит rep в стим

Inherited Members

Properties

enabled Enabled Behaviours are Updated, disabled Behaviours are not.
isActiveAndEnabled Has the Behaviour had active and enabled called?
gameObject The game object this component is attached to. A component is always attached to a game object.
tag The tag of this game object.
transform The Transform attached to this GameObject.
hideFlags Should the object be hidden, saved with the Scene or modifiable by the user?
name The name of the object.

Public Methods

Static Methods

Destroy Removes a GameObject, component or asset.
DestroyImmediate Destroys the object obj immediately. You are strongly recommended to use Destroy instead.
DontDestroyOnLoad Do not destroy the target Object when loading a new Scene.
FindObjectOfType Returns the first active loaded object of Type type.
FindObjectsOfType Gets a list of all loaded objects of Type type.
Instantiate Clones the object original and returns the clone.

Operators

Is something described here not working as you expect it to? It might be a Known Issue. Please check with the Issue Tracker at issuetracker.unity3d.com.

Copyright ©2021 Unity Technologies. Publication Date: 2021-11-12.

Источник

MonoBehaviour.Awake()

Успех!

Благодарим вас за то, что вы помогаете нам улучшить качество документации по Unity. Однако, мы не можем принять любой перевод. Мы проверяем каждый предложенный вами вариант перевода и принимаем его только если он соответствует оригиналу.

Ошибка внесения изменений

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

Описание

Функция Awake вызывается когда экземпляр скрипта будет загружен.

Awake используется для инициализации любых переменных или состояния игры перед тем как игра будет загружена. Awake вызывается только один раз за все время жизни скрипта. Awake вызывается после того как все объекты будут инициализированы, так что вы можете безопасно говорить другим объектам или запросить из используя, например GameObject.FindWithTag. Каждый Awake на каждом объекте вызывается в случайном порядке. Из за этого не используйте Awake для установки связей между скриптами, а используйте Start для передачи информации туда и обратно. Awake всегда вызывается перед любым вызовом функции Start. Это позволяет Вам упорядочить инициализацию скриптов. Awake не может быть корутиной.

Заметим для использующих C# и Boo: используйте Awake вместо конструктора для инициализации, т.к. состояние сериализации объекта не определено во время выполнения конструктора. Awake вызывается однажды, как и конструктор.

Источник

Строительный портал