You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
5.8 KiB
C#
178 lines
5.8 KiB
C#
3 weeks ago
|
namespace Fusion {
|
||
|
using UnityEngine;
|
||
|
using Fusion.StatsInternal;
|
||
|
using UI = UnityEngine.UI;
|
||
|
|
||
|
public class FusionStatsObjectIds : Fusion.Behaviour, IFusionStatsView {
|
||
|
|
||
|
protected const int PAD = FusionStatsUtilities.PAD;
|
||
|
protected const int MARGIN = FusionStatsUtilities.MARGIN;
|
||
|
|
||
|
[SerializeField] UI.Text _inputValueText;
|
||
|
[SerializeField] UI.Text _stateValueText;
|
||
|
[SerializeField] UI.Text _objectIdLabel;
|
||
|
|
||
|
[SerializeField] UI.Image _stateAuthBackImage;
|
||
|
[SerializeField] UI.Image _inputAuthBackImage;
|
||
|
|
||
|
FusionStats _fusionStats;
|
||
|
|
||
|
void Awake() {
|
||
|
_fusionStats = GetComponentInParent<FusionStats>();
|
||
|
}
|
||
|
|
||
|
static Color _noneAuthColor = new Color(0.2f, 0.2f, 0.2f, 0.9f);
|
||
|
static Color _inputAuthColor = new Color(0.1f, 0.6f, 0.1f, 1.0f);
|
||
|
static Color _stateAuthColor = new Color(0.8f, 0.4f, 0.0f, 1.0f);
|
||
|
|
||
|
void IFusionStatsView.Initialize() {
|
||
|
|
||
|
}
|
||
|
|
||
|
public static FusionStatsObjectIds Create(RectTransform parent, FusionStats fusionStats, out RectTransform rt) {
|
||
|
|
||
|
rt = parent.CreateRectTransform("Object Ids Panel")
|
||
|
.ExpandTopAnchor(MARGIN);
|
||
|
|
||
|
var stats = rt.gameObject.AddComponent<FusionStatsObjectIds>();
|
||
|
|
||
|
stats._fusionStats = fusionStats;
|
||
|
|
||
|
stats.Generate();
|
||
|
|
||
|
return stats;
|
||
|
}
|
||
|
|
||
|
const float LABEL_DIVIDING_POINT = .7f;
|
||
|
const float TEXT_PAD = 4;
|
||
|
const float TEXT_PAD_HORIZ = 6;
|
||
|
const int MAX_TAG_FONT_SIZE = 18;
|
||
|
|
||
|
public void Generate() {
|
||
|
|
||
|
var labelFont = _fusionStats.LabelFont;
|
||
|
var fontColor = _fusionStats.FontColor;
|
||
|
|
||
|
var layoutRT = transform.CreateRectTransform("IDs Layout")
|
||
|
.ExpandAnchor()
|
||
|
.AddCircleSprite(_fusionStats.ObjDataBackColor)
|
||
|
;
|
||
|
|
||
|
// Object ID panel on Left
|
||
|
{
|
||
|
var idPanelRT = layoutRT.CreateRectTransform("Object Id Panel", true)
|
||
|
.ExpandTopAnchor()
|
||
|
.SetAnchors(0, 0.4f, 0, 1);
|
||
|
|
||
|
|
||
|
var objIdLabelRT = idPanelRT.CreateRectTransform("Object Id Label")
|
||
|
.SetAnchors(0, 1, LABEL_DIVIDING_POINT, 1)
|
||
|
.SetOffsets(TEXT_PAD_HORIZ, -TEXT_PAD_HORIZ, 0, -TEXT_PAD);
|
||
|
|
||
|
objIdLabelRT.AddText("OBJECT ID", TextAnchor.MiddleCenter, fontColor, labelFont)
|
||
|
.resizeTextMaxSize = MAX_TAG_FONT_SIZE;
|
||
|
|
||
|
var objIdValueRT = idPanelRT.CreateRectTransform("Object Id Value")
|
||
|
.SetAnchors(0, 1, 0, LABEL_DIVIDING_POINT)
|
||
|
.SetOffsets(TEXT_PAD_HORIZ, -TEXT_PAD_HORIZ, TEXT_PAD, 0);
|
||
|
|
||
|
_objectIdLabel = objIdValueRT.AddText("00", TextAnchor.MiddleCenter, fontColor, labelFont);
|
||
|
}
|
||
|
|
||
|
// Authority ID panel on right
|
||
|
{
|
||
|
|
||
|
AddAuthorityPanel(layoutRT, "Input", ref _inputValueText, ref _inputAuthBackImage)
|
||
|
.SetAnchors(0.4f, 0.7f, 0, 1);
|
||
|
|
||
|
AddAuthorityPanel(layoutRT, "State", ref _stateValueText, ref _stateAuthBackImage)
|
||
|
.SetAnchors(0.7f, 1.0f, 0, 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
RectTransform AddAuthorityPanel(RectTransform parent, string label, ref UI.Text valueText, ref UI.Image backImage) {
|
||
|
|
||
|
var labelFont = _fusionStats.LabelFont;
|
||
|
var fontColor = _fusionStats.FontColor;
|
||
|
|
||
|
var authIdPanelRT = parent.CreateRectTransform($"{label} Id Panel", true)
|
||
|
.ExpandTopAnchor()
|
||
|
.SetAnchors(0.5f, 1, 0, 1)
|
||
|
.AddCircleSprite(_noneAuthColor, out backImage);
|
||
|
|
||
|
var authLabelRT = authIdPanelRT.CreateRectTransform($"{label} Label")
|
||
|
.SetAnchors(0, 1, LABEL_DIVIDING_POINT, 1)
|
||
|
.SetOffsets(TEXT_PAD_HORIZ, -TEXT_PAD_HORIZ, 0, -TEXT_PAD);
|
||
|
|
||
|
var authorityText = authLabelRT.AddText(label, TextAnchor.MiddleCenter, fontColor, labelFont);
|
||
|
authorityText.resizeTextMaxSize = MAX_TAG_FONT_SIZE;
|
||
|
|
||
|
var authValueRT = authIdPanelRT.CreateRectTransform($"{label} Value")
|
||
|
.SetAnchors(0, 1, 0, LABEL_DIVIDING_POINT)
|
||
|
.SetOffsets(TEXT_PAD_HORIZ, -TEXT_PAD_HORIZ, TEXT_PAD, 0);
|
||
|
|
||
|
valueText = authValueRT.AddText("P0", TextAnchor.MiddleCenter, fontColor, labelFont);
|
||
|
|
||
|
return authIdPanelRT;
|
||
|
}
|
||
|
|
||
|
void IFusionStatsView.CalculateLayout() {
|
||
|
//throw new System.NotImplementedException();
|
||
|
}
|
||
|
|
||
|
// cache of last applied UI values
|
||
|
bool _previousHasInputAuth;
|
||
|
bool _previousHasStateAuth;
|
||
|
uint _previousObjectIdValue;
|
||
|
int _previousStateAuthValue;
|
||
|
int _previousInputAuthValue;
|
||
|
|
||
|
void IFusionStatsView.Refresh() {
|
||
|
|
||
|
if (_fusionStats == null) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var obj = _fusionStats.Object;
|
||
|
|
||
|
// if (obj == null) {
|
||
|
// return;
|
||
|
// }
|
||
|
|
||
|
bool objIsValid = obj && obj.IsValid;
|
||
|
|
||
|
// if (obj.IsValid) {
|
||
|
|
||
|
// Set colors
|
||
|
bool hasInputAuth = objIsValid && obj.HasInputAuthority;
|
||
|
if (_previousHasInputAuth != hasInputAuth) {
|
||
|
_inputAuthBackImage.color = hasInputAuth ? _inputAuthColor : _noneAuthColor;
|
||
|
_previousHasInputAuth = hasInputAuth;
|
||
|
}
|
||
|
bool hasStateAuth = objIsValid && (obj.HasStateAuthority || obj.Runner.IsServer);
|
||
|
if (_previousHasStateAuth != hasStateAuth) {
|
||
|
_stateAuthBackImage.color = hasStateAuth ? _stateAuthColor : _noneAuthColor;
|
||
|
_previousHasStateAuth = hasStateAuth;
|
||
|
}
|
||
|
|
||
|
// Set values
|
||
|
int stateAuth = objIsValid ? obj.StateAuthority.PlayerId : PlayerRef.None.PlayerId;
|
||
|
if (_previousStateAuthValue != stateAuth) {
|
||
|
_stateValueText.text = stateAuth.ToString();
|
||
|
_previousStateAuthValue = stateAuth;
|
||
|
}
|
||
|
int inputAuth = objIsValid ? obj.InputAuthority.PlayerId: PlayerRef.None.PlayerId;
|
||
|
if (_previousInputAuthValue != inputAuth) {
|
||
|
_inputValueText.text = inputAuth.ToString();
|
||
|
_previousInputAuthValue = inputAuth;
|
||
|
}
|
||
|
// }
|
||
|
|
||
|
uint objectId = objIsValid ? obj.Id.Raw : 0;
|
||
|
if (objectId != _previousObjectIdValue) {
|
||
|
_objectIdLabel.text = objectId.ToString();
|
||
|
_previousObjectIdValue = objectId;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|