Nekopletní fix

This commit is contained in:
Dominik G.
2025-10-29 19:14:20 +01:00
parent cd0ef3c73a
commit 4c110f98c0
9 changed files with 18049 additions and 39 deletions

View File

@@ -643,6 +643,7 @@ GameObject:
- component: {fileID: 7469640283978802878}
- component: {fileID: 1813583201016405249}
- component: {fileID: 3442404066554451922}
- component: {fileID: -2591875487324942466}
m_Layer: 0
m_Name: Wizard 2.0
m_TagString: Untagged
@@ -733,6 +734,10 @@ MonoBehaviour:
jumpHeight: 1.6
gravity: -20
groundedGravity: -5
jumpBufferTime: 0.1
coyoteTime: 0.1
upwardGravityMultiplier: 1
fallGravityMultiplier: 2.5
cameraTransform: {fileID: 6707832248248563092}
animator: {fileID: 9099213046038254594}
animationDamping: 0.075
@@ -906,6 +911,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Game.Networking.SteamCharacterNetworkBridge
characterController: {fileID: 3919077998180469670}
animator: {fileID: 9099213046038254594}
identity: {fileID: 3262185422700989869}
rootTransform: {fileID: 3042213512511893744}
networkInputProxy: {fileID: 3442404066554451922}
@@ -955,6 +961,23 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: e3118c9c432a7acbd824645749251552, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Game.Networking.NetworkCharacterInputProxy
--- !u!114 &-2591875487324942466
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2809934685114486836}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 79fb1fbc20d80f546ba695c751860930, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Game.UI.SteamNameTag
followHead: {fileID: 852694279969892930}
worldOffset: {x: 0, y: 2.5, z: 0}
billboardToCamera: 1
hideForLocal: 1
visibleDistance: 60
--- !u!1 &2999616957953547817
GameObject:
m_ObjectHideFlags: 0

View File

@@ -1859,6 +1859,7 @@ GameObject:
- component: {fileID: 7618815643042096284}
- component: {fileID: 2662658783078050447}
- component: {fileID: 2417536914360261273}
- component: {fileID: 2931281317230154068}
m_Layer: 0
m_Name: Wizard
m_TagString: Untagged
@@ -2099,6 +2100,23 @@ MonoBehaviour:
SwitchTransformSpaceWhenParented: 0
Interpolate: 1
SlerpPosition: 0
--- !u!114 &2931281317230154068
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7059514996416789454}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 79fb1fbc20d80f546ba695c751860930, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Game.UI.SteamNameTag
followHead: {fileID: 7928616218613849049}
worldOffset: {x: 0, y: 1.2, z: 0}
billboardToCamera: 1
hideForLocal: 1
visibleDistance: 60
--- !u!1 &7094911519708027617
GameObject:
m_ObjectHideFlags: 0

View File

