// 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;
}
}
}