< Summary

Class:PlayerName
Assembly:PlayerName
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/PlayerName/PlayerName.cs
Covered lines:67
Uncovered lines:17
Coverable lines:84
Total lines:185
Line coverage:79.7% (67 of 84)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
PlayerName()0%110100%
PlayerName()0%110100%
Awake()0%110100%
OnNamesOpacityChanged(...)0%110100%
OnNamesVisibleChanged(...)0%330100%
SetName(...)0%110100%
AsyncSetName()0%3.333066.67%
Update()0%110100%
Update(...)0%7.057090%
LookAtCamera(...)0%110100%
Show(...)0%220100%
Hide(...)0%330100%
AddVisibilityConstaint(...)0%2100%
RemoveVisibilityConstaint(...)0%2100%
SetForceShow(...)0%42600%
SetIsTalking(...)0%110100%
SetYOffset(...)0%110100%
ScreenSpaceRect(...)0%2100%
ScreenSpacePos(...)0%110100%
ResolveAlphaByDistance(...)0%3.583060%
UpdateVisuals(...)0%110100%
ScalePivotByDistance(...)0%110100%
GetPivotYOffsetByDistance(...)0%2.152066.67%
OnDestroy()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/PlayerName/PlayerName.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using Cysharp.Threading.Tasks;
 4using DCL;
 5using TMPro;
 6using UnityEngine;
 7using UnityEngine.UI;
 8
 9[Serializable]
 10public class PlayerName : MonoBehaviour, IPlayerName
 11{
 12    internal const int DEFAULT_CANVAS_SORTING_ORDER = 0;
 13    internal const int FORCE_CANVAS_SORTING_ORDER = 40;
 114    internal static readonly int TALKING_ANIMATOR_BOOL = Animator.StringToHash("Talking");
 15    internal const float ALPHA_TRANSITION_STEP_PER_SECOND =  1f / 0.25f;
 16    internal const float TARGET_ALPHA_SHOW = 1;
 17    internal const float TARGET_ALPHA_HIDE = 0;
 18    internal const int BACKGROUND_HEIGHT = 30;
 19    internal const int BACKGROUND_EXTRA_WIDTH = 10;
 20
 21    [SerializeField] internal Canvas canvas;
 22    [SerializeField] internal CanvasGroup canvasGroup;
 23    [SerializeField] internal TextMeshProUGUI nameText;
 24    [SerializeField] internal Image background;
 25    [SerializeField] internal Transform pivot;
 26    [SerializeField] internal Animator talkingAnimator;
 27
 132928    internal BaseVariable<float> namesOpacity => DataStore.i.HUDs.avatarNamesOpacity;
 132929    internal BaseVariable<bool> namesVisible => DataStore.i.HUDs.avatarNamesVisible;
 30
 31    internal float alpha;
 32    internal float targetAlpha;
 33    internal bool forceShow = false;
 34    internal Color backgroundOriginalColor;
 44935    internal List<string> hideConstraints = new List<string>();
 36
 37    private void Awake()
 38    {
 44339        backgroundOriginalColor = background.color;
 44340        canvas.sortingOrder = DEFAULT_CANVAS_SORTING_ORDER;
 44341        namesVisible.OnChange += OnNamesVisibleChanged;
 44342        namesOpacity.OnChange += OnNamesOpacityChanged;
 44343        OnNamesVisibleChanged(namesVisible.Get(), true);
 44344        OnNamesOpacityChanged(namesOpacity.Get(), 1);
 44345        Show(true);
 44346    }
 89847    internal void OnNamesOpacityChanged(float current, float previous) { background.color = new Color(backgroundOriginal
 48
 89049    internal void OnNamesVisibleChanged(bool current, bool previous) { canvas.enabled = current || forceShow; }
 50
 2651    public void SetName(string name) { AsyncSetName(name).Forget(); }
 52    private async UniTaskVoid AsyncSetName(string name)
 53    {
 1354        name = await ProfanityFilterSharedInstances.regexFilter.Filter(name);
 1355        nameText.text = name;
 1356        background.rectTransform.sizeDelta = new Vector2(nameText.GetPreferredValues().x + BACKGROUND_EXTRA_WIDTH, BACKG
 1357    }
 58
 9259    private void Update() { Update(Time.deltaTime); }
 60
 61    internal void Update(float deltaTime)
 62    {
 4963        if (hideConstraints.Count > 0)
 64        {
 065            UpdateVisuals(0);
 066            return;
 67        }
 68
 4969        float finalTargetAlpha = forceShow ? TARGET_ALPHA_SHOW : targetAlpha;
 70
 4971        if (!Mathf.Approximately(alpha, finalTargetAlpha))
 2872            alpha = Mathf.MoveTowards(alpha, finalTargetAlpha, ALPHA_TRANSITION_STEP_PER_SECOND * deltaTime);
 2173        else if (alpha == 0)
 74        {
 175            UpdateVisuals(0);
 76            // We are hidden and we dont have to scale, look at camera or anything, we can disable the gameObject
 177            gameObject.SetActive(false);
 178            return;
 79        }
 4880        Vector3 cameraPosition = CommonScriptableObjects.cameraPosition.Get();
 4881        Vector3 cameraRight = CommonScriptableObjects.cameraRight.Get();
 4882        Quaternion cameraRotation = DataStore.i.camera.rotation.Get();
 83
 84        /*
 85         * TODO: We could obtain distance to player from the AvatarLODController but that coupling it's overkill and ugl
 86         * instead we should have a provider so all the subsystems can use it
 87         */
 4888        float distanceToCamera = Vector3.Distance(cameraPosition, gameObject.transform.position);
 4889        float resolvedAlpha = forceShow ? TARGET_ALPHA_SHOW : ResolveAlphaByDistance(alpha, distanceToCamera, forceShow)
 4890        UpdateVisuals(resolvedAlpha);
 4891        ScalePivotByDistance(distanceToCamera);
 4892        LookAtCamera(cameraRight, cameraRotation.eulerAngles);
 4893        pivot.transform.localPosition = Vector3.up * GetPivotYOffsetByDistance(distanceToCamera);
 4894    }
 95
 96    internal void LookAtCamera(Vector3 cameraRight, Vector3 cameraEulerAngles)
 97    {
 4998        Transform cachedTransform = transform;
 4999        cachedTransform.right = -cameraRight; // This will set the Y rotation
 100
 101        // Now we use the negated X axis rotation to make the rotation steady in horizont
 49102        Vector3 finalEulerAngle = cachedTransform.localEulerAngles;
 49103        finalEulerAngle.x = -cameraEulerAngles.x;
 49104        cachedTransform.localEulerAngles = finalEulerAngle;
 49105    }
 106
 107    public void Show(bool instant = false)
 108    {
 461109        targetAlpha = TARGET_ALPHA_SHOW;
 461110        gameObject.SetActive(true);
 461111        if (instant)
 447112            alpha = TARGET_ALPHA_SHOW;
 461113    }
 114
 115    public void Hide(bool instant = false)
 116    {
 32117        targetAlpha = TARGET_ALPHA_HIDE;
 32118        if (instant && !forceShow)
 119        {
 15120            alpha = TARGET_ALPHA_HIDE;
 15121            gameObject.SetActive(false);
 122        }
 32123    }
 124
 125    // Note: Ideally we should separate the LODController logic from this one so we don't have to add constraints
 0126    public void AddVisibilityConstaint(string constraint) { hideConstraints.Add(constraint); }
 127
 0128    public void RemoveVisibilityConstaint(string constraint) { hideConstraints.Remove(constraint); }
 129
 130    public void SetForceShow(bool forceShow)
 131    {
 0132        canvas.enabled = forceShow || namesVisible.Get();
 0133        canvas.sortingOrder = forceShow ? FORCE_CANVAS_SORTING_ORDER : DEFAULT_CANVAS_SORTING_ORDER;
 0134        background.color = new Color(backgroundOriginalColor.r, backgroundOriginalColor.g, backgroundOriginalColor.b, fo
 0135        this.forceShow = forceShow;
 0136        if (this.forceShow)
 0137            gameObject.SetActive(true);
 0138    }
 139
 10140    public void SetIsTalking(bool talking) { talkingAnimator.SetBool(TALKING_ANIMATOR_BOOL, talking); }
 141
 10142    public void SetYOffset(float yOffset) { transform.localPosition = Vector3.up * yOffset; }
 143
 144    public Rect ScreenSpaceRect(Camera mainCamera)
 145    {
 0146        Vector3 origin = mainCamera.WorldToScreenPoint(background.transform.position);
 0147        Vector2 size = background.rectTransform.sizeDelta;
 0148        return new Rect(origin.x, Screen.height - origin.y, size.x, size.y);
 149    }
 150
 20151    public Vector3 ScreenSpacePos(Camera mainCamera) { return mainCamera.WorldToScreenPoint(background.transform.positio
 152
 153    internal static float ResolveAlphaByDistance(float alphaValue, float distanceToCamera, bool forceShow)
 154    {
 48155        if (forceShow)
 0156            return alphaValue;
 157
 158        const float MIN_DISTANCE = 5;
 48159        if (distanceToCamera < MIN_DISTANCE)
 48160            return alphaValue;
 161
 0162        return alphaValue * Mathf.Lerp(1, 0, (distanceToCamera - MIN_DISTANCE) / (DataStore.i.avatarsLOD.LODDistance.Get
 163    }
 164
 98165    internal void UpdateVisuals(float resolvedAlpha) { canvasGroup.alpha = resolvedAlpha; }
 166
 96167    internal void ScalePivotByDistance(float distanceToCamera) { pivot.transform.localScale = Vector3.one * 0.15f * dist
 168
 169    internal float GetPivotYOffsetByDistance(float distanceToCamera)
 170    {
 171        const float NEAR_Y_OFFSET = 0f;
 172        const float FAR_Y_OFFSET = 0.1f;
 173        const float MAX_DISTANCE = 5;
 48174        if (distanceToCamera >= MAX_DISTANCE)
 0175            return FAR_Y_OFFSET;
 176
 48177        return Mathf.Lerp(NEAR_Y_OFFSET, FAR_Y_OFFSET, distanceToCamera / MAX_DISTANCE);
 178    }
 179
 180    private void OnDestroy()
 181    {
 443182        namesVisible.OnChange -= OnNamesVisibleChanged;
 443183        namesOpacity.OnChange -= OnNamesOpacityChanged;
 443184    }
 185}