private void TestScreenSpaceLockTargets() { var screenCenter = new Vector2(Screen.width / 2f, Screen.height / 2f); var allowedDistance = 130 * Screen.height / 1500f; // Test for players in crosshair foreach (var ps in PlayerScript.UnsafeAllEnabledPlayerScripts) { if (ps == GetComponent <PlayerScript>()) // Is targeting self? { continue; } var health = ps.gameObject.GetComponent <HealthScript>(); var position = ps.transform.position; var screenPos = Camera.main.WorldToScreenPoint(position); if (health.Health > 0 && screenPos.z > 0 && (screenPos.XY() - screenCenter).magnitude < allowedDistance) { WeaponIndicatorScript.PlayerData data; if ((data = targets.FirstOrDefault(x => x.Script == ps)) == null) { targets.Add(data = new WeaponIndicatorScript.PlayerData { Script = ps, WasLocked = false }); } data.TimeSinceLastLockSend += Time.deltaTime; // Only lock on half as fast when through walls bool canSee = playerScript.CanSeeOtherPlayer(ps); float strengthAdjustment = canSee ? 1.0f : 0.5f; // TODO lots of redundant stuff here data.ScreenPosition = screenPos.XY(); data.LockStrength += Time.deltaTime * strengthAdjustment; data.ClampStrength(); data.Found = true; if (!data.WasLocked && data.Locked) { if (GlobalSoundsScript.soundEnabled) { targetSound.Play(); } } } else { WeaponIndicatorScript.PlayerData data = targets.Find(data2 => data2.Script == ps); if (data != null) { data.ScreenPosition = screenPos.XY(); data.Found = false; data.LockStrength -= Time.deltaTime * WeaponIndicatorScript.PlayerData.LockLossTimeMultiplier; data.ClampStrength(); data.TimeSinceLastLockSend += Time.deltaTime; } } } }