示例#1
0
        void Scan()
        {
            float angleDelta = scanRotationSpeed * Time.fixedDeltaTime;

            RadarUtils.RadarUpdateScanLock(weaponManager, currentAngle, referenceTransform, angleDelta, referenceTransform.position, this, false, ref attemptedLocks);

            if (omnidirectional)
            {
                currentAngle = Mathf.Repeat(currentAngle + angleDelta, 360);
            }
            else
            {
                currentAngle += radialScanDirection * angleDelta;

                if (locked)
                {
                    float targetAngle = VectorUtils.SignedAngle(referenceTransform.forward,
                                                                Vector3.ProjectOnPlane(lockedTarget.position - referenceTransform.position,
                                                                                       referenceTransform.up), referenceTransform.right);
                    leftLimit = Mathf.Clamp(targetAngle - (multiLockFOV / 2), -directionalFieldOfView / 2,
                                            directionalFieldOfView / 2);
                    rightLimit = Mathf.Clamp(targetAngle + (multiLockFOV / 2), -directionalFieldOfView / 2,
                                             directionalFieldOfView / 2);

                    if (radialScanDirection < 0 && currentAngle < leftLimit)
                    {
                        currentAngle        = leftLimit;
                        radialScanDirection = 1;
                    }
                    else if (radialScanDirection > 0 && currentAngle > rightLimit)
                    {
                        currentAngle        = rightLimit;
                        radialScanDirection = -1;
                    }
                }
                else
                {
                    if (Mathf.Abs(currentAngle) > directionalFieldOfView / 2)
                    {
                        currentAngle        = Mathf.Sign(currentAngle) * directionalFieldOfView / 2;
                        radialScanDirection = -radialScanDirection;
                    }
                }
            }
        }
示例#2
0
        public bool TryLockTarget(Vector3 position)
        {
            if (!canLock)
            {
                return(false);
            }

            if (BDArmorySettings.DRAW_DEBUG_LABELS)
            {
                Debug.Log("[BDArmory]: Trying to radar lock target with (" + radarName + ")");
            }

            if (currentLocks == maxLocks)
            {
                if (BDArmorySettings.DRAW_DEBUG_LABELS)
                {
                    Debug.Log("[BDArmory]: - Failed, this radar already has the maximum allowed targets locked.");
                }
                return(false);
            }

            Vector3 targetPlanarDirection = Vector3.ProjectOnPlane(position - referenceTransform.position,
                                                                   referenceTransform.up);
            float angle = Vector3.Angle(targetPlanarDirection, referenceTransform.forward);

            if (referenceTransform.InverseTransformPoint(position).x < 0)
            {
                angle = -angle;
            }
            //TargetSignatureData.ResetTSDArray(ref attemptedLocks);
            RadarUtils.RadarUpdateScanLock(weaponManager, angle, referenceTransform, lockAttemptFOV, referenceTransform.position, this, true, ref attemptedLocks, signalPersistTime);

            for (int i = 0; i < attemptedLocks.Length; i++)
            {
                if (attemptedLocks[i].exists && (attemptedLocks[i].predictedPosition - position).sqrMagnitude < 40 * 40)
                {
                    if (!locked && !omnidirectional)
                    {
                        float targetAngle = VectorUtils.SignedAngle(referenceTransform.forward,
                                                                    Vector3.ProjectOnPlane(attemptedLocks[i].position - referenceTransform.position,
                                                                                           referenceTransform.up), referenceTransform.right);
                        currentAngle = targetAngle;
                    }
                    lockedTargets.Add(attemptedLocks[i]);
                    currLocks = lockedTargets.Count;

                    if (BDArmorySettings.DRAW_DEBUG_LABELS)
                    {
                        Debug.Log("[BDArmory]: - Acquired lock on target (" + attemptedLocks[i].vessel?.name + ")");
                    }

                    vesselRadarData.AddRadarContact(this, lockedTarget, true);
                    vesselRadarData.UpdateLockedTargets();
                    return(true);
                }
            }

            if (BDArmorySettings.DRAW_DEBUG_LABELS)
            {
                Debug.Log("[BDArmory]: - Failed to lock on target.");
            }

            return(false);
        }