diff --git a/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractiveControl.cs b/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractiveControl.cs index d32bc49..a610224 100644 --- a/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractiveControl.cs +++ b/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractiveControl.cs @@ -86,10 +86,31 @@ public void SetDisabled(bool disabled) /// /// The name of the control property. /// The value of the control property. + public void SetProperty(InteractiveControlProperty name, bool value) + { + SetPropertyImpl( + InteractivityManager.SingletonInstance.InteractiveControlPropertyToString(name), + value + ); + } + public void SetProperty(InteractiveControlProperty name, double value) + { + SetPropertyImpl( + InteractivityManager.SingletonInstance.InteractiveControlPropertyToString(name), + value + ); + } + public void SetProperty(InteractiveControlProperty name, string value) + { + SetPropertyImpl( + InteractivityManager.SingletonInstance.InteractiveControlPropertyToString(name), + value + ); + } public void SetProperty(InteractiveControlProperty name, object value) { SetPropertyImpl( - InteractivityManager.SingletonInstance.InteractiveControlPropertyToString(name), + InteractivityManager.SingletonInstance.InteractiveControlPropertyToString(name), value ); } @@ -99,14 +120,38 @@ public void SetProperty(InteractiveControlProperty name, object value) /// /// The name of the control property. /// The value of the control property. + public void SetProperty(string name, bool value) + { + SetPropertyImpl(name, value); + } + public void SetProperty(string name, double value) + { + SetPropertyImpl(name, value); + } + public void SetProperty(string name, string value) + { + SetPropertyImpl(name, value); + } public void SetProperty(string name, object value) { SetPropertyImpl(name, value); } + private void SetPropertyImpl(string name, bool value) + { + InteractivityManager.SingletonInstance._QueuePropertyUpdate(SceneID, ControlID, name, value); + } + private void SetPropertyImpl(string name, double value) + { + InteractivityManager.SingletonInstance._QueuePropertyUpdate(SceneID, ControlID, name, value); + } + private void SetPropertyImpl(string name, string value) + { + InteractivityManager.SingletonInstance._QueuePropertyUpdate(SceneID, ControlID, name, value); + } private void SetPropertyImpl(string name, object value) { - InteractivityManager.SingletonInstance.QueuePropertyUpdate(SceneID, ControlID, name, value); + InteractivityManager.SingletonInstance._QueuePropertyUpdate(SceneID, ControlID, name, value); } internal InteractiveControl(string controlID, string kind, InteractiveEventType type, bool disabled, string helpText, string eTag, string sceneID) diff --git a/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractiveLabelControl.cs b/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractiveLabelControl.cs index acbaae4..c656f36 100644 --- a/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractiveLabelControl.cs +++ b/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractiveLabelControl.cs @@ -52,7 +52,7 @@ public string Text public void SetText(string text) { InteractivityManager interactivityManager = InteractivityManager.SingletonInstance; - interactivityManager.QueuePropertyUpdate( + interactivityManager._QueuePropertyUpdate( SceneID, ControlID, interactivityManager.InteractiveControlPropertyToString(InteractiveControlProperty.Text), diff --git a/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractivityManager.cs b/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractivityManager.cs index 9ca0545..8ee70db 100644 --- a/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractivityManager.cs +++ b/Source/InteractiveSDK/Assets/MixerInteractive/Source/Scripts/InteractivityManager.cs @@ -1327,12 +1327,24 @@ public void SendQueuedSetControlPropertyUpdates() jsonWriter.WriteStartObject(); jsonWriter.WritePropertyName(WS_MESSAGE_KEY_CONTROL_ID); jsonWriter.WriteValue(controlID); - Dictionary controlPropertyData = _queuedControlPropertyUpdates[sceneID][controlID].properties; + Dictionary controlPropertyData = _queuedControlPropertyUpdates[sceneID][controlID].properties; var controlPropertyDataKeys = controlPropertyData.Keys; foreach (string controlPropertyDataKey in controlPropertyDataKeys) { jsonWriter.WritePropertyName(controlPropertyDataKey); - jsonWriter.WriteValue(controlPropertyData[controlPropertyDataKey].ToString()); + InternalControlPropertyMetaData controlPropertyMetaData = controlPropertyData[controlPropertyDataKey]; + if (controlPropertyMetaData.type == KnownControlPropertyPrimitiveTypes.Boolean) + { + jsonWriter.WriteValue(controlPropertyMetaData.boolValue); + } + else if (controlPropertyMetaData.type == KnownControlPropertyPrimitiveTypes.Number) + { + jsonWriter.WriteValue(controlPropertyMetaData.numberValue); + } + else + { + jsonWriter.WriteValue(controlPropertyMetaData.stringValue); + } } jsonWriter.WriteEndObject(); } @@ -3868,12 +3880,33 @@ private void UpdateInternalTextBoxState(InteractiveTextEventArgs e) _textboxValuesByParticipant[e.Participant.UserID][e.ControlID] = text; } - internal void QueuePropertyUpdate(string sceneID, string controlID, string name, object value) + internal void _QueuePropertyUpdate(string sceneID, string controlID, string name, bool value) + { + KnownControlPropertyPrimitiveTypes type = KnownControlPropertyPrimitiveTypes.Boolean; + _QueuePropertyUpdateImpl(sceneID, controlID, name, type, value); + } + internal void _QueuePropertyUpdate(string sceneID, string controlID, string name, double value) + { + KnownControlPropertyPrimitiveTypes type = KnownControlPropertyPrimitiveTypes.Number; + _QueuePropertyUpdateImpl(sceneID, controlID, name, type, value); + } + internal void _QueuePropertyUpdate(string sceneID, string controlID, string name, string value) + { + KnownControlPropertyPrimitiveTypes type = KnownControlPropertyPrimitiveTypes.String; + _QueuePropertyUpdateImpl(sceneID, controlID, name, type, value); + } + internal void _QueuePropertyUpdate(string sceneID, string controlID, string name, object value) + { + KnownControlPropertyPrimitiveTypes type = KnownControlPropertyPrimitiveTypes.Unknown; + _QueuePropertyUpdateImpl(sceneID, controlID, name, type, value); + } + + internal void _QueuePropertyUpdateImpl(string sceneID, string controlID, string name, KnownControlPropertyPrimitiveTypes type, object value) { // If a scene entry doesn't exist, add one. if (!_queuedControlPropertyUpdates.ContainsKey(sceneID)) { - InternalControlPropertyUpdateData controlPropertyData = new InternalControlPropertyUpdateData(name, value); + InternalControlPropertyUpdateData controlPropertyData = new InternalControlPropertyUpdateData(name, type, value); Dictionary controlData = new Dictionary(); controlData.Add(controlID, controlPropertyData); _queuedControlPropertyUpdates.Add(sceneID, controlData); @@ -3884,20 +3917,34 @@ internal void QueuePropertyUpdate(string sceneID, string controlID, string name, Dictionary controlData = _queuedControlPropertyUpdates[sceneID]; if (!controlData.ContainsKey(controlID)) { - InternalControlPropertyUpdateData controlPropertyData = new InternalControlPropertyUpdateData(name, value); + InternalControlPropertyUpdateData controlPropertyData = new InternalControlPropertyUpdateData(name, type, value); _queuedControlPropertyUpdates[sceneID].Add(controlID, controlPropertyData); } else { // Control entry exists, but does property entry exist? InternalControlPropertyUpdateData controlPropertyData = controlData[controlID]; + InternalControlPropertyMetaData controlPropertyMetaData = new InternalControlPropertyMetaData(); + controlPropertyMetaData.type = type; + if (type == KnownControlPropertyPrimitiveTypes.Boolean) + { + controlPropertyMetaData.boolValue = (bool)value; + } + else if (type == KnownControlPropertyPrimitiveTypes.Number) + { + controlPropertyMetaData.numberValue = (double)value; + } + else + { + controlPropertyMetaData.stringValue = value.ToString(); + } if (!controlPropertyData.properties.ContainsKey(name)) { - _queuedControlPropertyUpdates[sceneID][controlID].properties.Add(name, value); + _queuedControlPropertyUpdates[sceneID][controlID].properties.Add(name, controlPropertyMetaData); } else { - _queuedControlPropertyUpdates[sceneID][controlID].properties[name] = value; + _queuedControlPropertyUpdates[sceneID][controlID].properties[name] = controlPropertyMetaData; } } } @@ -3985,14 +4032,53 @@ internal struct InternalButtonState internal struct InternalControlPropertyUpdateData { - internal Dictionary properties; - public InternalControlPropertyUpdateData(string name, object value) + internal Dictionary properties; + public InternalControlPropertyUpdateData(string name, KnownControlPropertyPrimitiveTypes type, object value) { - properties = new Dictionary(); - properties.Add(name, value); + properties = new Dictionary(); + InternalControlPropertyMetaData typeData = new InternalControlPropertyMetaData(); + typeData.type = type; + // This should never fail, but just in case. + try + { + if (type == KnownControlPropertyPrimitiveTypes.Boolean) + { + typeData.boolValue = (bool)value; + } + else if (type == KnownControlPropertyPrimitiveTypes.Number) + { + typeData.numberValue = (double)value; + } + else + { + typeData.stringValue = value.ToString(); + } + } + catch (Exception ex) + { + InteractivityManager.SingletonInstance.LogError("Failed to cast the value to a known type. Exception: " + ex.Message); + } + properties.Add(name, typeData); } } + internal struct InternalControlPropertyMetaData + { + public object objectValue; + public bool boolValue; + public double numberValue; + public string stringValue; + public KnownControlPropertyPrimitiveTypes type; + } + + internal enum KnownControlPropertyPrimitiveTypes + { + Unknown, + Boolean, + Number, + String + } + internal struct InternalJoystickState { internal double X; diff --git a/Source/InteractiveSDK/ProjectSettings/ProjectSettings.asset b/Source/InteractiveSDK/ProjectSettings/ProjectSettings.asset index 57cd2d5..24ea477 100644 Binary files a/Source/InteractiveSDK/ProjectSettings/ProjectSettings.asset and b/Source/InteractiveSDK/ProjectSettings/ProjectSettings.asset differ