// Measure the size of the platforms and scenes public void GetObjectSizes(out Vector3[] platformSizes, out Vector3[] sceneSizes, out float largestSceneLength) { platformSizes = new Vector3[platforms.Length]; for (int i = 0; i < platforms.Length; ++i) { if (platforms[i].overrideSize != Vector3.zero) { platformSizes[i] = platforms[i].overrideSize; } else { Renderer platformRenderer = platforms[i].GetComponent <Renderer>(); if (platformRenderer == null) { Debug.LogError("Error: platform " + platforms[i].name + " has no renderer attached and does not override the size. Add a renderer or override the size to remove this error."); platformSizes[i] = Vector3.zero; continue; } platformSizes[i] = platforms[i].GetComponent <Renderer>().bounds.size; Vector3 heightChange = platformSizes[i]; if (platforms[i].slope != PlatformSlope.None) { heightChange.y *= platforms[i].slope == PlatformSlope.Down ? -1 : 1; } else { heightChange.y = 0; } platformSizes[i] = heightChange; } } // the parent scene object must represent the children's size sceneSizes = new Vector3[scenes.Length]; largestSceneLength = 0; for (int i = 0; i < scenes.Length; ++i) { if (scenes[i].overrideSize != Vector3.zero) { sceneSizes[i] = scenes[i].overrideSize; sceneSizes[i] += scenes[i].centerOffset; SceneAppearanceRules sceneAppearanceRule = scenes[i].GetComponent <SceneAppearanceRules>(); if (sceneAppearanceRule.linkedPlatforms.Count == 1) { PlatformObject linkedPlatform = sceneAppearanceRule.linkedPlatforms[0].platform as PlatformObject; if (linkedPlatform.slope == PlatformSlope.None) { sceneSizes[i].y = 0; } } } else { Renderer sceneRenderer = scenes[i].GetComponent <Renderer>(); if (sceneRenderer == null) { Debug.LogError("Error: scene " + scenes[i].name + " has no renderer attached and does not override the size. Add a renderer or override the size to remove this error."); sceneSizes[i] = Vector3.zero; continue; } sceneSizes[i] = scenes[i].GetComponent <Renderer>().bounds.size; sceneSizes[i] += scenes[i].centerOffset; sceneSizes[i].y = 0; SceneAppearanceRules sceneAppearanceRule = scenes[i].GetComponent <SceneAppearanceRules>(); if (sceneAppearanceRule.linkedPlatforms.Count == 1) { PlatformObject linkedPlatform = sceneAppearanceRule.linkedPlatforms[0].platform as PlatformObject; if (linkedPlatform.slope != PlatformSlope.None) { sceneSizes[i].y = linkedPlatform.GetComponent <Renderer>().bounds.size.y *(linkedPlatform.slope == PlatformSlope.Down ? -1 : 1); } } } if (largestSceneLength < sceneSizes[i].z) { largestSceneLength = sceneSizes[i].z; } } // The scene appearance rules need to know how much buffer space there is between the platform and scene if (sceneSizes.Length > 0) { float buffer = (sceneSizes[0].x - platformSizes[0].x) / 2 + platformSizes[0].x; for (int i = 0; i < scenes.Length; ++i) { scenes[i].GetComponent <SceneAppearanceRules>().SetSizes(buffer, sceneSizes[i].z); } } }
public override void OnInspectorGUI() { base.OnInspectorGUI(); GUILayout.Space(10); SceneAppearanceRules sceneAppearanceRules = (SceneAppearanceRules)target; List <PlatformPlacementRule> platformPlacementRules = sceneAppearanceRules.linkedPlatforms; if (PlatformPlacementRuleInspector.showPlatforms(ref platformPlacementRules, true)) { sceneAppearanceRules.linkedPlatforms = platformPlacementRules; EditorUtility.SetDirty(target); } if (addNewLinkedPlatform) { GUILayout.BeginHorizontal(); GUILayout.Label("Target Platform"); targetPlatform = EditorGUILayout.ObjectField(targetPlatform, typeof(PlatformObject), false) as PlatformObject; GUILayout.EndHorizontal(); if (addError.Length > 0) { GUI.contentColor = Color.red; GUILayout.Label(addError); GUI.contentColor = Color.white; } GUILayout.BeginHorizontal(); if (GUILayout.Button("Add")) { int error; if ((error = PlatformPlacementRuleInspector.AddPlatform(ref platformPlacementRules, targetPlatform, true)) == 0) { addNewLinkedPlatform = false; sceneAppearanceRules.linkedPlatforms = platformPlacementRules; EditorUtility.SetDirty(target); } else { switch (error) { case 1: addError = "Error: Target Platform is not set"; break; case 2: addError = "Error: Target Platform has already been added"; break; default: addError = "Unknown Error"; break; } } } if (GUILayout.Button("Cancel")) { addNewLinkedPlatform = false; } GUILayout.EndHorizontal(); } if (!addNewLinkedPlatform && GUILayout.Button("Add Linked Platform")) { addError = ""; addNewLinkedPlatform = true; } }