Вызов всех родительских и дочерних узлов — SceneKit

#ios #swift #performance #scenekit #code-cleanup

#iOS #swift #Производительность #scenekit #очистка кода

Вопрос:

У меня есть объект 3D car с некоторыми жестами панорамирования и касания, и все работает нормально. Проблема в том, что мне понадобились определенные ангелы, чтобы камера смотрела на каждую деталь, когда я увеличиваю ее, как на автомобиль, в котором так много деталей, поэтому я написал все родительские и дочерние узлы, чтобы указать каждый из них. Но я чувствую, что это не очень хорошая практика. Есть ли другой способ сделать это?

 let parentNodeName = result.node.parent?.name
        
        
        if parentNodeName == "up-side"{
            scnCameraOrbit.eulerAngles.x = 2.3   Float.pi
            scnCameraOrbit.eulerAngles.y =  Float.pi * 1.0
        }
        else if parentNodeName == "front-side"{
            if nodeName == "window-front"{
                scnCameraOrbit.eulerAngles.x = 2.8   Float.pi
                scnCameraOrbit.eulerAngles.y =  Float.pi   3.16
                           }
          else  if nodeName == "hood"{
                scnCameraOrbit.eulerAngles.x = 2.95   Float.pi
                scnCameraOrbit.eulerAngles.y =  Float.pi   3.16
            }
          else  if nodeName == "bumper-front"{
                scnCameraOrbit.eulerAngles.x = 3.45   Float.pi
                scnCameraOrbit.eulerAngles.y =  Float.pi   3.16
            }
            else{
                scnCameraOrbit.eulerAngles.x = 3.45   Float.pi
                scnCameraOrbit.eulerAngles.y =  Float.pi   3.16
            }
        }
            else if parentNodeName == "back-side"{
            if nodeName == "window-rear"{
                scnCameraOrbit.eulerAngles.x = 2.9   Float.pi
                scnCameraOrbit.eulerAngles.y =  Float.pi * 1.0
            }
            else if nodeName == "bumper-rear"{
                scnCameraOrbit.eulerAngles.x = 3.4   Float.pi
                scnCameraOrbit.eulerAngles.y =  Float.pi * 1.0
            }
            else if nodeName == "trunk"{
                scnCameraOrbit.eulerAngles.x = 3.0   Float.pi
                scnCameraOrbit.eulerAngles.y =  Float.pi * 1.0
            }
            else{
                 scnCameraOrbit.eulerAngles.x = 3.4   Float.pi
                scnCameraOrbit.eulerAngles.y =  Float.pi * 1.0
            }
            }
            else if parentNodeName == "left-side"{
            scnCameraOrbit.eulerAngles.x = -Float.pi * 0.0
            scnCameraOrbit.eulerAngles.y =  -3 * Float.pi * 1.2    
            }
            else if parentNodeName == "right-side"{
            scnCameraOrbit.eulerAngles.x = -Float.pi * 0.0
            scnCameraOrbit.eulerAngles.y =  -2 * Float.pi * 1.2
            }
        else{
            return
        }
  

Ответ №1:

Тесты IF вызываются только один раз при выполнении теста (щелчок), верно? Если да…

Чтобы избежать некоторой сложности вложенных IF, вы можете попробовать некоторые методы перечисления < 24701075 >, довольно много примеров в этом посте — прочитайте внимательно, некоторые из них устарели, и доступны новые функции Swift. Вам понадобится 2 набора (я полагаю), один для имен родительских узлов, а затем один набор для имен узлов. Не уверен в эффективности, но ясность улучшилась бы … мнения разнятся, но читаемость кода и избежание проблем с отладкой обычно являются для меня более приоритетными, если производительность не является реальной проблемой.