private void FixedUpdate()
    {
        --counter;

        if (counter <= 0)
        {
            respondingColors = respondingColors.Distinct().ToList();
            respondingColors.Sort();

            //CheckOutColorWriter.Data.colorsIds.Clear();
            //CheckOutColorWriter.Data.colorsIds.AddRange(respondingColors);

            var update = new Improbable.Demo.CheckOutColor.Update();
            update.colorsIds = CheckOutColorWriter.Data.colorsIds;
            update.colorsIds.Value.Clear();
            update.colorsIds.Value.AddRange(respondingColors);
            CheckOutColorWriter.Send(update);

            // Do not start pings when about to lose authority to prevent commands being lost
            if (CheckOutColorWriter.Authority == Authority.Authoritative)
            {
                DoPing();
            }
        }
    }
    private void DoPing()
    {
        counter = PING_TIMEOUT_FRAMES;

        respondingColors.Clear();

        var update = new Improbable.Demo.CheckOutColor.Update();

        update.AddPing(PingInfo.Create());
        CheckOutColorWriter.Send(update);
    }
    private SendAndUpdateColorIdReturn RespondToSendAndUpdateColorId(ColorId idReceived, ICommandCallerInfo callerInfo)
    {
        respondingColors.Add(idReceived.colorId);

        if (!CheckOutColorWriter.Data.colorsIds.Contains(idReceived.colorId))
        {
            CheckOutColorWriter.Data.colorsIds.Add(idReceived.colorId);
            CheckOutColorWriter.Data.colorsIds.Sort();

            var update = new Improbable.Demo.CheckOutColor.Update();
            update.colorsIds = CheckOutColorWriter.Data.colorsIds;
            CheckOutColorWriter.Send(update);
        }

        return(SendAndUpdateColorIdReturn.Create());
    }