diff --git a/Assets/Scripts/Runtime/Gameplay/JumpPlayerController.cs b/Assets/Scripts/Runtime/Gameplay/JumpPlayerController.cs index f756155..e16798c 100644 --- a/Assets/Scripts/Runtime/Gameplay/JumpPlayerController.cs +++ b/Assets/Scripts/Runtime/Gameplay/JumpPlayerController.cs @@ -1588,13 +1588,23 @@ namespace DanroJump.Gameplay sourceRenderers.Clear(); wrapRendererClones.Clear(); - if (visualRoot != null) + if (wrapVisualCloneRoot == null) { - sourceRenderers.AddRange(visualRoot.GetComponentsInChildren(true)); + wrapVisualCloneRoot = new GameObject($"{name} Wrap Visuals").transform; + wrapVisualCloneRoot.SetParent(transform, false); + wrapVisualCloneRoot.gameObject.SetActive(false); } - else + + var allRenderers = visualRoot != null + ? visualRoot.GetComponentsInChildren(true) + : GetComponentsInChildren(true); + + foreach (var r in allRenderers) { - sourceRenderers.AddRange(GetComponentsInChildren(true)); + if (r != null && (wrapVisualCloneRoot == null || !r.transform.IsChildOf(wrapVisualCloneRoot))) + { + sourceRenderers.Add(r); + } } if (sourceRenderers.Count == 0) @@ -1602,12 +1612,6 @@ namespace DanroJump.Gameplay return; } - if (wrapVisualCloneRoot == null) - { - wrapVisualCloneRoot = new GameObject($"{name} Wrap Visuals").transform; - wrapVisualCloneRoot.gameObject.SetActive(false); - } - for (var index = sourceRenderers.Count - 1; index >= 0; index--) { var sourceRenderer = sourceRenderers[index]; @@ -1621,6 +1625,59 @@ namespace DanroJump.Gameplay clone.transform.SetParent(wrapVisualCloneRoot, false); wrapRendererClones.Insert(0, clone); } + + RebuildWrapCollider(); + } + + private void RebuildWrapCollider() + { + if (wrapVisualCloneRoot == null) + { + return; + } + + var oldColliders = wrapVisualCloneRoot.GetComponents(); + foreach (var old in oldColliders) + { + if (Application.isPlaying) + { + Destroy(old); + } + else + { + DestroyImmediate(old); + } + } + + var sourceCollider = GetComponent(); + if (sourceCollider != null) + { + if (sourceCollider is BoxCollider2D boxCol) + { + var cloneCol = wrapVisualCloneRoot.gameObject.AddComponent(); + cloneCol.size = boxCol.size; + cloneCol.offset = boxCol.offset; + cloneCol.isTrigger = boxCol.isTrigger; + cloneCol.sharedMaterial = boxCol.sharedMaterial; + } + else if (sourceCollider is CircleCollider2D circleCol) + { + var cloneCol = wrapVisualCloneRoot.gameObject.AddComponent(); + cloneCol.radius = circleCol.radius; + cloneCol.offset = circleCol.offset; + cloneCol.isTrigger = circleCol.isTrigger; + cloneCol.sharedMaterial = circleCol.sharedMaterial; + } + else if (sourceCollider is CapsuleCollider2D capsuleCol) + { + var cloneCol = wrapVisualCloneRoot.gameObject.AddComponent(); + cloneCol.size = capsuleCol.size; + cloneCol.offset = capsuleCol.offset; + cloneCol.direction = capsuleCol.direction; + cloneCol.isTrigger = capsuleCol.isTrigger; + cloneCol.sharedMaterial = capsuleCol.sharedMaterial; + } + } } /// @@ -1660,11 +1717,13 @@ namespace DanroJump.Gameplay CopyWrappedVisuals(new Vector3(wrapOffsetX, 0f, 0f)); } - /// - /// Копирует состояние исходных SpriteRenderer в wrap-клоны. - /// private void CopyWrappedVisuals(Vector3 offset) { + if (wrapVisualCloneRoot != null) + { + wrapVisualCloneRoot.localPosition = offset; + } + for (var index = 0; index < sourceRenderers.Count; index++) { var source = sourceRenderers[index]; @@ -1694,8 +1753,9 @@ namespace DanroJump.Gameplay clone.sortingLayerID = source.sortingLayerID; clone.sortingOrder = source.sortingOrder; clone.sharedMaterial = source.sharedMaterial; - clone.transform.SetPositionAndRotation(source.transform.position + offset, source.transform.rotation); - clone.transform.localScale = source.transform.lossyScale; + clone.transform.localPosition = source.transform.localPosition; + clone.transform.localRotation = source.transform.localRotation; + clone.transform.localScale = source.transform.localScale; clone.gameObject.layer = source.gameObject.layer; } catch (MissingReferenceException)