// Copyright (c) 2015 - 2023 Doozy Entertainment. All Rights Reserved. // This code can only be used under the standard Unity Asset Store End User License Agreement // A Copy of the EULA APPENDIX 1 is available at http://unity3d.com/company/legal/as_terms using System; using UnityEngine; namespace Doozy.Runtime.Signals { /// Specialized data container used to send meta signals with or without a value payload [Serializable] public class SignalPayload { /// Value payload of the signal public enum ValueType { /// No value None, /// Integer Value Integer, /// Boolean Value Boolean, /// Float Value Float, /// String Value String, /// Color Value Color, /// 2D vector Value Vector2, /// 3D vector Value Vector3, /// 4D vector Value Vector4 } [SerializeField] private StreamId StreamId; [SerializeField] private ValueType SignalValueType; [SerializeField] private int IntegerValue; [SerializeField] private bool BooleanValue; [SerializeField] private float FloatValue; [SerializeField] private string StringValue; [SerializeField] private Color ColorValue; [SerializeField] private Vector2 Vector2Value; [SerializeField] private Vector3 Vector3Value; [SerializeField] private Vector4 Vector4Value; /// StreamId of the signal public StreamId streamId { get => StreamId; set => StreamId = value; } /// ValueType for the payload of the signal public ValueType signalValueType { get => SignalValueType; set => SignalValueType = value; } /// Integer value of the payload of the signal public int integerValue { get => IntegerValue; set { Reset(); SignalValueType = ValueType.Integer; IntegerValue = value; } } /// Boolean value of the payload of the signal public bool booleanValue { get => BooleanValue; set { Reset(); SignalValueType = ValueType.Boolean; BooleanValue = value; } } /// Float value of the payload of the signal public float floatValue { get => FloatValue; set { Reset(); SignalValueType = ValueType.Float; FloatValue = value; } } /// String value of the payload of the signal public string stringValue { get => StringValue; set { Reset(); SignalValueType = ValueType.String; StringValue = value; } } /// Color value of the payload of the signal public Color colorValue { get => ColorValue; set { Reset(); SignalValueType = ValueType.Color; ColorValue = value; } } /// Vector2 value of the payload of the signal public Vector2 vector2Value { get => Vector2Value; set { Reset(); SignalValueType = ValueType.Vector2; Vector2Value = value; } } /// Vector3 value of the payload of the signal public Vector3 vector3Value { get => Vector3Value; set { Reset(); SignalValueType = ValueType.Vector3; Vector3Value = value; } } /// Vector4 value of the payload of the signal public Vector4 vector4Value { get => Vector4Value; set { Reset(); SignalValueType = ValueType.Vector4; Vector4Value = value; } } /// Creates a new SignalPayload instance public SignalPayload() { Reset(); } /// Reset to No Value public void Reset() { SignalValueType = ValueType.None; IntegerValue = default; BooleanValue = default; FloatValue = default; StringValue = default; ColorValue = default; Vector2Value = default; Vector3Value = default; Vector4Value = default; } /// Set int value /// New value public SignalPayload SetValue(int value) { integerValue = value; return this; } /// Set bool value /// New value public SignalPayload SetValue(bool value) { booleanValue = value; return this; } /// Set float value /// New value public SignalPayload SetValue(float value) { floatValue = value; return this; } /// Set string value /// New value public SignalPayload SetValue(string value) { stringValue = value; return this; } /// Set color value /// New value public SignalPayload SetValue(Color value) { colorValue = value; return this; } /// Set Vector2 value /// New value public SignalPayload SetValue(Vector2 value) { vector2Value = value; return this; } /// Set Vector3 value /// New value public SignalPayload SetValue(Vector3 value) { vector3Value = value; return this; } /// Set Vector4 value /// New value public SignalPayload SetValue(Vector4 value) { vector4Value = value; return this; } /// Sends a Signal with the set payload value to the stream with the given stream id public SignalPayload SendSignal() { if (StreamId.Category.Equals(SignalStream.k_DefaultCategory)) return this; // No stream category set, no signal sent if(StreamId.Name.Equals(SignalStream.k_DefaultName)) return this; // No stream name set, no signal sent SignalStream stream = SignalsService.GetStream(StreamId.Category, StreamId.Name); // Get stream with the given stream id switch (SignalValueType) { case ValueType.None: stream.SendSignal(); break; case ValueType.Integer: stream.SendSignal(integerValue); break; case ValueType.Boolean: stream.SendSignal(booleanValue); break; case ValueType.Float: stream.SendSignal(floatValue); break; case ValueType.String: stream.SendSignal(stringValue, ""); break; case ValueType.Color: stream.SendSignal(colorValue); break; case ValueType.Vector2: stream.SendSignal(vector2Value); break; case ValueType.Vector3: stream.SendSignal(vector3Value); break; case ValueType.Vector4: stream.SendSignal(vector4Value); break; default: throw new ArgumentOutOfRangeException(); } return this; } public override string ToString() { string message = ""; message += SignalValueType switch { ValueType.None => string.Empty, ValueType.Integer => $"(int)", ValueType.Boolean => $"(bool)", ValueType.Float => $"(float)", ValueType.String => $"(string)", ValueType.Color => $"(color)", ValueType.Vector2 => $"(Vector2)", ValueType.Vector3 => $"(Vector3)", ValueType.Vector4 => $"(Vector4)", _ => throw new ArgumentOutOfRangeException() }; message += $" {streamId}"; return message; } } }