Как упростить код включения/отключения компонентов через GetComponent

218
24 ноября 2021, 00:40

Как проще и красивей записать следующий код :

RTSCameraController tempRTSCameraController = transform.GetComponent<RTSCameraController> ();
if(tempRTSCameraController) {
    tempRTSCameraController.enabled = true;
}
MouseLook tempMouseLook = transform.GetComponent<MouseLook> ();
if(tempMouseLook) {
    tempMouseLook.enabled = false;
}
ScenarioCamera tempScenarioCamera=transform.GetComponent<ScenarioCamera> ();
if(tempScenarioCamera) {
    tempScenarioCamera.enabled = !valueBool;
}
CameraSwitchBetweenGameObjManager tempCameraSwitchBetweenGameObjManager = transform.GetComponent<CameraSwitchBetweenGameObjManager> ();
if(tempCameraSwitchBetweenGameObjManager) {
    tempCameraSwitchBetweenGameObjManager.enabled = !valueBool;
}
CameraRotateAroundManager tempCameraRotateAroundManager = transform.GetComponent<CameraRotateAroundManager> ();
if(tempCameraRotateAroundManager) {
    tempCameraRotateAroundManager.enabled = valueBool;
}
RTCCamera tempRTCCamera = transform.GetComponent<RTCCamera> ();
if(tempRTCCamera) {
    tempRTCCamera.enabled = valueBool;
}
Answer 1
  1. MonoBehaviour сам по себе имеет методы GetComponent, не нужно для этого каждый раз вызывать this.transform

  2. Сегодня Unity полностью перешла на .NET 4.x, так что стоит использовать его нововведения, а конкретно - Null Propagation. Но для этого свойство enabled нужно обернуть в расширение класса MoniBehaviour:

  3. Зачем изначально вешать компоненты, которые будут отключены по флагу? Делайте if(flag) this.AddComponent<T>();

Что там за логика в коде в целом, я не знаю, поэтому приведу код с улучшениями из пунктов 1-2:

public class NullPropagation : MonoBehaviour
{
    void SomeMethod(bool valueBool) {    
        GetComponent<RTSCameraController>()              ?.SetActive(true);
        GetComponent<MouseLook>()                        ?.SetActive(false);
        GetComponent<ScenarioCamera>()                   ?.SetActive(!valueBool);
        GetComponent<CameraSwitchBetweenGameObjManager>()?.SetActive(!valueBool);
        GetComponent<CameraRotateAroundManager>()        ?.SetActive(valueBool);
        GetComponent<RTCCamera>()                        ?.SetActive(valueBool);
    }
}

public static class Utility {
    public static void SetActive(this MonoBehaviour obj, bool active) {
        obj.enabled = active;
    }
}
READ ALSO
Поток из консоли и с чем его едят

Поток из консоли и с чем его едят

Мне стало интересно, что именно происходит в данном коде:

116
Обновление базы данных на сервере данными полученными по почте

Обновление базы данных на сервере данными полученными по почте

Необходимо создать личный кабинет клиента бухгалтерской фирмыВ личном кабинете для пользователя будет доступна информация о сдаче налоговой...

116
Не передается let-переменная js в переменную php методом POST в форме

Не передается let-переменная js в переменную php методом POST в форме

Есть форма, которой нужно передать в php значения переменных var и letПеременные var передаются без проблем, а let не хотят

104