Как получить ссылку / добавить / отключить / удалить компонент из скрипта
Приветствую начинающих разработчиков Unity. В данной статье мы рассмотрим сразу четыре возможности, которые можно реализовать с компонентами объекта, через скрипт, а именно: получение ссылки на компонент, добавление компонента, отключение компонента и удаление компонента.
Давайте пройдёмся по порядку.
Получение ссылки на компонент
Предположим, у нас имеется переменная obj, которая хранит в себе ссылку на наш объект. И нам необходимо получить ссылку на компонент данного объекта, например, на компонент Rigidbody. Для этого воспользуемся методом GameObject.GetComponent.
Rigidbody _rb = obj.GetComponent();
Тепер в переменной _rb у нас имеется ссылка на компонент Rigidbody, объекта obj. Так же убедитесь в том, что компонент, на который вы хотите получить ссылку, добавлен к Вашему объекту, иначе данный код работать не будет.
Добавление компонента
Как и в предыдущем примере, предположим, у нас имеется переменная obj, которая хранит в себе ссылку на наш объект.
Там нам необходимо добавить компонент для нашего объекта. Для этого нам понадобится метод GameObject.AddComponent. Воспользуемся им, добавив компонент, например, Rigidbody:
Rigidbody _rb = obj.AddComponent();
Готово! К объекту obj мы добавили компонент Rigidbody, и в переменную _rb записали ссылку для её хранение. Но на самом деле хранить ссылку на добавленный компонент не обязательно, поэтому, Вы можете обойтись и без этого.
Отключение компонента
Отключение и включение компонента используется довольно часто, для временного отключения или включения его свойств.
Предположим, что у Вас имеется переменная _rb, которая хранит в себе ссылку на какой-либо компонент.
У любого компонента имеется свойство enabled, которое принимая значения true и false, включает и отключает компонент соответственно. Воспользуемся им:
_rb.enabled = true;
Данный код отключит Ваш компонет. А чтобы его опять включить, поменяйте значение true на false.
_rb.enabled = false;
Удаление компонента
Удаление компонента, пожалуй, самое простое из всех тем этой статьи. За удаление компонента отвечает метод Destroy.
Destroy(_rb);
Так же убедитесь, что в переменной _rb имеется ссылка на Ваш компонент, который Вы хотите удалить.
На этом всё, теперь Вы умеете работать с компонентами 🙂 Если остались вопросы, задавайте их в комментариях.
Rigidbody
Благодарим вас за то, что вы помогаете нам улучшить качество документации по Unity. Однако, мы не можем принять любой перевод. Мы проверяем каждый предложенный вами вариант перевода и принимаем его только если он соответствует оригиналу.
Ошибка внесения изменений
По определённым причинам предложенный вами перевод не может быть принят. Пожалуйста попробуйте снова через пару минут. И выражаем вам свою благодарность за то, что вы уделяете время, чтобы улучшить документацию по Unity.
Ваше имя Адрес вашей электронной почты Предложение * Разместить предложенное
Описание
Управляет положением объекта через имитацию физики.
Добавление компонента Rigidbody к объекту отдает его движение под контроль физического движка Unity. Даже без добавления какого либо кода, объект с Rigidbody будет подвержен гравитации и реагировать на коллизии с входящими объектами, если имеет компонент Collider.
Rigidbody также имеет scripting API, который позволит вам применить силы к объекту и контролировать его на физически реалистичном пути. Например, поведение машины может быть определено в силах, приложенных к колесам. Учитывая эту информацию, физический движок может справляться с множеством других аспектов движения машины, она будет реалистично ускоряться и корректно реагировать на коллизии.
В скрипте функция FixedUpdate рекомендуется как место для применения сил и изменения настроек Rigidbody (в противоположность Update, которая используется для большинства других задач). Причина этого в том, что физика обновляется в измеряемых временных шагах, которые не совпадают с обновлением кадров. FixedUpdate вызывается немедленно перед каждым физическим обновлением и все изменения, сделанные в нем , будут обработаны сразу же.
Большинство проблем при запуске с Rigidbody в том, что игровая физика кажется запущенной в режиме «slow motion» (замедленного движения). На самом деле это из за масштаба (scale) ваших моделей. Настройки гравитации по умолчанию допускают что один мировой юнит (единица) соответствует одному метру. В играх без использования физики юниты не имеют особого значения, можно сделать их всех масштабом в 100. Но когда используется физика, они будут обработаны как очень большие объекты. Если большой масштаб используется для объектов, которые должны быть маленькими, они будут казаться падающими очень медленно — физический движок будет принимать их за большие объекты, падающие на очень большое расстояние. Имея это ввиду, не забудьте сохранить масштаб ваших объектов более-менее приближенном к реальному (для автомобиля это примерно 4 юнита = 4 метра, к примеру).
Переменные
| angularDrag | Угловое торможение объекта. |
| angularVelocity | Вектор угловой скорости твердого тела. |
| centerOfMass | Центр массы относительно источника transform. |
| collisionDetectionMode | Режим обнаружения коллизии Rigidbody. |
| constraints | Управляет тем, какая степень свободы допустима при симуляции данного Rigidbody. |
| detectCollisions | Должно ли определение коллизии быть активным? (по умолчанию оно активно всегда). |
| drag | Торможение объекта. |
| freezeRotation | Контролирует будет ли физика изменять вращение объекта. |
| inertiaTensor | Диагональный тензор инерции массы относительно центра массы. |
| inertiaTensorRotation | Вращение тензора инерции. |
| interpolation | Интерполяция позволит вам сгладить эффект работающей физики по числу фиксированной частоты кадров. |
| isKinematic | Контролирует влияние физики на твердое тело. |
| mass | Масса физического тела. |
| maxAngularVelocity | Максимальная угловая скорость объекта. (По умолчанию 7) в диапазоне < 0, бесконечность>. |
| maxDepenetrationVelocity | Скорость твердого тела к точке мировой точке в глобальном пространстве. |
| position | Позиция физического тела. |
| rotation | Вращение твердого тела. |
| sleepThreshold | Линейная скорость, ниже которой объекты начинают погружаться в сон (По умолчанию 0.14), диапазон . |
| solverIterationCount | Позволяет вам переопределять решения счетчика итерации каждого твердого тела. |
| useConeFriction | Для этого твердого тела используется сила трения конуса. |
| useGravity | Контролирует, оказывает ли влияние гравитация на твердое тело. |
| velocity | Вектор скорости твердого тела. |
| worldCenterOfMass | Центр масс твердого тела в мировом пространстве. |
Открытые функции
| AddExplosionForce | Применение силы к твердому телу имитирует эффект взрыва. Сила взрыва убывает линейно относительно расстояния до твердого тела. |
| AddForce | Добавляет крутящий момент к физическому телу. |
| AddForceAtPosition | Применяет силу к / позиции/. В результате будет применено торможение и сила к объекту. |
| AddRelativeForce | Добавление силы к твердому телу относительно его системы координат. |
| AddRelativeTorque | Добавление силы к твердому телу относительно его системы координат. |
| AddTorque | Добавляет крутящий момент к физическому телу. |
| ClosestPointOnBounds | Ближайшая точка к ограничивающей рамке прикрепленных коллайдеров. |
| GetPointVelocity | Скорость твердого тела к точке мировой точке в глобальном пространстве. |
| GetRelativePointVelocity | Скорость относительно точки твердого тела (относительной точки). |
| IsSleeping | Твердое тело спит? |
| MovePosition | Двигает твердое тело к пизиции. |
| MoveRotation | Вращает твердое тело к вращение. |
| ResetCenterOfMass | Масса физического тела. |
| ResetInertiaTensor | inertiaTensorRotation вращает тензор инерции. |
| SetDensity | Назначить массу, основанную на прикрепленных коллайдерах, при условии постоянной плотности. |
| Sleep | Отправляет твердое тело в сон по меньшей мере на один кадр. |
| SweepTest | Проверяет, столкнулось ли твердое тело с чем либо. Если да — перемещает через сцену. |
| SweepTestAll | Похож на Rigidbody.SweepTest, но возвращает все прикосновения. |
| WakeUp | Силы для пробуждения твердого тела. |
Сообщения
| OnCollisionEnter | OnCollisionEnter вызывается когда collider/rigidbody начинает соприкасаться с другим rigidbody/collider. |
| OnCollisionExit | OnCollisionEnter вызывается когда collider/rigidbody был остановлен прикосновением другого rigidbody/collider. |
| OnCollisionStay | OnCollisionStay вызывается каждый кадр для каждого collider/rigidbody, который прикасается к rigidbody/collider. |
Унаследованные члены
Переменные
| gameObject | The game object this component is attached to. A component is always attached to a game object. |
| tag | Тег данного игрового объекта. |
| transform | The Transform attached to this GameObject (null if there is none attached). |
| hideFlags | Should the object be hidden, saved with the scene or modifiable by the user? |
| name | The name of the object. |
Открытые функции
| BroadcastMessage | Вызывает метод названный methodName на каждом MonoBehaviour этого game object-а или любого из его потомков. |
| CompareTag | Помечен ли этот игровой объект тэгом tag? |
| GetComponent | Возвращает компонент типа type, если он прикреплен к игровому объекту и null, если не прикреплен. |
| GetComponentInChildren | Returns the component of Type type in the GameObject or any of its children using depth first search. |
| GetComponentInParent | Returns the component of Type type in the GameObject or any of its parents. |
| GetComponents | Returns all components of Type type in the GameObject. |
| GetComponentsInChildren | Returns all components of Type type in the GameObject or any of its children. |
| GetComponentsInParent | Returns all components of Type type in the GameObject or any of its parents. |
| SendMessage | Вызывает метод с именем methodName в каждом MonoBehaviour на этом объекте. |
| SendMessageUpwards | Вызывает на каждом MonoBehaviour в данном игровом объекте и на каждом предке скрипта метод с именем methodName. |
| GetInstanceID | Returns the instance id of the object. |
| ToString | Returns the name of the game object. |
Статические функции
| Destroy | Removes a gameobject, component or asset. |
| DestroyImmediate | Destroys the object obj immediately. You are strongly recommended to use Destroy instead. |
| DontDestroyOnLoad | Makes the object target not be destroyed automatically when loading a new scene. |
| FindObjectOfType | Returns the first active loaded object of Type type. |
| FindObjectsOfType | Returns a list of all active loaded objects of Type type. |
| Instantiate | Returns a copy of the object original. |
Операторы
| bool | Does the object exist? |
| operator != | Compares if two objects refer to a different object. |
| operator == | Compares two object references to see if they refer to the same object. |
Как можно остановить объект, имеющий rigidbody, во время прыжка?
Есть объект, имеющий rigidbody. При нажатии на клавишу «Space» происходит увеличение его ускорения (velocity), и затем её понижение. Каким образом можно вставить в момент наивысшей точки задержку? Так, чтобы объект вёл себя как на земле в течение пары секунд. Мог пройти пару шагов, сделать какое-то действие, и затем упасть.
[Header("Keyboard Input Settings")] public KeyCode JumpButton = KeyCode.Space; public KeyCode AttackButton = KeyCode.E; private bool wasDelayedOnce = false; private PlayerBehaviour _player; public AnimationCurve JumpCurve; public float JumpTime; void Start() < _player = GetComponent(); > void Update() < if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.D)) _player.runDir = _player.MInput; if (_player.Acc) < _player.Speed = Mathf.Lerp(_player.Speed, _player.AccelerationPower, _player.AccelerationTime * Time.deltaTime); >else < _player.Speed = Mathf.Lerp(_player.Speed, 0f, _player.DecelerationTime * Time.deltaTime); >> public void KeyboardWalkAndAttack() < _player.MInput = Input.GetAxisRaw("Horizontal"); if (Input.GetKeyDown(AttackButton)) // атаковать enemy < if (_player.Anim.GetBool("Attack") == false) < Debug.Log("Pressing E"); _player.DetectEnemy(); >> if (Input.GetKey(KeyCode.A)|| Input.GetKey(KeyCode.D)) < _player.Acc = true; >else if(Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D)) < _player.Acc = false; //_player.Speed = 0f; >if (_player.Acc) < _player.rb.velocity = new Vector2(_player.MInput * _player.Speed, _player.rb.velocity.y); >else < _player.rb.velocity = new Vector2(_player.runDir * _player.Speed, _player.rb.velocity.y); >_player.isGrounded = Physics2D.OverlapCircle(_player.Feet.position, _player.feetRadius, _player.Groundlayer); KeyboardJump(); > public void KeyboardJump() < if (!_player.DoubleJump) < if (Input.GetKeyDown(JumpButton) && _player.isGrounded) < _player.JumpingVelocity = JumpCurve.Evaluate(JumpTime); _player.rb.velocity = Vector2.up * _player.JumpingVelocity; >if (_player.rb.velocity.y < 0) //Ускорение падения < _player.rb.velocity = new Vector2(_player.rb.velocity.x, _player.rb.velocity.y * _player.FallAccelerationValue); >> else < if (Input.GetKeyDown(JumpButton) && _player.JumpsNum < 1) < ++_player.JumpsNum; _player.rb.velocity = (Vector2.up * _player.JumpingVelocity) + new Vector2(_player.rb.velocity.x, 0); >else if (_player.isGrounded && _player.JumpsNum > 0) < _player.JumpsNum = 0; >> >
Функция KeyboardWalkAndAttack вызывается раз в Update из функции PlayerBehaviour . Подскажите, пожалуйста, направление движения.
Rigidbody
Adding a Rigidbody component to an object will put its motion under the control of Unity’s physics engine. Even without adding any code, a Rigidbody object will be pulled downward by gravity and will react to collisions with incoming objects if the right Collider component is also present.
Rigidbody также имеет scripting API, который позволит вам применить силы к объекту и контролировать его на физически реалистичном пути. Например, поведение машины может быть определено в силах, приложенных к колесам. Учитывая эту информацию, физический движок может справляться с множеством других аспектов движения машины, она будет реалистично ускоряться и корректно реагировать на коллизии.
В скрипте функция FixedUpdate рекомендуется как место для применения сил и изменения настроек Rigidbody (в противоположность Update, которая используется для большинства других задач). Причина этого в том, что физика обновляется в измеряемых временных шагах, которые не совпадают с обновлением кадров. FixedUpdate вызывается немедленно перед каждым физическим обновлением и все изменения, сделанные в нем , будут обработаны сразу же.
Большинство проблем при запуске с Rigidbody в том, что игровая физика кажется запущенной в режиме «slow motion» (замедленного движения). На самом деле это из за масштаба (scale) ваших моделей. Настройки гравитации по умолчанию допускают что один мировой юнит (единица) соответствует одному метру. В играх без использования физики юниты не имеют особого значения, можно сделать их всех масштабом в 100. Но когда используется физика, они будут обработаны как очень большие объекты. Если большой масштаб используется для объектов, которые должны быть маленькими, они будут казаться падающими очень медленно — физический движок будет принимать их за большие объекты, падающие на очень большое расстояние. Имея это ввиду, не забудьте сохранить масштаб ваших объектов более-менее приближенном к реальному (для автомобиля это примерно 4 юнита = 4 метра, к примеру).
Variables
| angularDrag | Угловое торможение объекта. |
| angularVelocity | The angular velocity vector of the rigidbody measured in radians per second. |
| centerOfMass | Центр массы относительно источника transform. |
| collisionDetectionMode | Режим обнаружения коллизии Rigidbody. |
| constraints | Управляет тем, какая степень свободы допустима при симуляции данного Rigidbody. |
| detectCollisions | Должно ли определение коллизии быть активным? (по умолчанию оно активно всегда). |
| drag | Торможение объекта. |
| freezeRotation | Контролирует будет ли физика изменять вращение объекта. |
| inertiaTensor | Диагональный тензор инерции массы относительно центра массы. |
| inertiaTensorRotation | Вращение тензора инерции. |
| interpolation | Интерполяция позволит вам сгладить эффект работающей физики по числу фиксированной частоты кадров. |
| isKinematic | Контролирует влияние физики на твердое тело. |
| mass | Масса физического тела. |
| maxAngularVelocity | The maximimum angular velocity of the rigidbody measured in radians per second. (Default 7) range < 0, infinity >. |
| maxDepenetrationVelocity | Скорость твердого тела к точке мировой точке в глобальном пространстве. |
| position | Позиция твердого тела. |
| rotation | The rotation of the Rigidbody. |
| sleepThreshold | Линейная скорость, ниже которой объекты начинают погружаться в сон (По умолчанию 0.14), диапазон . |
| solverIterations | solverIterationCount определяет насколько точные решения принимают суставы и связи. |
| solverVelocityIterations | The solverVelocityIterations affects how how accurately Rigidbody joints and collision contacts are resolved. Overrides Physics.defaultSolverVelocityIterations. Must be positive. |
| useGravity | Контролирует, оказывает ли влияние гравитация на твердое тело. |
| velocity | The velocity vector of the rigidbody. It represents the rate of change of Rigidbody position. |
| worldCenterOfMass | Центр масс твердого тела в мировом пространстве. |
Public Functions
| AddExplosionForce | Применение силы к твердому телу имитирует эффект взрыва. Сила взрыва убывает линейно относительно расстояния до твердого тела. |
| AddForce | Добавляет крутящий момент к физическому телу. |
| AddForceAtPosition | Применяет силу к / позиции/. В результате будет применено торможение и сила к объекту. |
| AddRelativeForce | Добавление силы к твердому телу относительно его системы координат. |
| AddRelativeTorque | Добавление силы к твердому телу относительно его системы координат. |
| AddTorque | Добавляет крутящий момент к физическому телу. |
| ClosestPointOnBounds | Ближайшая точка к ограничивающей рамке прикрепленных коллайдеров. |
| GetPointVelocity | Скорость твердого тела к точке мировой точке в глобальном пространстве. |
| GetRelativePointVelocity | Скорость относительно точки твердого тела (относительной точки). |
| IsSleeping | Твердое тело спит? |
| MovePosition | Moves the kinematic Rigidbody towards position. |
| MoveRotation | Вращает твердое тело к вращение. |
| ResetCenterOfMass | Масса физического тела. |
| ResetInertiaTensor | inertiaTensorRotation вращает тензор инерции. |
| SetDensity | Назначить массу, основанную на прикрепленных коллайдерах, при условии постоянной плотности. |
| Sleep | Отправляет твердое тело в сон по меньшей мере на один кадр. |
| SweepTest | Tests if a rigidbody would collide with anything, if it was moved through the Scene. |
| SweepTestAll | Похож на Rigidbody.SweepTest, но возвращает все прикосновения. |
| WakeUp | Силы для пробуждения твердого тела. |
Messages
| OnCollisionEnter | OnCollisionEnter вызывается, когда этот collider/rigidbody начал соприкосновение с другим rigidbody/collider. |
| OnCollisionExit | OnCollisionExit вызывается, когда collider/rigidbody прекращает контакт с другим rigidbody/collider. |
| OnCollisionStay | OnCollisionStay вызывается один раз в кадр для каждого collider/rigidbody, который касается другого rigidbody/collider. |
Inherited members
Variables
| gameObject | Игровой объект к которому прикреплён данный компонент. Компонент всегда прикреплён к игровому объекту. |
| tag | Тег данного игрового объекта. |
| 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 Functions
| BroadcastMessage | Вызывает метод названный methodName на каждом MonoBehaviour этого game object-а или любого из его потомков. |
| CompareTag | Помечен ли данный игровой объект тегом tag? |
| GetComponent | Возвращает компонент типа type, если он прикреплен к игровому объекту и null, если не прикреплен. |
| GetComponentInChildren | Возвращает компонент типа type в GameObject или некоторого его потомка через поиск в глубину. |
| GetComponentInParent | Возвращает все компоненты типа type из GameObject’а или из любого его родителя. |
| GetComponents | Возвращает все компоненты типа type в GameObject. |
| GetComponentsInChildren | Возвращает все компоненты типа type в GameObject или любому из его потомков. |
| GetComponentsInParent | Возвращает все компоненты типа type в GameObject или любому из его родителей. |
| SendMessage | Вызывает метод с названием methodName в каждом MonoBehaviour в этом игровом объекте. |
| SendMessageUpwards | Вызывает метод с именем methodName в каждом MonoBehaviour в этом игровом объекте и в каждом предке поведения. |
| TryGetComponent | Gets the component of the specified type, if it exists. |
| GetInstanceID | Returns the instance id of the object. |
| ToString | Returns the name of the object. |
Static Functions
| 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 | Returns a list of all active loaded objects of Type type. |
| Instantiate | Clones the object original and returns the clone. |
Operators
| bool | Does the object exist? |
| operator != | Compares if two objects refer to a different object. |
| operator == | Compares two object references to see if they refer to the same object. |