@@ -0,0 +1,250 @@
using UnityEngine;
using TMPro;
using Steamworks;
using MegaKoop.Game.Networking;
namespace MegaKoop.Game.UI
{
[DefaultExecutionOrder(10000)]
[DisallowMultipleComponent]
public class SteamNameTag : MonoBehaviour
{
[SerializeField] private Transform followHead;
[SerializeField] private Vector3 worldOffset = new Vector3(0f, 2.5f, 0f);
[SerializeField] private bool billboardToCamera = true;
[SerializeField] private bool hideForLocal = true;
[SerializeField] private float visibleDistance = 60f;
private TextMeshPro text;
private Transform tagTransform;
private Transform camTransform;
private SteamCharacterNetworkBridge bridge;
private Callback<PersonaStateChange_t> personaChanged;
private ulong lastSteamId;
private float camFindTimer;
private Coroutine ensureActiveRoutine;
private void Awake()
{
// Reuse existing NameTag child if present (prevents duplicates when cloning templates)
var existing = transform.Find("NameTag");
GameObject go;
if (existing != null)
{
tagTransform = existing;
go = existing.gameObject;
}
else
{
go = new GameObject("NameTag");
go.layer = gameObject.layer;
tagTransform = go.transform;
tagTransform.SetParent(transform, worldPositionStays: false);
}
if (!go.activeSelf) go.SetActive(true);
text = go.GetComponent<TextMeshPro>();
if (text == null)
{
text = go.AddComponent<TextMeshPro>();
}
text.alignment = TextAlignmentOptions.Center;
text.color = Color.white;
text.fontSize = 2.5f;
text.enableAutoSizing = true;
text.fontSizeMin = 1.5f;
text.fontSizeMax = 4.5f;
text.text = GetObjectDisplayName();
if (!text.gameObject.activeSelf) text.gameObject.SetActive(true);
text.enabled = true;
bridge = GetComponent<SteamCharacterNetworkBridge>();
if (followHead == null)
{
followHead = FindChildRecursive(transform, "Head");
if (followHead == null)
{
followHead = transform;
worldOffset = new Vector3(0f, 2.5f, 0f);
}
}
}
public void SetFollowHead(Transform head, SteamCharacterNetworkBridge b)
{
if (head != null) followHead = head;
if (b != null) bridge = b;
UpdateDisplayName(true);
}
private void OnEnable()
{
camTransform = Camera.main != null ? Camera.main.transform : null;
TryCreatePersonaCallback();
if (tagTransform != null && !tagTransform.gameObject.activeSelf)
{
tagTransform.gameObject.SetActive(true);
}
if (text != null)
{
if (!text.gameObject.activeSelf) text.gameObject.SetActive(true);
text.enabled = true;
}
if (ensureActiveRoutine == null)
{
ensureActiveRoutine = StartCoroutine(EnsureActiveLoop());
}
UpdateDisplayName(true);
}
private void OnDisable()
{
personaChanged = null;
if (ensureActiveRoutine != null)
{
StopCoroutine(ensureActiveRoutine);
ensureActiveRoutine = null;
}
}
private void TryCreatePersonaCallback()
{
if (personaChanged == null)
{
personaChanged = Callback<PersonaStateChange_t>.Create(OnPersonaChanged);
}
}
private System.Collections.IEnumerator EnsureActiveLoop()
{
var waiter = new WaitForEndOfFrame();
while (isActiveAndEnabled)
{
if (tagTransform != null && !tagTransform.gameObject.activeSelf)
{
tagTransform.gameObject.SetActive(true);
}
if (text != null)
{
if (!text.gameObject.activeSelf) text.gameObject.SetActive(true);
text.enabled = true;
}
yield return waiter;
}
}
private void OnPersonaChanged(PersonaStateChange_t cb)
{
if (bridge == null) return;
if (cb.m_ulSteamID == bridge.OwnerSteamId)
{
UpdateDisplayName(true);
}
}
private void LateUpdate()
{
camFindTimer -= Time.unscaledDeltaTime;
if ((camTransform == null || !camTransform.gameObject.activeInHierarchy) && camFindTimer <= 0f)
{
var cam = Camera.main;
camTransform = cam != null ? cam.transform : null;
camFindTimer = 1f;
}
// Never deactivate the NameTag GameObject; only toggle text rendering
if (tagTransform != null && !tagTransform.gameObject.activeSelf)
{
tagTransform.gameObject.SetActive(true);
}
Vector3 basePos = followHead != null ? followHead.position : transform.position;
tagTransform.position = basePos + worldOffset;
if (billboardToCamera && camTransform != null)
{
Vector3 dir = tagTransform.position - camTransform.position;
if (dir.sqrMagnitude > 0.001f)
{
tagTransform.rotation = Quaternion.LookRotation(dir, Vector3.up);
}
}
if (text != null)
{
if (!text.gameObject.activeSelf) text.gameObject.SetActive(true);
text.enabled = true;
}
UpdateDisplayName(false);
}
private void UpdateDisplayName(bool force)
{
if (text == null) return;
ulong sid = 0;
if (bridge != null) sid = bridge.OwnerSteamId;
if (!force && sid == lastSteamId && !string.IsNullOrEmpty(text.text)) return;
lastSteamId = sid;
string display = null;
if (sid != 0)
{
display = ResolvePersonaName(sid);
}
if (string.IsNullOrWhiteSpace(display))
{
display = GetObjectDisplayName();
}
if (!string.Equals(text.text, display))
{
text.text = display;
}
}
private string ResolvePersonaName(ulong sid)
{
if (!SteamBootstrap.IsInitialized)
{
return null;
}
ulong local = SteamUser.GetSteamID().m_SteamID;
if (sid == local)
{
return SteamFriends.GetPersonaName();
}
var csid = new CSteamID(sid);
string name = SteamFriends.GetFriendPersonaName(csid);
if (string.IsNullOrEmpty(name) || name == "???")
{
SteamFriends.RequestUserInformation(csid, true);
}
return name;
}
private string GetObjectDisplayName()
{
string n = transform.root != null ? transform.root.name : gameObject.name;
if (n.StartsWith("Wizard_"))
{
return n.Substring("Wizard_".Length);
}
return n;
}
private static Transform FindChildRecursive(Transform root, string name)
{
if (root == null) return null;
foreach (Transform c in root)
{
if (c.name == name) return c;
var r = FindChildRecursive(c, name);
if (r != null) return r;
}
return null;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 79fb1fbc20d80f546ba695c751860930