예제 #1
0
    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);
        }
    }
예제 #2
0
    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);
            }
        }
    }