Unity. Заменить конструкцию проверки существования компонента (GetComponent<>())
Интересует вопрос, как можно заменить конструкции проверки компонента на менее объёмные, и можно ли это вообще сделать?
Пример:
if (GetComponent<Rigidbody>())
GetComponent<Rigidbody>().AddForce(...);
Или другой:
if (GetComponent<Rigidbody>())
_rb = GetComponent<Rigidbody>();
Ответы (1 шт):
Автор решения: KOTlK
→ Ссылка
if (...TryGetComponent(out ComponentType component)
{
component...
}
и далее уже к component обращаться. Вообще, судя по твоему примеру, тебе этот компонент можно единожды в Awake закэшировать:
private Rigidbody _rigidbody;
private void Awake()
{
_rigidbody = GetComponent<Rigidody>();
}
и потом уже по ссылке обращаться _rigidbody.AddForce(...).
И, чтобы не делать проверку во втором случае, нужно добавлять атрибут RequireComponent к твоему MonoBehaviour компоненту и тогда, если нужного компонента нет, то он при старте сцены добавится либо просто не даст повесить скрипт на объект, у которого нет нужных компонентов.
[RequireComponent(typeof(Rigidbody))]
public class SomeComponent : MonoBehaviour
{
private Rigidbody _rigidbody;
private void Awake()
{
_rigidbody = GetComponent<Rigidody>();
}
private void OnCollisionEnter(Collision other)
{
if (other.gameObject.TryGetComponent(out IDamageable damageable))
{
damageable.ApplyDamage(10f);
}
}
public void Move(Vector3 direction)
{
_rb.velocity = direction;
}
}
Что-то типа этого.