// MIT License // https://gitlab.com/ilnprj // Copyright (c) 2020 ilnprj using UnityEngine; using UnityEngine.UI; namespace RadarComponents { /// /// Script that display target on the radar /// public class MiniMapTargetView : BaseTargetView { private RectTransform rectPositionView; private Image imageTargetView; private Image _background; private Image backgroundRadar { get { if (_background == null) { _background = rootTransform.GetComponent(); return _background; } return _background; } } private float radarWidth; private float radarHeight; private float targetHeight; private float targetWidth; private MiniMapRadar radarContainer; protected override void Awake() { base.Awake(); rectPositionView = GetComponent(); imageTargetView = GetComponent(); imageTargetView.preserveAspect = true; radarContainer = GetComponentInParent(); } private void Start() { radarWidth = backgroundRadar.rectTransform.rect.width; radarHeight = backgroundRadar.rectTransform.rect.height; targetHeight = radarHeight * radarContainer.TargetViewSize / 100; targetWidth = radarWidth * radarContainer.TargetViewSize / 100; UpdateViewTarget(); } public override void UpdateViewTarget() { Vector3 playerPos = playerTransform.position; Vector3 targetPos = CurrentTarget.TransformTarget.position; Vector3 normalisedTargetPosiiton = NormalisedPosition(playerPos, targetPos); Vector2 targetPosition = CalculateBlipPosition(normalisedTargetPosiiton); if (radarContainer.TargetsFadeOut) { Vector3 dif = targetPos - playerPos; float distance = dif.magnitude; imageTargetView.enabled = distance <= radarContainer.RadarViewDistance; } if (!radarContainer.CircleRadar) { targetPosition.x = CheckBorder(targetPosition.x, backgroundRadar.rectTransform.rect.width); targetPosition.y = CheckBorder(targetPosition.y, backgroundRadar.rectTransform.rect.height); } else { ClampPositionToCircle(new Vector2(60f,60f), 60f, ref targetPosition); } UpdateResultPosition(targetPosition); } /// /// Method using only for Circle Radar /// public void ClampPositionToCircle(Vector2 center, float radius, ref Vector2 position) { // Calculate the offset vector from the center of the circle to our position Vector2 offset = position - center; // Calculate the linear distance of this offset vector float distance = offset.magnitude; if (radius < distance) { // If the distance is more than our radius we need to clamp // Calculate the direction to our position Vector2 direction = offset / distance; // Calculate our new position using the direction to our old position and our radius position = center + direction * radius; } } /// /// Controls the location of the target within. Use only for Square radar /// private float CheckBorder(float position, float border) { if (position + targetWidth > border) { position = border - targetWidth; } if (position < 0) { position = 0; } return position; } /// /// Final set position target in radar /// /// private void UpdateResultPosition(Vector2 position) { rectPositionView.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, position.x, targetWidth); rectPositionView.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, position.y, targetHeight); UpdateExtensions(); } private Vector3 NormalisedPosition(Vector3 playerPos, Vector3 targetPos) { float normalisedyTargetX = (targetPos.x - playerPos.x) / radarContainer.RadarViewDistance; float normalisedyTargetZ = (targetPos.z - playerPos.z) / radarContainer.RadarViewDistance; return new Vector3(normalisedyTargetX, 0, normalisedyTargetZ); } private Vector2 CalculateBlipPosition(Vector3 targetPos) { float angleToTarget = Mathf.Atan2(targetPos.x, targetPos.z) * Mathf.Rad2Deg; float anglePlayer = playerTransform.eulerAngles.y; // Angle float angleRadarDegrees = angleToTarget - anglePlayer - 90; // Calculate float normalisedDistanceToTarget = targetPos.magnitude; float angleRadians = angleRadarDegrees * Mathf.Deg2Rad; float tarX = normalisedDistanceToTarget * Mathf.Cos(angleRadians); float tarY = normalisedDistanceToTarget * Mathf.Sin(angleRadians); // Scale tarX *= radarWidth / 2; tarY *= radarHeight / 2; // Offset tarX += radarWidth / radarContainer.OffsetVector.x; tarY += radarHeight / radarContainer.OffsetVector.y; return new Vector2(tarX, tarY); } } }