< Summary

Class:PlayerName
Assembly:PlayerName
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/PlayerName/PlayerName.cs
Covered lines:57
Uncovered lines:19
Coverable lines:76
Total lines:168
Line coverage:75% (57 of 76)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
PlayerName()0%110100%
Awake()0%110100%
OnNamesOpacityChanged(...)0%110100%
OnNamesVisibleChanged(...)0%330100%
SetName(...)0%110100%
Update()0%2100%
Update(...)0%660100%
LookAtCamera(...)0%110100%
Show(...)0%220100%
Hide(...)0%330100%
SetForceShow(...)0%42600%
SetIsTalking(...)0%2100%
SetYOffset(...)0%2100%
ScreenSpaceRect(...)0%2100%
ScreenSpacePos(...)0%2100%
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 DCL;
 3using TMPro;
 4using UnityEngine;
 5using UnityEngine.UI;
 6
 7[Serializable]
 8public class PlayerName : MonoBehaviour, IPlayerName
 9{
 10    internal const int DEFAULT_CANVAS_SORTING_ORDER = 0;
 11    internal const int FORCE_CANVAS_SORTING_ORDER = 40;
 112    internal static readonly int TALKING_ANIMATOR_BOOL = Animator.StringToHash("Talking");
 13    internal const float ALPHA_TRANSITION_STEP_PER_SECOND =  1f / 0.25f;
 14    internal const float TARGET_ALPHA_SHOW = 1;
 15    internal const float TARGET_ALPHA_HIDE = 0;
 16    internal const int BACKGROUND_HEIGHT = 30;
 17    internal const int BACKGROUND_EXTRA_WIDTH = 10;
 18
 19    [SerializeField] internal Canvas canvas;
 20    [SerializeField] internal CanvasGroup canvasGroup;
 21    [SerializeField] internal TextMeshProUGUI nameText;
 22    [SerializeField] internal Image background;
 23    [SerializeField] internal Transform pivot;
 24    [SerializeField] internal Animator talkingAnimator;
 25
 026    internal BaseVariable<float> namesOpacity => DataStore.i.HUDs.avatarNamesOpacity;
 027    internal BaseVariable<bool> namesVisible => DataStore.i.HUDs.avatarNamesVisible;
 28
 29    internal float alpha;
 30    internal float targetAlpha;
 31    internal bool forceShow = false;
 32    internal Color backgroundOriginalColor;
 33
 34    private void Awake()
 35    {
 67636        backgroundOriginalColor = background.color;
 67637        canvas.sortingOrder = DEFAULT_CANVAS_SORTING_ORDER;
 67638        namesVisible.OnChange += OnNamesVisibleChanged;
 67639        namesOpacity.OnChange += OnNamesOpacityChanged;
 67640        OnNamesVisibleChanged(namesVisible.Get(), true);
 67641        OnNamesOpacityChanged(namesOpacity.Get(), 1);
 67642        Show(true);
 67643    }
 136644    internal void OnNamesOpacityChanged(float current, float previous) { background.color = new Color(backgroundOriginal
 45
 135646    internal void OnNamesVisibleChanged(bool current, bool previous) { canvas.enabled = current || forceShow; }
 47
 48    public void SetName(string name)
 49    {
 250        nameText.text = name;
 251        background.rectTransform.sizeDelta = new Vector2(nameText.GetPreferredValues().x + BACKGROUND_EXTRA_WIDTH, BACKG
 252    }
 53
 054    private void Update() { Update(Time.deltaTime); }
 55
 56    internal void Update(float deltaTime)
 57    {
 358        float finalTargetAlpha = forceShow ? TARGET_ALPHA_SHOW : targetAlpha;
 59
 360        if (!Mathf.Approximately(alpha, finalTargetAlpha))
 261            alpha = Mathf.MoveTowards(alpha, finalTargetAlpha, ALPHA_TRANSITION_STEP_PER_SECOND * deltaTime);
 162        else if (alpha == 0)
 63        {
 164            UpdateVisuals(0);
 65            // We are hidden and we dont have to scale, look at camera or anything, we can disable the gameObject
 166            gameObject.SetActive(false);
 167            return;
 68        }
 269        Vector3 cameraPosition = CommonScriptableObjects.cameraPosition.Get();
 270        Vector3 cameraRight = CommonScriptableObjects.cameraRight.Get();
 271        Quaternion cameraRotation = DataStore.i.camera.rotation.Get();
 72
 73        /*
 74         * TODO: We could obtain distance to player from the AvatarLODController but that coupling it's overkill and ugl
 75         * instead we should have a provider so all the subsystems can use it
 76         */
 277        float distanceToCamera = Vector3.Distance(cameraPosition, gameObject.transform.position);
 278        float resolvedAlpha = forceShow ? TARGET_ALPHA_SHOW : ResolveAlphaByDistance(alpha, distanceToCamera, forceShow)
 279        UpdateVisuals(resolvedAlpha);
 280        ScalePivotByDistance(distanceToCamera);
 281        LookAtCamera(cameraRight, cameraRotation.eulerAngles);
 282        pivot.transform.localPosition = Vector3.up * GetPivotYOffsetByDistance(distanceToCamera);
 283    }
 84
 85    internal void LookAtCamera(Vector3 cameraRight, Vector3 cameraEulerAngles)
 86    {
 387        Transform cachedTransform = transform;
 388        cachedTransform.right = -cameraRight; // This will set the Y rotation
 89
 90        // Now we use the negated X axis rotation to make the rotation steady in horizont
 391        Vector3 finalEulerAngle = cachedTransform.localEulerAngles;
 392        finalEulerAngle.x = -cameraEulerAngles.x;
 393        cachedTransform.localEulerAngles = finalEulerAngle;
 394    }
 95
 96    public void Show(bool instant = false)
 97    {
 67698        targetAlpha = TARGET_ALPHA_SHOW;
 67699        gameObject.SetActive(true);
 676100        if (instant)
 676101            alpha = TARGET_ALPHA_SHOW;
 676102    }
 103
 104    public void Hide(bool instant = false)
 105    {
 4106        targetAlpha = TARGET_ALPHA_HIDE;
 4107        if (instant && !forceShow)
 108        {
 4109            alpha = TARGET_ALPHA_HIDE;
 4110            gameObject.SetActive(false);
 111        }
 4112    }
 113    public void SetForceShow(bool forceShow)
 114    {
 0115        canvas.enabled = forceShow || namesVisible.Get();
 0116        canvas.sortingOrder = forceShow ? FORCE_CANVAS_SORTING_ORDER : DEFAULT_CANVAS_SORTING_ORDER;
 0117        background.color = new Color(backgroundOriginalColor.r, backgroundOriginalColor.g, backgroundOriginalColor.b, fo
 0118        this.forceShow = forceShow;
 0119        if (this.forceShow)
 0120            gameObject.SetActive(true);
 0121    }
 122
 0123    public void SetIsTalking(bool talking) { talkingAnimator.SetBool(TALKING_ANIMATOR_BOOL, talking); }
 124
 0125    public void SetYOffset(float yOffset) { transform.localPosition = Vector3.up * yOffset; }
 126
 127    public Rect ScreenSpaceRect(Camera mainCamera)
 128    {
 0129        Vector3 origin = mainCamera.WorldToScreenPoint(background.transform.position);
 0130        Vector2 size = background.rectTransform.sizeDelta;
 0131        return new Rect(origin.x, Screen.height - origin.y, size.x, size.y);
 132    }
 133
 0134    public Vector3 ScreenSpacePos(Camera mainCamera) { return mainCamera.WorldToScreenPoint(background.transform.positio
 135
 136    internal static float ResolveAlphaByDistance(float alphaValue, float distanceToCamera, bool forceShow)
 137    {
 2138        if (forceShow)
 0139            return alphaValue;
 140
 141        const float MIN_DISTANCE = 5;
 2142        if (distanceToCamera < MIN_DISTANCE)
 2143            return alphaValue;
 144
 0145        return alphaValue * Mathf.Lerp(1, 0, (distanceToCamera - MIN_DISTANCE) / (DataStore.i.avatarsLOD.LODDistance.Get
 146    }
 147
 6148    internal void UpdateVisuals(float resolvedAlpha) { canvasGroup.alpha = resolvedAlpha; }
 149
 4150    internal void ScalePivotByDistance(float distanceToCamera) { pivot.transform.localScale = Vector3.one * 0.15f * dist
 151
 152    internal float GetPivotYOffsetByDistance(float distanceToCamera)
 153    {
 154        const float NEAR_Y_OFFSET = 0f;
 155        const float FAR_Y_OFFSET = 0.1f;
 156        const float MAX_DISTANCE = 5;
 2157        if (distanceToCamera >= MAX_DISTANCE)
 0158            return FAR_Y_OFFSET;
 159
 2160        return Mathf.Lerp(NEAR_Y_OFFSET, FAR_Y_OFFSET, distanceToCamera / MAX_DISTANCE);
 161    }
 162
 163    private void OnDestroy()
 164    {
 676165        namesVisible.OnChange -= OnNamesVisibleChanged;
 676166        namesOpacity.OnChange -= OnNamesOpacityChanged;
 676167    }
 168}