public override void Interact() { NetworkedUNPlayer unp = udonNet.GetLocalUNPlayer(); if (losslessMode) { unp.BroadcastStringLossless("Lossless " + customStringToSend + " at time " + Time.realtimeSinceStartup); } else { unp.BroadcastString(customStringToSend + " at time " + Time.realtimeSinceStartup); } }
public void Handle(VRCPlayerApi player, object[] udonNetData) { //TODO: UdonSharp does not support custom classes currently, so the data is packed in object[] uint eventId = (uint)udonNetData[0]; byte packetType = (byte)udonNetData[1]; int targetPlayer = (int)udonNetData[2]; byte[] buffer = (byte[])udonNetData[3]; NetworkedUNPlayer self = GetLocalUNPlayer(); if ((packetType & PacketEnquiry) != 0) { Debug.Log(string.Format("[UdonNet] Protocol enquiry received from player {0} ({1}), sending version {2}", player.displayName, player.playerId, ProtocolVersion)); self.SendVersion(player.playerId); } else if ((packetType & PacketAcknowledgement) != 0) { uint targetEventId = self.BytesToUint32(buffer, 0); Debug.Log(string.Format("[UdonNet] Acknowledgement received from player {0} ({1}), clearing wait ack for event ID {2}", player.displayName, player.playerId, targetEventId)); bool suc = self.ClearWaitAck(targetEventId); if (!suc) { Debug.Log("[UdonNet] Clear wait ack not successful. Such event ID does not exist in wait ack list."); } } else { if (eventListeners != null) { for (int i = 0; i < eventListeners.Length; i++) { if (eventListeners[i] != null) //TODO: check instance type { Component[] insts = eventListeners[i].GetComponents(typeof(UdonBehaviour)); for (int j = 0; j < insts.Length; j++) { UdonBehaviour inst = (UdonBehaviour)insts[j]; inst.SetProgramVariable("_udonNetReceivedData", udonNetData); inst.SetProgramVariable("_udonNetFromPlayer", player); inst.SetProgramVariable("_udonNetTargetedPlayer", targetPlayer); if ((packetType & PacketDataTypeString) != 0) { string stringData = self.BytesToString(buffer, 0); inst.SetProgramVariable("_udonNetStringData", stringData); } if ((packetType & PacketTargetedPlayer) != 0) { inst.SendCustomEvent("OnUdonNetPlayerEvent"); } else { inst.SendCustomEvent("OnUdonNetBroadcastEvent"); } inst.SendCustomEvent("OnUdonNetEvent"); } } } } if ((packetType & PacketLossless) != 0) { self.SendAck(player.playerId, eventId); } } }