Я использую aframe-networked и отправляю некоторые пользовательские данные между пользователями: // отправитель NAF.connection.broadcastDataGuaranteed (dataType, data) // все получатели слушают NAF.connection ....

0
Piotr Adam Milewski 27 Дек 2020 в 14:33

1 ответ

Лучший ответ

Один из способов - использовать aframe-networked события и сохранить все подключенных пользователей в словаре. creatorID, ownerId и networkId все хранятся в компоненте networked, поэтому все, что вам нужно, это захватить их после создания аватара:

const usersMap = {};

// Fired when a networked entity is created 
document.body.addEventListener("entityCreated", function(evt) {
  const networkedComponent = evt.detail.el.getAttribute("networked");
  usersMap[networkedComponent.creator] = {
    networkId: networkedComponent.networkId,
    el: evt.detail.el
  };
});

// Fired when another client disconnects from you   
document.body.addEventListener("clientDisconnected", function(evt) {
  if (usersMap[evt.detail.clientId]) delete usersMap[evt.detail.clientId];
});

Теперь каждый раз, когда вы получаете обратный вызов из широковещательного сообщения (через NAF.connection.subscribeToDataChannel(dataType, callback)), вы можете легко отслеживать объект, принадлежащий отправителю:

// change the senders color to blue
NAF.connection.subscribeToDataChannel("data", (sender, type, data, target) => {
  usersMap[sender].el.setAttribute("color", "blue");
})

Вы можете увидеть, как это работает в этом сбое. Если кто-то из пользователей нажмет «извините», остальные должны увидеть восклицательный знак над своей головой.


Если вы транслируете данные другим способом (например, через другое соединение socket.io), вы можете передать свой собственный clientID (player.getAttribute("networked").creator) в сообщении, чтобы указанное выше осталось прежним,

или вы можете передать networkId, чтобы получатель мог выполнить один запрос:

 let senderEntity = document.getElementById("naf-" + networkId)
0
Piotr Adam Milewski 27 Дек 2020 в 11:39