// MIT License // https://gitlab.com/ilnprj // Copyright (c) 2020 ilnprj // Modified: Jingyi using UnityEngine; namespace RadarComponents { [RequireComponent(typeof(MeshRenderer))] public class TargetMiniMap3D : BaseTargetView { public int mapSize = 2; private float radarWidth; private float radarHeight; /// /// Given that the target has the same sides /// private float targetWidth; private MiniMap3D radarContainer; private MeshRenderer modelTargetView; protected override void Awake() { base.Awake(); radarContainer = GetComponentInParent(); modelTargetView = GetComponent(); } private void Start() { radarWidth = radarContainer.transform.localScale.x; radarHeight = radarContainer.transform.localScale.y; transform.SetParent(radarContainer.transform); targetWidth = radarWidth * 5 / 100; UpdateViewTarget(); } public override void UpdateViewTarget() { Vector3 playerPos = playerTransform.position; Vector3 targetPos = CurrentTarget.TransformTarget.position; Vector3 normalisedTargetPosiiton = NormalisedPosition(playerPos, targetPos); Vector2 targetPosition = CalculateBlipPosition(normalisedTargetPosiiton); targetPosition.x = CheckBorder(targetPosition.x, 5 ); targetPosition.y = CheckBorder(targetPosition.y, 5 ); if (radarContainer.TargetsFadeOut) { Vector3 dif = targetPos - playerPos; float distance = dif.magnitude; modelTargetView.enabled = distance <= radarContainer.InsideRadarDistance; } UpdateResultPosition(targetPosition); } /// /// Controls the location of the target within /// private float CheckBorder(float position, float border) { if (position + targetWidth >= border) { position = border - targetWidth; } if (position < -5) { position = -5; } return position; } private void UpdateResultPosition(Vector2 position) { transform.localPosition = new Vector3(position.x, 2, -position.y); } private Vector3 NormalisedPosition(Vector3 playerPos, Vector3 targetPos) { float normalisedyTargetX =(targetPos.x - playerPos.x) / radarWidth; float normalisedyTargetZ =(targetPos.z - playerPos.z) / radarWidth; 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 / mapSize ; 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 if (radarContainer.OffsetPosition != 0) { tarX += radarWidth / radarContainer.OffsetPosition; tarY += radarHeight / radarContainer.OffsetPosition; } return new Vector2(tarX, tarY); } } }