From 905248f85ebe45ec7cb31d62b67f96c4c84f1be0 Mon Sep 17 00:00:00 2001 From: Michal Pikulski Date: Thu, 18 Dec 2025 18:49:21 +0100 Subject: [PATCH] Add tracking pins for offscreen targets --- .../Runtime/CustomBootSettings_Runtime.asset | 1 + .../External/Placeholders/direction_pin.png | Bin 0 -> 3943 bytes .../Placeholders/direction_pin.png.meta | 195 +++++++ .../External/Placeholders/pulver_portrait.png | Bin 0 -> 61370 bytes .../Placeholders/pulver_portrait.png.meta | 203 +++++++ .../External/Placeholders/worker_portrait.png | Bin 0 -> 37733 bytes .../Placeholders/worker_portrait.png.meta | 195 +++++++ .../Prefabs/Characters/PlayerCharacter.prefab | 14 + .../Prefabs/Characters/PulverCharacter.prefab | 22 +- .../Airplane/Airplanes/AirPlane.prefab | 17 +- .../Airplane/Airplanes/AirPlane_blue.prefab | 16 +- .../Airplane/Airplanes/AirPlane_red.prefab | 16 +- .../Placeholder_Target_Bob.prefab | 15 + Assets/Prefabs/UI/PinObject.prefab | 343 ++++++++++++ Assets/Prefabs/UI/PinObject.prefab.meta | 7 + Assets/Prefabs/UI/PinTrackingManager.prefab | 51 ++ .../Prefabs/UI/PinTrackingManager.prefab.meta | 7 + Assets/Prefabs/UI/Tracking.meta | 8 + Assets/Scripts/Examples.meta | 3 - Assets/Scripts/Examples/QuickAccessExample.cs | 86 --- .../Examples/QuickAccessExample.cs.meta | 3 - Assets/Scripts/UI/Tracking.meta | 8 + Assets/Scripts/UI/Tracking/OffScreenPin.cs | 237 +++++++++ .../Scripts/UI/Tracking/OffScreenPin.cs.meta | 3 + .../UI/Tracking/OffScreenTrackerManager.cs | 494 ++++++++++++++++++ .../Tracking/OffScreenTrackerManager.cs.meta | 3 + Assets/Scripts/UI/Tracking/TrackableTarget.cs | 84 +++ .../UI/Tracking/TrackableTarget.cs.meta | 2 + .../UI/Tracking/TrackingDistanceSource.cs | 43 ++ .../Tracking/TrackingDistanceSource.cs.meta | 3 + 30 files changed, 1980 insertions(+), 99 deletions(-) create mode 100644 Assets/External/Placeholders/direction_pin.png create mode 100644 Assets/External/Placeholders/direction_pin.png.meta create mode 100644 Assets/External/Placeholders/pulver_portrait.png create mode 100644 Assets/External/Placeholders/pulver_portrait.png.meta create mode 100644 Assets/External/Placeholders/worker_portrait.png create mode 100644 Assets/External/Placeholders/worker_portrait.png.meta create mode 100644 Assets/Prefabs/UI/PinObject.prefab create mode 100644 Assets/Prefabs/UI/PinObject.prefab.meta create mode 100644 Assets/Prefabs/UI/PinTrackingManager.prefab create mode 100644 Assets/Prefabs/UI/PinTrackingManager.prefab.meta create mode 100644 Assets/Prefabs/UI/Tracking.meta delete mode 100644 Assets/Scripts/Examples.meta delete mode 100644 Assets/Scripts/Examples/QuickAccessExample.cs delete mode 100644 Assets/Scripts/Examples/QuickAccessExample.cs.meta create mode 100644 Assets/Scripts/UI/Tracking.meta create mode 100644 Assets/Scripts/UI/Tracking/OffScreenPin.cs create mode 100644 Assets/Scripts/UI/Tracking/OffScreenPin.cs.meta create mode 100644 Assets/Scripts/UI/Tracking/OffScreenTrackerManager.cs create mode 100644 Assets/Scripts/UI/Tracking/OffScreenTrackerManager.cs.meta create mode 100644 Assets/Scripts/UI/Tracking/TrackableTarget.cs create mode 100644 Assets/Scripts/UI/Tracking/TrackableTarget.cs.meta create mode 100644 Assets/Scripts/UI/Tracking/TrackingDistanceSource.cs create mode 100644 Assets/Scripts/UI/Tracking/TrackingDistanceSource.cs.meta diff --git a/Assets/Data/Bootstrap/Runtime/CustomBootSettings_Runtime.asset b/Assets/Data/Bootstrap/Runtime/CustomBootSettings_Runtime.asset index 8936563c..b5e80b82 100644 --- a/Assets/Data/Bootstrap/Runtime/CustomBootSettings_Runtime.asset +++ b/Assets/Data/Bootstrap/Runtime/CustomBootSettings_Runtime.asset @@ -25,3 +25,4 @@ MonoBehaviour: - {fileID: 3528960956969533010, guid: 53eea3840d3cde34a9768b8773a3a7e8, type: 3} - {fileID: 5034240524438268576, guid: b15ba9d3d508ef244b0eeb76404dc9de, type: 3} - {fileID: 7207007194116694737, guid: 7180ae585f0db8044ba048426f72d995, type: 3} + - {fileID: 4983412436654784526, guid: fcb8163ded24853438b30c37ddf2edeb, type: 3} diff --git a/Assets/External/Placeholders/direction_pin.png b/Assets/External/Placeholders/direction_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..2c19f1c82ea0128dc107330f5c91bbc2767ad4c7 GIT binary patch literal 3943 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 blTNQ`UoP0ZdieA8OW=B--^aeyK2pWs=C}!O literal 0 HcmV?d00001 diff --git a/Assets/External/Placeholders/direction_pin.png.meta b/Assets/External/Placeholders/direction_pin.png.meta new file mode 100644 index 00000000..7619436b --- /dev/null +++ b/Assets/External/Placeholders/direction_pin.png.meta @@ -0,0 +1,195 @@ +fileFormatVersion: 2 +guid: 8644828a229b5e34fb635653ae864d8e +TextureImporter: + internalIDToNameTable: + - first: + 213: -3432867975278251356 + second: direction_pin_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: direction_pin_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 600 + height: 600 + alignment: 0 + pivot: {x: 0.5, y: 0.5} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: 4a2b9bcb3c00c50d0800000000000000 + internalID: -3432867975278251356 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 9922cdfd3cfd3a445add26a083e9e24d + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + direction_pin_0: -3432867975278251356 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Placeholders/pulver_portrait.png b/Assets/External/Placeholders/pulver_portrait.png new file mode 100644 index 0000000000000000000000000000000000000000..c5bf3653e4918bcfb79f4e42bc98c5a1935b80b0 GIT binary patch literal 61370 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 F_&=@Y%^d&$ literal 0 HcmV?d00001 diff --git a/Assets/External/Placeholders/pulver_portrait.png.meta b/Assets/External/Placeholders/pulver_portrait.png.meta new file mode 100644 index 00000000..c9a0c8b4 --- /dev/null +++ b/Assets/External/Placeholders/pulver_portrait.png.meta @@ -0,0 +1,203 @@ +fileFormatVersion: 2 +guid: 31cfa2eea2b70af4b97a7a588fad0758 +TextureImporter: + internalIDToNameTable: + - first: + 213: -4695408507704126972 + second: pulver_portrait_0 + - first: + 213: 3051712845612519695 + second: pulver_portrait_1 + - first: + 213: 5677750735195355539 + second: pulver_portrait_2 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: pulver_portrait_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 512 + height: 512 + alignment: 0 + pivot: {x: 0.5, y: 0.5} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: 402d2fee6de86deb0800000000000000 + internalID: -4695408507704126972 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: dcca4d5ff8b0cef4e9930d67f16d1ab3 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: + - key: SpriteEditor.SliceSettings + value: '{"sliceOnImport":false,"gridCellCount":{"x":1.0,"y":1.0},"gridSpriteSize":{"x":512.0,"y":512.0},"gridSpriteOffset":{"x":0.0,"y":0.0},"gridSpritePadding":{"x":0.0,"y":0.0},"pivot":{"x":0.5,"y":0.5},"pivotPixels":{"x":0.0,"y":0.0},"autoSlicingMethod":0,"spriteAlignment":0,"pivotUnitMode":0,"slicingType":2,"keepEmptyRects":false,"isAlternate":false}' + nameFileIdTable: + pulver_portrait_0: -4695408507704126972 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/External/Placeholders/worker_portrait.png b/Assets/External/Placeholders/worker_portrait.png new file mode 100644 index 0000000000000000000000000000000000000000..82f32ed7f74528492053200bde33261d37c15c87 GIT binary patch literal 37733 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 f2qA - /// Example script demonstrating how to use QuickAccess to quickly retrieve and use game objects - /// - public class QuickAccessExample : MonoBehaviour - { - void Start() - { - // Retrieve player and follower objects using QuickAccess - GameObject player = QuickAccess.Instance.PlayerGameObject; - GameObject follower = QuickAccess.Instance.FollowerGameObject; - - // Print info about the player - if (player != null) - { - Logging.Debug($"[QuickAccessExample] Player found: {player.name}"); - Logging.Debug($"[QuickAccessExample] Player position: {player.transform.position}"); - - // Access player controller - var playerController = QuickAccess.Instance.PlayerController; - if (playerController != null) - { - Logging.Debug($"[QuickAccessExample] Player controller found on object"); - } - else - { - Logging.Warning($"[QuickAccessExample] Player controller not found"); - } - } - else - { - Logging.Warning($"[QuickAccessExample] Player not found in scene"); - } - - // Print info about the follower (Pulver) - if (follower != null) - { - Logging.Debug($"[QuickAccessExample] Follower found: {follower.name}"); - Logging.Debug($"[QuickAccessExample] Follower position: {follower.transform.position}"); - - // Access follower controller - var followerController = QuickAccess.Instance.FollowerController; - if (followerController != null) - { - Logging.Debug($"[QuickAccessExample] Follower controller found on object"); - } - else - { - Logging.Warning($"[QuickAccessExample] Follower controller not found"); - } - } - else - { - Logging.Warning($"[QuickAccessExample] Follower not found in scene"); - } - - // Access camera - var camera = QuickAccess.Instance.MainCamera; - if (camera != null) - { - Logging.Debug($"[QuickAccessExample] Main camera found: {camera.name}"); - Logging.Debug($"[QuickAccessExample] Camera position: {camera.transform.position}"); - } - else - { - Logging.Warning($"[QuickAccessExample] Main camera not found"); - } - - // Access managers - try - { - Logging.Debug($"[QuickAccessExample] Game Manager instance accessed: {QuickAccess.Instance.GameManager != null}"); - Logging.Debug($"[QuickAccessExample] Input Manager instance accessed: {QuickAccess.Instance.InputManager != null}"); - } - catch (System.Exception e) - { - Debug.LogError($"[QuickAccessExample] Error accessing managers: {e.Message}"); - } - } - } -} diff --git a/Assets/Scripts/Examples/QuickAccessExample.cs.meta b/Assets/Scripts/Examples/QuickAccessExample.cs.meta deleted file mode 100644 index 1e28d7e1..00000000 --- a/Assets/Scripts/Examples/QuickAccessExample.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: c6086c2645c14cad92be0a9c7c191fdc -timeCreated: 1760105142 \ No newline at end of file diff --git a/Assets/Scripts/UI/Tracking.meta b/Assets/Scripts/UI/Tracking.meta new file mode 100644 index 00000000..8dfd229d --- /dev/null +++ b/Assets/Scripts/UI/Tracking.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2ea2c8cb26e7d7a44b21c052322ab6ba +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/Tracking/OffScreenPin.cs b/Assets/Scripts/UI/Tracking/OffScreenPin.cs new file mode 100644 index 00000000..709331d7 --- /dev/null +++ b/Assets/Scripts/UI/Tracking/OffScreenPin.cs @@ -0,0 +1,237 @@ +using UnityEngine; +using UnityEngine.UI; +using AppleHills.Core; + +namespace UI.Tracking +{ + /// + /// UI pin that displays on screen edges pointing to off-screen targets. + /// Consists of a static icon in the center and a rotatable frame that points toward the target. + /// Optionally displays distance to target if enabled. + /// Updates every frame for smooth tracking. + /// + public class OffScreenPin : MonoBehaviour + { + [Header("References")] + [Tooltip("The image component that displays the target's icon (static, in center)")] + [SerializeField] private Image iconImage; + + [Tooltip("The image component that rotates to point toward the target (default: pointing downward)")] + [SerializeField] private Image frameImage; + + [Tooltip("Optional: Text component to display distance to target")] + [SerializeField] private TMPro.TextMeshProUGUI distanceText; + + private RectTransform _rectTransform; + private TrackableTarget _target; + private bool _isInitialized; + private float _screenPadding; + private bool _trackDistance; + + private void Awake() + { + _rectTransform = GetComponent(); + } + + private void Update() + { + // Update position and rotation every frame for smooth tracking + if (_isInitialized && _target != null) + { + Camera mainCamera = QuickAccess.Instance?.MainCamera; + if (mainCamera != null) + { + UpdatePositionAndRotation(mainCamera, _screenPadding); + } + + // Update distance display if enabled + if (_trackDistance && distanceText != null) + { + UpdateDistanceDisplay(); + } + } + } + + /// + /// Initialize the pin with a target reference and set the icon + /// + public void Initialize(TrackableTarget target, float screenPadding) + { + _target = target; + _isInitialized = true; + _screenPadding = screenPadding; + _trackDistance = target.TrackDistance; + + // Set the icon sprite if available + if (iconImage != null && target.Icon != null) + { + iconImage.sprite = target.Icon; + iconImage.enabled = true; + } + else if (iconImage != null) + { + iconImage.enabled = false; + } + + // Configure distance text + if (distanceText != null) + { + distanceText.gameObject.SetActive(_trackDistance); + } + } + + /// + /// Update the pin's position and rotation based on the target's world position. + /// Called by the manager each update cycle. + /// + public void UpdatePositionAndRotation(Camera cam, float screenPadding) + { + if (!_isInitialized || _target == null) + return; + + // Get target position in screen space + Vector3 targetScreenPos = cam.WorldToScreenPoint(_target.WorldPosition); + + // Calculate direction from screen center to target + Vector2 screenCenter = new Vector2(Screen.width / 2f, Screen.height / 2f); + Vector2 targetScreenPos2D = new Vector2(targetScreenPos.x, targetScreenPos.y); + Vector2 directionToTarget = (targetScreenPos2D - screenCenter).normalized; + + // Calculate screen bounds with padding (inset from edges) + float minX = screenPadding; + float maxX = Screen.width - screenPadding; + float minY = screenPadding; + float maxY = Screen.height - screenPadding; + + // Find intersection point with screen bounds + Vector2 intersectionPoint = CalculateScreenEdgeIntersection( + screenCenter, + directionToTarget, + minX, maxX, minY, maxY + ); + + // Offset the intersection point slightly toward the center to ensure pin is fully visible + Vector2 offsetTowardCenter = -directionToTarget * screenPadding * 0.5f; + Vector2 finalPosition = intersectionPoint + offsetTowardCenter; + + // Update pin position + _rectTransform.position = finalPosition; + + // Update frame rotation to point toward target + // Frame's default orientation points downward (0 degrees in UI space) + // In UI space: 0° = down, 90° = right, 180° = up, 270° = left + // Atan2(y, x) gives angle from right (+X axis), so we need to adjust + float angle = Mathf.Atan2(directionToTarget.y, directionToTarget.x) * Mathf.Rad2Deg; + // Add 90 to convert from "right is 0°" to align with down-pointing sprite + angle = angle + 90f; + + if (frameImage != null) + { + frameImage.rectTransform.localRotation = Quaternion.Euler(0, 0, angle); + } + } + + /// + /// Update the distance display text + /// + private void UpdateDistanceDisplay() + { + // Get distance source (typically the player) + if (TrackingDistanceSource.Instance == null) + { + distanceText.text = "???"; + return; + } + + // Calculate distance between source and target + float distance = Vector3.Distance(TrackingDistanceSource.Instance.WorldPosition, _target.WorldPosition); + + // Format distance nicely (meters with 1 decimal place) + distanceText.text = $"{distance:F1}m"; + } + + /// + /// Calculate the intersection point of a ray from center in given direction with screen bounds + /// + private Vector2 CalculateScreenEdgeIntersection( + Vector2 center, + Vector2 direction, + float minX, float maxX, float minY, float maxY) + { + // Calculate intersection with each edge and find the closest one + float tMin = float.MaxValue; + Vector2 intersection = center; + + // Check intersection with right edge (x = maxX) + if (direction.x > 0.001f) + { + float t = (maxX - center.x) / direction.x; + float y = center.y + t * direction.y; + if (y >= minY && y <= maxY && t < tMin) + { + tMin = t; + intersection = new Vector2(maxX, y); + } + } + + // Check intersection with left edge (x = minX) + if (direction.x < -0.001f) + { + float t = (minX - center.x) / direction.x; + float y = center.y + t * direction.y; + if (y >= minY && y <= maxY && t < tMin) + { + tMin = t; + intersection = new Vector2(minX, y); + } + } + + // Check intersection with top edge (y = maxY) + if (direction.y > 0.001f) + { + float t = (maxY - center.y) / direction.y; + float x = center.x + t * direction.x; + if (x >= minX && x <= maxX && t < tMin) + { + tMin = t; + intersection = new Vector2(x, maxY); + } + } + + // Check intersection with bottom edge (y = minY) + if (direction.y < -0.001f) + { + float t = (minY - center.y) / direction.y; + float x = center.x + t * direction.x; + if (x >= minX && x <= maxX && t < tMin) + { + tMin = t; + intersection = new Vector2(x, minY); + } + } + + return intersection; + } + + /// + /// Reset the pin for pooling reuse + /// + public void ResetPin() + { + _target = null; + _isInitialized = false; + + if (iconImage != null) + { + iconImage.sprite = null; + iconImage.enabled = false; + } + } + + /// + /// Get the current target (for null checking) + /// + public TrackableTarget Target => _target; + } +} + diff --git a/Assets/Scripts/UI/Tracking/OffScreenPin.cs.meta b/Assets/Scripts/UI/Tracking/OffScreenPin.cs.meta new file mode 100644 index 00000000..49605a8f --- /dev/null +++ b/Assets/Scripts/UI/Tracking/OffScreenPin.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 548d13ffdad349b6939e2b873a39b54e +timeCreated: 1766074498 \ No newline at end of file diff --git a/Assets/Scripts/UI/Tracking/OffScreenTrackerManager.cs b/Assets/Scripts/UI/Tracking/OffScreenTrackerManager.cs new file mode 100644 index 00000000..39d189fb --- /dev/null +++ b/Assets/Scripts/UI/Tracking/OffScreenTrackerManager.cs @@ -0,0 +1,494 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using Core; +using Core.Lifecycle; +using AppleHills.Core; + +namespace UI.Tracking +{ + /// + /// Singleton manager that tracks off-screen targets and displays directional pins. + /// Uses ManagedBehaviour pattern and lazily accesses camera via QuickAccess (like AudioManager). + /// + public class OffScreenTrackerManager : ManagedBehaviour + { + [Header("Configuration")] + [Tooltip("Prefab for the off-screen tracking pin")] + [SerializeField] private OffScreenPin pinPrefab; + + [Tooltip("Pixel padding from screen edges (pins appear this many pixels from edge)")] + [SerializeField] private float screenPadding = 50f; + + [Tooltip("Buffer zone in pixels to prevent spawn/despawn flickering (spawn is stricter than despawn)")] + [SerializeField] private float bufferZone = 100f; + + [Tooltip("Time in seconds a target must be off-screen before pin appears")] + [SerializeField] private float spawnDebounceDelay = 0.3f; + + [Tooltip("Time in seconds a target must be on-screen before pin disappears")] + [SerializeField] private float despawnDebounceDelay = 0.2f; + + [Tooltip("Update interval in seconds for checking target visibility")] + [SerializeField] private float updateInterval = 0.1f; + + // Singleton instance + private static OffScreenTrackerManager _instance; + public static OffScreenTrackerManager Instance => _instance; + + // Tracking data + private Dictionary _trackedTargets = new Dictionary(); + + // Pin pooling + private List _inactivePins = new List(); + + // Coroutine tracking + private Coroutine _updateCoroutine; + + // Auto-created canvas for pins + private Canvas _pinCanvas; + private RectTransform _pinContainer; + + /// + /// Nested class to track per-target state and timers + /// + private class TargetTrackingData + { + public TrackableTarget Target; + public OffScreenPin ActivePin; + public float OffScreenTimer; + public float OnScreenTimer; + public bool IsCurrentlyOffScreen; + + public TargetTrackingData(TrackableTarget target) + { + Target = target; + ActivePin = null; + OffScreenTimer = 0f; + OnScreenTimer = 0f; + IsCurrentlyOffScreen = false; + } + } + + internal override void OnManagedAwake() + { + // Set singleton instance + _instance = this; + } + + internal override void OnManagedStart() + { + // Validate configuration + if (pinPrefab == null) + { + Logging.Error("[OffScreenTrackerManager] Pin prefab not assigned!"); + return; + } + + // Create dedicated canvas for pins + CreatePinCanvas(); + + // Subscribe to scene load events from SceneManagerService (like InputManager does) + // This must happen in ManagedStart because SceneManagerService instance needs to be set first + if (SceneManagerService.Instance != null) + { + SceneManagerService.Instance.SceneLoadCompleted += OnSceneLoadCompleted; + Logging.Debug("[OffScreenTrackerManager] Subscribed to SceneLoadCompleted events"); + } + + // Initialize for current scene and start coroutine + InitializeForCurrentScene(); + } + + /// + /// Called when any scene finishes loading. Refreshes camera and restarts coroutine. + /// + private void OnSceneLoadCompleted(string sceneName) + { + Logging.Debug($"[OffScreenTrackerManager] Scene loaded: {sceneName}, reinitializing camera and coroutine"); + InitializeForCurrentScene(); + } + + /// + /// Initialize camera reference and start/restart tracking coroutine for current scene + /// + private void InitializeForCurrentScene() + { + // Stop existing coroutine if running + if (_updateCoroutine != null) + { + StopCoroutine(_updateCoroutine); + _updateCoroutine = null; + Logging.Debug("[OffScreenTrackerManager] Stopped previous coroutine"); + } + + // Start the tracking coroutine (camera accessed lazily via QuickAccess) + _updateCoroutine = StartCoroutine(UpdateTrackingCoroutine()); + Logging.Debug("[OffScreenTrackerManager] Started tracking coroutine"); + } + + internal override void OnManagedDestroy() + { + // Unsubscribe from SceneManagerService events (like InputManager does) + if (SceneManagerService.Instance != null) + { + SceneManagerService.Instance.SceneLoadCompleted -= OnSceneLoadCompleted; + } + } + + private void OnDestroy() + { + // Stop coroutine + if (_updateCoroutine != null) + { + StopCoroutine(_updateCoroutine); + } + + // Clean up pooled pins + foreach (var pin in _inactivePins) + { + if (pin != null) + { + Destroy(pin.gameObject); + } + } + _inactivePins.Clear(); + + // Clean up active pins + foreach (var data in _trackedTargets.Values) + { + if (data.ActivePin != null) + { + Destroy(data.ActivePin.gameObject); + } + } + _trackedTargets.Clear(); + + // Clean up canvas + if (_pinCanvas != null) + { + Destroy(_pinCanvas.gameObject); + } + + // Clear singleton + if (_instance == this) + { + _instance = null; + } + } + + /// + /// Create a dedicated canvas for pins with sort order 50 + /// + private void CreatePinCanvas() + { + // Create a new GameObject for the canvas + GameObject canvasObj = new GameObject("OffScreenPinCanvas"); + canvasObj.transform.SetParent(transform, false); + + // Add and configure Canvas + _pinCanvas = canvasObj.AddComponent(); + _pinCanvas.renderMode = RenderMode.ScreenSpaceOverlay; + _pinCanvas.sortingOrder = 50; + + // Add CanvasScaler for consistent sizing + var scaler = canvasObj.AddComponent(); + scaler.uiScaleMode = UnityEngine.UI.CanvasScaler.ScaleMode.ScaleWithScreenSize; + scaler.referenceResolution = new Vector2(1920, 1080); + scaler.screenMatchMode = UnityEngine.UI.CanvasScaler.ScreenMatchMode.MatchWidthOrHeight; + scaler.matchWidthOrHeight = 0.5f; + + // Add GraphicRaycaster (required for UI) + canvasObj.AddComponent(); + + // Get RectTransform for pin container + _pinContainer = canvasObj.GetComponent(); + + Logging.Debug("[OffScreenTrackerManager] Created dedicated pin canvas with sort order 50"); + } + + /// + /// Register a target for tracking + /// + public void RegisterTarget(TrackableTarget target) + { + if (target == null) + return; + + if (_trackedTargets.ContainsKey(target)) + { + Logging.Warning($"[OffScreenTrackerManager] Target {target.name} is already registered"); + return; + } + + _trackedTargets.Add(target, new TargetTrackingData(target)); + Logging.Debug($"[OffScreenTrackerManager] Registered target: {target.name}"); + } + + /// + /// Unregister a target from tracking + /// + public void UnregisterTarget(TrackableTarget target) + { + if (target == null) + return; + + if (_trackedTargets.TryGetValue(target, out TargetTrackingData data)) + { + // Despawn pin if active + if (data.ActivePin != null) + { + DespawnPin(data); + } + + _trackedTargets.Remove(target); + Logging.Debug($"[OffScreenTrackerManager] Unregistered target: {target.name}"); + } + } + + /// + /// Main update coroutine that runs every updateInterval seconds + /// + private IEnumerator UpdateTrackingCoroutine() + { + Logging.Debug("[OffScreenTrackerManager] Tracking coroutine started"); + WaitForSeconds wait = new WaitForSeconds(updateInterval); + + while (true) + { + yield return wait; + + // Get camera lazily via QuickAccess (like AudioManager does) + Camera mainCamera = QuickAccess.Instance?.MainCamera; + + if (mainCamera == null) + { + // Camera not available yet (early in boot or scene transition) + continue; + } + + // Create list of targets to remove (for null cleanup) + List targetsToRemove = new List(); + + foreach (var kvp in _trackedTargets) + { + TrackableTarget target = kvp.Key; + TargetTrackingData data = kvp.Value; + + // Check if target was destroyed + if (target == null) + { + targetsToRemove.Add(target); + if (data.ActivePin != null) + { + DespawnPin(data); + } + continue; + } + + // Check if target is off-screen + bool isOffScreen = IsTargetOffScreen(target, mainCamera); + + // Update timers and state + if (isOffScreen) + { + // Target is off-screen + data.OffScreenTimer += updateInterval; + data.OnScreenTimer = 0f; + + // Check if we should spawn a pin + if (!data.IsCurrentlyOffScreen && data.OffScreenTimer >= spawnDebounceDelay) + { + data.IsCurrentlyOffScreen = true; + SpawnPin(data); + } + // Pin updates itself every frame, no need to call UpdatePositionAndRotation here + } + else + { + // Target is on-screen + data.OnScreenTimer += updateInterval; + data.OffScreenTimer = 0f; + + // Check if we should despawn the pin + if (data.IsCurrentlyOffScreen && data.OnScreenTimer >= despawnDebounceDelay) + { + data.IsCurrentlyOffScreen = false; + if (data.ActivePin != null) + { + DespawnPin(data); + } + } + } + } + + // Clean up null targets + foreach (var target in targetsToRemove) + { + _trackedTargets.Remove(target); + } + } + } + + /// + /// Check if a target is off-screen by checking its actual bounds. + /// - For SPAWNING: Entire object must be off-screen (all corners outside viewport) + /// - For DESPAWNING: Any part of object on-screen triggers despawn (any corner inside viewport) + /// Uses bufferZone to prevent flickering at boundaries. + /// + private bool IsTargetOffScreen(TrackableTarget target, Camera cam) + { + // Get the world bounds of the target + Bounds worldBounds = target.GetWorldBounds(); + + // Get the 8 corners of the bounds (we only need the min/max points in 2D) + Vector3 min = worldBounds.min; + Vector3 max = worldBounds.max; + + // Convert corners to screen space + Vector3 minScreen = cam.WorldToScreenPoint(new Vector3(min.x, min.y, worldBounds.center.z)); + Vector3 maxScreen = cam.WorldToScreenPoint(new Vector3(max.x, max.y, worldBounds.center.z)); + + // Check if behind camera + if (minScreen.z < 0 && maxScreen.z < 0) + return true; + + // Shrink detection zones to 80% of screen (10% inset on each side) + // This makes spawn/despawn more conservative + float insetPercent = 0.1f; // 10% on each side = 80% total + float horizontalInset = Screen.width * insetPercent; + float verticalInset = Screen.height * insetPercent; + + float screenLeft = horizontalInset; + float screenRight = Screen.width - horizontalInset; + float screenBottom = verticalInset; + float screenTop = Screen.height - verticalInset; + + // Check if ENTIRELY off-screen (all corners outside viewport) + // This is when we should spawn the pin + bool entirelyOffScreenLeft = maxScreen.x < screenLeft; + bool entirelyOffScreenRight = minScreen.x > screenRight; + bool entirelyOffScreenBottom = maxScreen.y < screenBottom; + bool entirelyOffScreenTop = minScreen.y > screenTop; + + bool entirelyOffScreen = entirelyOffScreenLeft || entirelyOffScreenRight || + entirelyOffScreenBottom || entirelyOffScreenTop; + + // Apply buffer zone to prevent flickering + // If already off-screen, require target to move bufferZone pixels on-screen before considering it "on-screen" + // This creates hysteresis to prevent rapid spawn/despawn cycles + if (entirelyOffScreen) + { + return true; // Definitely off-screen + } + + // Check if ANY part is on-screen (for despawn logic) + // We add bufferZone to make despawn slightly more eager + bool anyPartOnScreen = !(minScreen.x > screenRight - bufferZone || + maxScreen.x < screenLeft + bufferZone || + minScreen.y > screenTop - bufferZone || + maxScreen.y < screenBottom + bufferZone); + + // If any part is on-screen (with buffer), consider it "on-screen" (pin should despawn) + return !anyPartOnScreen; + } + + /// + /// Spawn a pin for the given target data + /// + private void SpawnPin(TargetTrackingData data) + { + // Try to get pin from pool + OffScreenPin pin = GetPinFromPool(); + + // Initialize the pin (this also caches the target and settings) + pin.Initialize(data.Target, screenPadding); + + // CRITICAL: Update position BEFORE activating to prevent flicker + // Get camera for immediate position update + Camera mainCamera = QuickAccess.Instance?.MainCamera; + if (mainCamera != null) + { + pin.UpdatePositionAndRotation(mainCamera, screenPadding); + } + + // Now activate the pin at the correct position + pin.gameObject.SetActive(true); + + + data.ActivePin = pin; + + Logging.Debug($"[OffScreenTrackerManager] Spawned pin for target: {data.Target.name}"); + } + + /// + /// Despawn a pin and return it to the pool + /// + private void DespawnPin(TargetTrackingData data) + { + if (data.ActivePin == null) + return; + + OffScreenPin pin = data.ActivePin; + data.ActivePin = null; + + // Reset and return to pool + pin.ResetPin(); + pin.gameObject.SetActive(false); + _inactivePins.Add(pin); + + Logging.Debug($"[OffScreenTrackerManager] Despawned pin for target: {data.Target?.name ?? "null"}"); + } + + /// + /// Get a pin from the pool or instantiate a new one + /// + private OffScreenPin GetPinFromPool() + { + // Try to reuse an inactive pin + if (_inactivePins.Count > 0) + { + OffScreenPin pin = _inactivePins[_inactivePins.Count - 1]; + _inactivePins.RemoveAt(_inactivePins.Count - 1); + return pin; + } + + // Create a new pin + OffScreenPin newPin = Instantiate(pinPrefab, _pinContainer); + newPin.gameObject.SetActive(false); + return newPin; + } + + #region Public Configuration Accessors + + /// + /// Get or set the screen padding in pixels + /// + public float ScreenPadding + { + get => screenPadding; + set => screenPadding = Mathf.Max(0f, value); + } + + /// + /// Get or set the spawn debounce delay + /// + public float SpawnDebounceDelay + { + get => spawnDebounceDelay; + set => spawnDebounceDelay = Mathf.Max(0f, value); + } + + /// + /// Get or set the despawn debounce delay + /// + public float DespawnDebounceDelay + { + get => despawnDebounceDelay; + set => despawnDebounceDelay = Mathf.Max(0f, value); + } + + #endregion + } +} + diff --git a/Assets/Scripts/UI/Tracking/OffScreenTrackerManager.cs.meta b/Assets/Scripts/UI/Tracking/OffScreenTrackerManager.cs.meta new file mode 100644 index 00000000..15b2c397 --- /dev/null +++ b/Assets/Scripts/UI/Tracking/OffScreenTrackerManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8599140fd23e492fa7f14cb7633209fe +timeCreated: 1766074538 \ No newline at end of file diff --git a/Assets/Scripts/UI/Tracking/TrackableTarget.cs b/Assets/Scripts/UI/Tracking/TrackableTarget.cs new file mode 100644 index 00000000..3d5db0bb --- /dev/null +++ b/Assets/Scripts/UI/Tracking/TrackableTarget.cs @@ -0,0 +1,84 @@ +using UnityEngine; + +namespace UI.Tracking +{ + /// + /// Component that marks a GameObject as trackable by the OffScreenTrackerManager. + /// Automatically registers/unregisters with the manager when enabled/disabled. + /// + public class TrackableTarget : MonoBehaviour + { + [Header("Configuration")] + [Tooltip("Icon to display in the off-screen tracking pin")] + [SerializeField] private Sprite icon; + + [Tooltip("Should this target display distance to the TrackingDistanceSource (e.g., player)?")] + [SerializeField] private bool trackDistance = false; + + /// + /// The icon to display in the tracking pin + /// + public Sprite Icon => icon; + + /// + /// Should this target track and display distance? + /// + public bool TrackDistance => trackDistance; + + /// + /// The world position of this target + /// + public Vector3 WorldPosition => transform.position; + + /// + /// Get the screen-space bounds of this target's visual representation. + /// Checks for Renderer or Collider2D to determine size. + /// + public Bounds GetWorldBounds() + { + // Try to get bounds from Renderer first (most accurate for visuals) + Renderer renderer = GetComponentInChildren(); + if (renderer != null) + { + return renderer.bounds; + } + + // Fallback to Collider2D + Collider2D collider = GetComponent(); + if (collider != null) + { + return collider.bounds; + } + + // Last resort: just return position with minimal bounds + return new Bounds(transform.position, Vector3.one * 0.1f); + } + + private void OnEnable() + { + // Register with the manager when enabled + if (OffScreenTrackerManager.Instance != null) + { + OffScreenTrackerManager.Instance.RegisterTarget(this); + } + } + + private void OnDisable() + { + // Unregister from the manager when disabled + if (OffScreenTrackerManager.Instance != null) + { + OffScreenTrackerManager.Instance.UnregisterTarget(this); + } + } + + /// + /// Allow runtime icon changes + /// + public void SetIcon(Sprite newIcon) + { + icon = newIcon; + } + } +} + diff --git a/Assets/Scripts/UI/Tracking/TrackableTarget.cs.meta b/Assets/Scripts/UI/Tracking/TrackableTarget.cs.meta new file mode 100644 index 00000000..2b4a59ce --- /dev/null +++ b/Assets/Scripts/UI/Tracking/TrackableTarget.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e41f200c954677b4b8bde8cafa01d5f1 \ No newline at end of file diff --git a/Assets/Scripts/UI/Tracking/TrackingDistanceSource.cs b/Assets/Scripts/UI/Tracking/TrackingDistanceSource.cs new file mode 100644 index 00000000..0a32cf5e --- /dev/null +++ b/Assets/Scripts/UI/Tracking/TrackingDistanceSource.cs @@ -0,0 +1,43 @@ +using UnityEngine; + +namespace UI.Tracking +{ + /// + /// Marks a GameObject as the source point for distance calculations in the tracking system. + /// Typically attached to the player or camera. Only one should be active at a time. + /// + public class TrackingDistanceSource : MonoBehaviour + { + private static TrackingDistanceSource _instance; + + /// + /// The currently active distance source (typically the player) + /// + public static TrackingDistanceSource Instance => _instance; + + /// + /// The world position of this distance source + /// + public Vector3 WorldPosition => transform.position; + + private void OnEnable() + { + // Set as the active instance + if (_instance != null && _instance != this) + { + Debug.LogWarning($"[TrackingDistanceSource] Multiple distance sources detected. Overwriting previous instance ({_instance.name}) with {name}"); + } + _instance = this; + } + + private void OnDisable() + { + // Clear instance if this was the active one + if (_instance == this) + { + _instance = null; + } + } + } +} + diff --git a/Assets/Scripts/UI/Tracking/TrackingDistanceSource.cs.meta b/Assets/Scripts/UI/Tracking/TrackingDistanceSource.cs.meta new file mode 100644 index 00000000..c44ec38e --- /dev/null +++ b/Assets/Scripts/UI/Tracking/TrackingDistanceSource.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1788298f42bd40f6b077ca3719861752 +timeCreated: 1766077591 \ No newline at end of file