diff --git a/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs b/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs index 569d8b14..f4128814 100644 --- a/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs @@ -7,7 +7,7 @@ namespace NewHorizons.Atmosphere { static class VolumesBuilder { - public static void Make(GameObject body, float innerRadius, float outerRadius) + public static void Make(GameObject body, float innerRadius, float outerRadius, IPlanetConfig config) { GameObject volumesGO = new GameObject("Volumes"); volumesGO.SetActive(false); @@ -24,17 +24,18 @@ namespace NewHorizons.Atmosphere SS.pointChecksOnly = true; SS.radius = outerRadius; - /*OWTriggerVolume trigvol = */ rulesetGO.AddComponent(); PlanetoidRuleset PR = rulesetGO.AddComponent(); - PR.SetValue("_altitudeFloor", innerRadius); - PR.SetValue("_altitudeCeiling", outerRadius); + PR._altitudeFloor = innerRadius; + PR._altitudeCeiling = outerRadius; + PR._useMinimap = !config.Base.IsSatellite; + PR._useAltimeter = !config.Base.IsSatellite; EffectRuleset ER = rulesetGO.AddComponent(); - ER.SetValue("_type", EffectRuleset.BubbleType.Underwater); - ER.SetValue("_material", GameObject.Find("RulesetVolumes_GD").GetComponent().GetValue("_material")); - ER.SetValue("_cloudMaterial", GameObject.Find("RulesetVolumes_GD").GetComponent().GetValue("_cloudMaterial")); + ER._type = EffectRuleset.BubbleType.Underwater; + ER._material = GameObject.Find("RulesetVolumes_GD").GetComponent().GetValue("_material"); + ER._cloudMaterial = GameObject.Find("RulesetVolumes_GD").GetComponent().GetValue("_cloudMaterial"); volumesGO.transform.localPosition = Vector3.zero; rulesetGO.SetActive(true); diff --git a/NewHorizons/Builder/General/RFVolumeBuilder.cs b/NewHorizons/Builder/General/RFVolumeBuilder.cs index c93811f9..4e17d11d 100644 --- a/NewHorizons/Builder/General/RFVolumeBuilder.cs +++ b/NewHorizons/Builder/General/RFVolumeBuilder.cs @@ -22,22 +22,22 @@ namespace NewHorizons.Builder.General ReferenceFrameVolume RFV = rfGO.AddComponent(); ReferenceFrame RV = new ReferenceFrame(rigidbody); - RV.SetValue("_minSuitTargetDistance", sphereOfInfluence); - RV.SetValue("_maxTargetDistance", 0); - RV.SetValue("_autopilotArrivalDistance", sphereOfInfluence * 2f); - RV.SetValue("_autoAlignmentDistance", sphereOfInfluence * 1.5f); + RV._minSuitTargetDistance = sphereOfInfluence; + RV._maxTargetDistance = 0; + RV._autopilotArrivalDistance = 2.0f * sphereOfInfluence; + RV._autoAlignmentDistance = sphereOfInfluence * 1.5f; + + RV._hideLandingModePrompt = false; + RV._matchAngularVelocity = true; + RV._minMatchAngularVelocityDistance = 70; + RV._maxMatchAngularVelocityDistance = 400; + RV._bracketsRadius = sphereOfInfluence; - RV.SetValue("_hideLandingModePrompt", false); - RV.SetValue("_matchAngularVelocity", true); - RV.SetValue("_minMatchAngularVelocityDistance", 70); - RV.SetValue("_maxMatchAngularVelocityDistance", 400); - RV.SetValue("_bracketsRadius", sphereOfInfluence); - - RFV.SetValue("_referenceFrame", RV); - RFV.SetValue("_minColliderRadius", sphereOfInfluence); - RFV.SetValue("_maxColliderRadius", sphereOfInfluence * 2f); - RFV.SetValue("_isPrimaryVolume", true); - RFV.SetValue("_isCloseRangeVolume", false); + RFV._referenceFrame = RV; + RFV._minColliderRadius = sphereOfInfluence; + RFV._maxColliderRadius = sphereOfInfluence * 2f; + RFV._isPrimaryVolume = true; + RFV._isCloseRangeVolume = false; rfGO.SetActive(true); } diff --git a/NewHorizons/Builder/General/SpawnPointBuilder.cs b/NewHorizons/Builder/General/SpawnPointBuilder.cs index 37b5a2d6..cd54f9a7 100644 --- a/NewHorizons/Builder/General/SpawnPointBuilder.cs +++ b/NewHorizons/Builder/General/SpawnPointBuilder.cs @@ -22,7 +22,7 @@ namespace NewHorizons.Builder.General playerSpawn = spawnGO.AddComponent(); spawnGO.transform.rotation = Quaternion.FromToRotation(Vector3.up, (playerSpawn.transform.position - body.transform.position).normalized); - spawnGO.transform.position = spawnGO.transform.position + spawnGO.transform.TransformDirection(Vector3.up) * 2f; + spawnGO.transform.position = spawnGO.transform.position + spawnGO.transform.TransformDirection(Vector3.up) * 4f; GameObject.FindObjectOfType().SetInitialSpawnPoint(playerSpawn); } @@ -41,7 +41,7 @@ namespace NewHorizons.Builder.General ship.transform.position = spawnPoint.transform.position; ship.transform.rotation = Quaternion.FromToRotation(Vector3.up, (spawnPoint.transform.position - body.transform.position).normalized); // Move it up a bit more - ship.transform.position = ship.transform.position + ship.transform.TransformDirection(Vector3.up) * 5f; + ship.transform.position = ship.transform.position + ship.transform.TransformDirection(Vector3.up) * 4f; ship.GetRequiredComponent().SetBodyToMatch(rb); diff --git a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs index aa71f286..1f84fcee 100644 --- a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs +++ b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs @@ -21,10 +21,15 @@ namespace NewHorizons.Builder.Orbital return Update(initialMotion, body, primaryBody, OWRB, orbit); } + public static float SiderealPeriodToAngularSpeed(float siderealPeriod) + { + return siderealPeriod == 0 ? 0f : 2f * Mathf.PI / (siderealPeriod * 60f); + } + public static InitialMotion Update(InitialMotion initialMotion, GameObject body, AstroObject primaryBody, OWRigidbody OWRB, OrbitModule orbit) { // Rotation - initialMotion.SetValue("_initAngularSpeed", orbit.SiderealPeriod == 0 ? 0f : 2f * Mathf.PI / (orbit.SiderealPeriod * 60f)); + initialMotion.SetValue("_initAngularSpeed", SiderealPeriodToAngularSpeed(orbit.SiderealPeriod)); var rotationAxis = Quaternion.AngleAxis(orbit.AxialTilt + 90f, Vector3.right) * Vector3.up; body.transform.rotation = Quaternion.FromToRotation(Vector3.up, rotationAxis); diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 7970b7e0..cbfc88ea 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -16,10 +16,12 @@ namespace NewHorizons.Builder.Props { public static void Make(GameObject go, Sector sector, IPlanetConfig config, IModAssets assets, string uniqueModName, PropModule.DetailInfo detail) { + GameObject detailGO = null; + if (detail.assetBundle != null) { var prefab = PropBuildManager.LoadPrefab(detail.assetBundle, detail.path, uniqueModName, assets); - MakeDetail(go, sector, prefab, detail.position, detail.rotation, detail.scale, detail.alignToNormal, detail.generateColliders); + detailGO = MakeDetail(go, sector, prefab, detail.position, detail.rotation, detail.scale, detail.alignToNormal); } else if (detail.objFilePath != null) { @@ -27,24 +29,33 @@ namespace NewHorizons.Builder.Props { var prefab = assets.Get3DObject(detail.objFilePath, detail.mtlFilePath); prefab.SetActive(false); - MakeDetail(go, sector, prefab, detail.position, detail.rotation, detail.scale, detail.alignToNormal, detail.generateColliders); + detailGO = MakeDetail(go, sector, prefab, detail.position, detail.rotation, detail.scale, detail.alignToNormal); } catch (Exception e) { Logger.LogError($"Could not load 3d object {detail.objFilePath} with texture {detail.mtlFilePath} : {e.Message}"); } } - else MakeDetail(go, sector, detail.path, detail.position, detail.rotation, detail.scale, detail.alignToNormal, detail.generateColliders); + else detailGO = MakeDetail(go, sector, detail.path, detail.position, detail.rotation, detail.scale, detail.alignToNormal); + + if(detailGO != null && detail.removeChildren != null) + { + foreach(var childPath in detail.removeChildren) + { + var childObj = SearchUtilities.Find(SearchUtilities.GetPath(detailGO.transform) + "/" + childPath); + childObj.gameObject.SetActive(false); + } + } } - public static GameObject MakeDetail(GameObject go, Sector sector, string propToClone, MVector3 position, MVector3 rotation, float scale, bool alignWithNormal, bool generateColliders) + public static GameObject MakeDetail(GameObject go, Sector sector, string propToClone, MVector3 position, MVector3 rotation, float scale, bool alignWithNormal) { var prefab = SearchUtilities.Find(propToClone); if (prefab == null) Logger.LogError($"Couldn't find detail {propToClone}"); - return MakeDetail(go, sector, prefab, position, rotation, scale, alignWithNormal, generateColliders); + return MakeDetail(go, sector, prefab, position, rotation, scale, alignWithNormal); } - public static GameObject MakeDetail(GameObject go, Sector sector, GameObject prefab, MVector3 position, MVector3 rotation, float scale, bool alignWithNormal, bool generateColliders) + public static GameObject MakeDetail(GameObject go, Sector sector, GameObject prefab, MVector3 position, MVector3 rotation, float scale, bool alignWithNormal) { if (prefab == null) return null; @@ -77,7 +88,11 @@ namespace NewHorizons.Builder.Props if (component is GhostIK) (component as GhostIK).enabled = false; if (component is GhostEffects) (component as GhostEffects).enabled = false; - if (component is Animator) Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => (component as Animator).enabled = true); + // If it's not a moving anglerfish make sure the anim controller is off + if(component is AnglerfishAnimController && component.GetComponentInParent() == null) + Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => (component as AnglerfishAnimController).enabled = false); + + if (component is Animator) Main.Instance.ModHelper.Events.Unity.FireInNUpdates(() => (component as Animator).enabled = true, 5); if (component is Collider) Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => (component as Collider).enabled = true); if(component is Shape) Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => (component as Shape).enabled = true); @@ -104,17 +119,6 @@ namespace NewHorizons.Builder.Props Logger.LogError($"Couldn't update AnglerFish chase speed: {e.Message}"); } } - - // Mesh colliders - if (generateColliders) - { - if (component is MeshFilter && component.gameObject.GetComponent() == null) - { - var mesh = (component as MeshFilter).mesh; - if (mesh.isReadable) component.gameObject.AddComponent(); - else Logger.LogError($"Couldn't change mesh for {component.gameObject.name} because it is not readable"); - } - } } prop.transform.position = position == null ? go.transform.position : go.transform.TransformPoint((Vector3)position); diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index 0538fee2..4990c867 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -71,7 +71,7 @@ namespace NewHorizons.Builder.Props height -= 0.2f; } - var prop = DetailBuilder.MakeDetail(go, sector, prefab, (MVector3)(point.normalized * height), null, propInfo.scale, true, propInfo.generateColliders); + var prop = DetailBuilder.MakeDetail(go, sector, prefab, (MVector3)(point.normalized * height), null, propInfo.scale, true); if (propInfo.offset != null) prop.transform.localPosition += prop.transform.TransformVector(propInfo.offset); if (propInfo.rotation != null) prop.transform.rotation *= Quaternion.Euler(propInfo.rotation); points.RemoveAt(randomInd); diff --git a/NewHorizons/Builder/Updater/OrbitUpdater.cs b/NewHorizons/Builder/Updater/OrbitUpdater.cs new file mode 100644 index 00000000..695d9c87 --- /dev/null +++ b/NewHorizons/Builder/Updater/OrbitUpdater.cs @@ -0,0 +1,69 @@ +using NewHorizons.Builder.Orbital; +using NewHorizons.OrbitalPhysics; +using NewHorizons.Utility; +using PacificEngine.OW_CommonResources.Game.Resource; +using PacificEngine.OW_CommonResources.Game.State; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Logger = NewHorizons.Utility.Logger; + +namespace NewHorizons.Builder.Updater +{ + public static class OrbitUpdater + { + public static void Update(NewHorizonsBody body, GameObject go) + { + var mapping = Planet.defaultMapping; + var heavenlyBody = CommonResourcesUtilities.HeavenlyBodyFromAstroObject(AstroObjectLocator.GetAstroObject(body.Config.Name)); + + Logger.Log($"Updating position of {body.Config.Name}/{heavenlyBody}"); + + if (heavenlyBody != HeavenlyBody.None) + { + var original = mapping[heavenlyBody]; + + var coords = OrbitalHelper.KeplerCoordinatesFromOrbitModule(body.Config.Orbit); + + var parent = original.state.parent; + if (body.Config.Orbit.PrimaryBody != null) + { + var parentAO = AstroObjectLocator.GetAstroObject(body.Config.Orbit.PrimaryBody); + var newParent = CommonResourcesUtilities.HeavenlyBodyFromAstroObject(parentAO); + if (newParent != HeavenlyBody.None) + { + Logger.LogWarning($"Sorry, can't change primary body for planets yet. You tried making {body.Config.Name} orbit {newParent}"); + /* + parent = newParent; + // Have to change the gravity stuff + go.GetComponentInChildren()._detectableFields = new ForceVolume[] { parentAO.GetGravityVolume() }; + go.GetComponent()._primaryBody = parentAO; + */ + } + else Logger.LogError($"Couldn't find new parent {body.Config.Orbit.PrimaryBody}"); + } + + var planetoid = new Planet.Plantoid( + original.size, + original.gravity, + go.transform.rotation, + InitialMotionBuilder.SiderealPeriodToAngularSpeed(body.Config.Orbit.SiderealPeriod), + parent, + coords + ); + + mapping[heavenlyBody] = planetoid; + + Planet.defaultMapping = mapping; + Planet.mapping = mapping; + } + else + { + Logger.LogError($"Couldn't find heavenlyBody for {body.Config.Name}"); + } + } + } +} diff --git a/NewHorizons/External/OrbitModule.cs b/NewHorizons/External/OrbitModule.cs index 5e005f2a..d8ec66b4 100644 --- a/NewHorizons/External/OrbitModule.cs +++ b/NewHorizons/External/OrbitModule.cs @@ -9,7 +9,7 @@ namespace NewHorizons.External { public class OrbitModule : Module { - public int SemiMajorAxis { get; set; } = 5000; + public int SemiMajorAxis { get; set; } public float Inclination { get; set; } public string PrimaryBody { get; set; } public bool IsMoon { get; set; } diff --git a/NewHorizons/External/PlanetConfig.cs b/NewHorizons/External/PlanetConfig.cs index 4724d3a2..cf71a576 100644 --- a/NewHorizons/External/PlanetConfig.cs +++ b/NewHorizons/External/PlanetConfig.cs @@ -33,7 +33,7 @@ namespace NewHorizons.External public PlanetConfig(Dictionary dict) { - // Always have to have a base module and orbit module + // Always have to have a base module Base = new BaseModule(); Orbit = new OrbitModule(); diff --git a/NewHorizons/External/PropModule.cs b/NewHorizons/External/PropModule.cs index dfe7455c..2d35bfe3 100644 --- a/NewHorizons/External/PropModule.cs +++ b/NewHorizons/External/PropModule.cs @@ -25,7 +25,6 @@ namespace NewHorizons.External public MVector3 offset; public MVector3 rotation; public float scale { get; set; } = 1f; - public bool generateColliders = false; } public class DetailInfo @@ -38,7 +37,7 @@ namespace NewHorizons.External public MVector3 rotation; public float scale { get; set; } = 1f; public bool alignToNormal; - public bool generateColliders = false; + public string[] removeChildren; } public class RaftInfo diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 4d81d809..29d4b03b 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -4,6 +4,7 @@ using NewHorizons.Builder.Body; using NewHorizons.Builder.General; using NewHorizons.Builder.Orbital; using NewHorizons.Builder.Props; +using NewHorizons.Builder.Updater; using NewHorizons.Components; using NewHorizons.External; using NewHorizons.External.VariableSize; @@ -14,6 +15,8 @@ using OWML.Common; using OWML.ModHelper; using OWML.Utils; using PacificEngine.OW_CommonResources.Game.Player; +using PacificEngine.OW_CommonResources.Game.Resource; +using PacificEngine.OW_CommonResources.Game.State; using System; using System.Collections.Generic; using System.IO; @@ -421,7 +424,16 @@ namespace NewHorizons } // Do stuff that's shared between generating new planets and updating old ones - return SharedGenerateBody(body, go, sector, rb); + go = SharedGenerateBody(body, go, sector, rb); + + // Update a position using CommonResources + // Since orbits are always there just check if they set a semi major axis + if (body.Config.Orbit != null && body.Config.Orbit.SemiMajorAxis != 0f) + { + OrbitUpdater.Update(body, go); + } + + return go; } #endregion Load @@ -485,7 +497,7 @@ namespace NewHorizons var sector = MakeSector.Make(go, owRigidBody, sphereOfInfluence * 2f); ao.SetValue("_rootSector", sector); - VolumesBuilder.Make(go, body.Config.Base.SurfaceSize, sphereOfInfluence); + VolumesBuilder.Make(go, body.Config.Base.SurfaceSize, sphereOfInfluence, body.Config); if (body.Config.HeightMap != null) HeightMapBuilder.Make(go, body.Config.HeightMap, body.Mod.Assets); @@ -504,13 +516,7 @@ namespace NewHorizons body.Object = go; // Now that we're done move the planet into place - go.transform.parent = Locator.GetRootTransform(); - go.transform.position = OrbitalHelper.GetCartesian(new OrbitalHelper.Gravity(1, 100), body.Config.Orbit).Item1 + (primaryBody == null ? Vector3.zero : primaryBody.transform.position); - - if (go.transform.position.magnitude > FurthestOrbit) - { - FurthestOrbit = go.transform.position.magnitude + 30000f; - } + UpdatePosition(go, body, primaryBody); // Have to do this after setting position var initialMotion = InitialMotionBuilder.Make(go, primaryBody, owRigidBody, body.Config.Orbit); @@ -603,6 +609,17 @@ namespace NewHorizons return go; } + private void UpdatePosition(GameObject go, NewHorizonsBody body, AstroObject primaryBody) + { + go.transform.parent = Locator.GetRootTransform(); + go.transform.position = OrbitalHelper.GetCartesian(new OrbitalHelper.Gravity(1, 100), body.Config.Orbit).Item1 + (primaryBody == null ? Vector3.zero : primaryBody.transform.position); + + if (go.transform.position.magnitude > FurthestOrbit) + { + FurthestOrbit = go.transform.position.magnitude + 30000f; + } + } + #endregion Body generation #region Change star system diff --git a/NewHorizons/Utility/CommonResourcesUtilities.cs b/NewHorizons/Utility/CommonResourcesUtilities.cs new file mode 100644 index 00000000..b2da17f3 --- /dev/null +++ b/NewHorizons/Utility/CommonResourcesUtilities.cs @@ -0,0 +1,61 @@ +using PacificEngine.OW_CommonResources.Game.Resource; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NewHorizons.Utility +{ + public static class CommonResourcesUtilities + { + public static HeavenlyBody HeavenlyBodyFromAstroObject(AstroObject obj) + { + switch (obj.GetAstroObjectName()) + { + case AstroObject.Name.CustomString: + return HeavenlyBody.FromString(obj.GetCustomName()); + case AstroObject.Name.BrittleHollow: + return HeavenlyBodies.BrittleHollow; + case AstroObject.Name.CaveTwin: + return HeavenlyBodies.EmberTwin; + case AstroObject.Name.Comet: + return HeavenlyBodies.Interloper; + case AstroObject.Name.DarkBramble: + return HeavenlyBodies.DarkBramble; + case AstroObject.Name.DreamWorld: + return HeavenlyBodies.DreamWorld; + case AstroObject.Name.GiantsDeep: + return HeavenlyBodies.GiantsDeep; + case AstroObject.Name.HourglassTwins: + return HeavenlyBodies.HourglassTwins; + case AstroObject.Name.MapSatellite: + return HeavenlyBodies.SatiliteMapping; + case AstroObject.Name.ProbeCannon: + return HeavenlyBodies.ProbeCannon; + case AstroObject.Name.QuantumMoon: + return HeavenlyBodies.QuantumMoon; + case AstroObject.Name.RingWorld: + return HeavenlyBodies.Stranger; + case AstroObject.Name.Sun: + return HeavenlyBodies.Sun; + case AstroObject.Name.SunStation: + return HeavenlyBodies.SunStation; + case AstroObject.Name.TimberHearth: + return HeavenlyBodies.TimberHearth; + case AstroObject.Name.TimberMoon: + return HeavenlyBodies.Attlerock; + case AstroObject.Name.TowerTwin: + return HeavenlyBodies.AshTwin; + case AstroObject.Name.VolcanicMoon: + return HeavenlyBodies.HollowLantern; + case AstroObject.Name.WhiteHole: + return HeavenlyBodies.WhiteHole; + case AstroObject.Name.WhiteHoleTarget: + return HeavenlyBodies.WhiteHoleStation; + default: + return HeavenlyBodies.None; + } + } + } +} diff --git a/NewHorizons/Utility/MColor.cs b/NewHorizons/Utility/MColor.cs index 228ac25a..e18e6b66 100644 --- a/NewHorizons/Utility/MColor.cs +++ b/NewHorizons/Utility/MColor.cs @@ -17,7 +17,7 @@ namespace NewHorizons.Utility public int B { get; } public int A { get; } - public Color32 ToColor32() => new Color(R, G, B, A); + public Color32 ToColor32() => new Color32((byte)R, (byte)G, (byte)B, (byte)A); public Color ToColor() => new Color(R / 255f, G / 255f, B / 255f, A / 255f); } diff --git a/NewHorizons/Utility/SearchUtilities.cs b/NewHorizons/Utility/SearchUtilities.cs index 876ed4c1..953fe211 100644 --- a/NewHorizons/Utility/SearchUtilities.cs +++ b/NewHorizons/Utility/SearchUtilities.cs @@ -99,60 +99,68 @@ namespace NewHorizons.Utility public static GameObject Find(string path) { - var go = GameObject.Find(path); - - var names = path.Split(new char[] { '\\', '/' }); - if (go == null) + try { + var go = GameObject.Find(path); - // Get the root object and hope its the right one - var root = GameObject.Find(names[0]); - if (root == null) root = FindObjectOfTypeAndName(names[0]); - - var t = root?.transform; - if (t == null) + var names = path.Split(new char[] { '\\', '/' }); + if (go == null) { - Logger.LogWarning($"Couldn't find root object in path ({names[0]})"); - return null; - } - for (int i = 1; i < names.Length; i++) - { - var child = t.transform.Find(names[i]); + // Get the root object and hope its the right one + var root = GameObject.Find(names[0]); + if (root == null) root = FindObjectOfTypeAndName(names[0]); - if(child == null) + var t = root?.transform; + if (t == null) { - foreach(Transform c in t.GetComponentsInChildren(true)) + Logger.LogWarning($"Couldn't find root object in path ({names[0]})"); + } + else + { + for (int i = 1; i < names.Length; i++) { - if(t.name.Equals(names[i])) + var child = t.transform.Find(names[i]); + + if (child == null) { - child = c; + foreach (Transform c in t.GetComponentsInChildren(true)) + { + if (t.name.Equals(names[i])) + { + child = c; + break; + } + } + } + + if (child == null) + { + Logger.LogWarning($"Couldn't find object in path ({names[i]})"); + t = null; break; } + + t = child; } } - if (child == null) - { - Logger.LogWarning($"Couldn't find object in path ({names[i]})"); - t = null; - break; - } - - t = child; + go = t?.gameObject; } - go = t?.gameObject; - } + if (go == null) + { + var name = names.Last(); + Logger.LogWarning($"Couldn't find object {path}, will look for potential matches for name {name}"); + go = FindObjectOfTypeAndName(name); + } - if(go == null) + return go; + } + catch(Exception) { - var name = names.Last(); - Logger.LogWarning($"Couldn't find object {path}, will look for potential matches for name {name}"); - go = FindObjectOfTypeAndName(name); + return null; } - - return go; } } }