Что такое 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. |
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 вызывается однажды, как и конструктор.








