PlayerScript.CanSeeOtherPlayer C# (CSharp) Méthode

CanSeeOtherPlayer() public méthode

public CanSeeOtherPlayer ( PlayerScript other ) : bool
other PlayerScript
Résultat bool
    public bool CanSeeOtherPlayer(PlayerScript other)
    {
        Transform startTransform = CameraScript.CameraUsed != null ? CameraScript.CameraUsed.transform : transform;
        Vector3 start = startTransform.position;
        Vector3 direction = (other.transform.position - start).normalized;
        float distance = Vector3.Distance(start, other.transform.position);
        RaycastHit hitInfo;

        // Maybe
        if (Physics.Raycast(start, direction, out hitInfo, distance, OtherPlayerVisibilityLayerMask))
        {
            var hitPlayer = hitInfo.collider.GetComponentInParent<PlayerScript>();
            return hitPlayer != null && hitPlayer == other;
        }
        // Nope
        return false;
    }

Usage Example

    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;
                }
            }
        }
    }