Текущее поведение: strong>
- Гарнитура 1 правильно видит свое положение
- Гарнитура 2 видит положение гарнитуры 1
- НО: Гарнитура 2 не видит свою позицию
- И: Гарнитура 1 не видит позицию Гарнитуры 2
Странная часть:
- Базовая синхронизация объектов работает отлично (когда Гарнитура 2 перемещает куб, Гарнитура 1 видит и наоборот)
- В отладочной информации всегда отображается только 1 игрок (Игрок 1).
- Даже на гарнитуре 2 отображается «Всего игроков: 1». " и "Список идентификаторов: 0" (идентификатор игрока 1)
- Компонент NetworkObject в XR Origin (XR Rig) со следующими настройками:
Синхронизировать преобразование ✓
< li>Синхронизация активной сцены ✓ - Синхронизация миграции сцены ✓
- Создание с наблюдателем ✓
- Автоматический родительский объект Синхронизация ✓
Я пытаюсь отобразить положение каждого игрока в текстовом элементе пользовательского интерфейса в верхней части экрана. Несмотря на то, что синхронизация объектов работает нормально, похоже, возникла проблема с обнаружением или регистрацией игрока.
Кто-нибудь сталкивался с чем-то подобным? Есть идеи, что может быть причиной этого или как это исправить?
Вот как выглядит мой код (2 файла (всего 100 строк кода))
NetworkedHeadTracker.cs
using UnityEngine;
using Unity.Netcode;
public class NetworkedHeadTracker : NetworkBehaviour
{
private Transform mainCamera;
private Transform spatialAnchor;
public NetworkVariable networkHeadPosition = new NetworkVariable();
private static readonly Dictionary allPlayers = new Dictionary();
public static IReadOnlyDictionary AllPlayers => allPlayers;
private void Awake()
{
mainCamera = Camera.main?.transform;
spatialAnchor = GameObject.Find("[BuildingBlock] Shared Spatial Anchor Core")?.transform;
}
public override void OnNetworkSpawn()
{
if (!allPlayers.ContainsKey(OwnerClientId))
{
allPlayers[OwnerClientId] = this;
}
}
public override void OnNetworkDespawn()
{
allPlayers.Remove(OwnerClientId);
}
void Update()
{
if (IsSpawned && IsOwner && mainCamera != null && spatialAnchor != null)
{
networkHeadPosition.Value = spatialAnchor.InverseTransformPoint(mainCamera.position);
}
}
public Vector3 GetWorldPosition()
{
return spatialAnchor != null ? spatialAnchor.TransformPoint(networkHeadPosition.Value) : networkHeadPosition.Value;
}
}
HeadPositionHUD.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Netcode;
using UnityEngine.UI;
using System.Linq;
using TMPro;
public class HeadPositionHUD : MonoBehaviour
{
public TextMeshProUGUI hudText;
public float updateInterval = 0.5f;
private float timer;
void Update()
{
timer += Time.deltaTime;
if (timer >= updateInterval)
{
UpdateHUD();
timer = 0;
}
}
void UpdateHUD()
{
if (!NetworkManager.Singleton.IsClient) return;
string hudContent = "";
// Debug info at the top
hudContent += $"=== DEBUG INFO ===\n";
hudContent += $"My Local ID: {NetworkManager.Singleton.LocalClientId}\n";
hudContent += $"Total number of players: {NetworkedHeadTracker.AllPlayers.Count}\n";
hudContent += $"List of IDs: {string.Join(", ", NetworkedHeadTracker.AllPlayers.Keys)}\n";
hudContent += "================\n\n";
foreach (var player in NetworkedHeadTracker.AllPlayers.OrderBy(p => p.Key))
{
if (player.Value == null)
{
hudContent += $"Player {player.Key}: null\n";
continue;
}
Vector3 worldPosition = player.Value.GetWorldPosition();
if (player.Key == NetworkManager.Singleton.LocalClientId)
{
hudContent += $"My position (ID: {player.Key}):\n";
hudContent += $"X: {worldPosition.x:F2}, Y: {worldPosition.y:F2}, Z: {worldPosition.z:F2}\n\n";
}
else
{
hudContent += $"Other player (ID: {player.Key}):\n";
hudContent += $"X: {worldPosition.x:F2}, Y: {worldPosition.y:F2}, Z: {worldPosition.z:F2}\n\n";
}
}
hudText.text = hudContent;
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... player-app
Мобильная версия