116 lines
3.7 KiB
C#
116 lines
3.7 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace MoreMountains.Tools
|
|
{
|
|
/// <summary>
|
|
/// A class used to receive level values from a MMRadioBroadcaster, and apply it to (almost) any value on any object
|
|
/// </summary>
|
|
[MMRequiresConstantRepaint]
|
|
public class MMRadioReceiver : MMMonoBehaviour
|
|
{
|
|
[Header("Target")]
|
|
/// the receiver to write the level to
|
|
public MMPropertyReceiver Receiver;
|
|
|
|
[Header("Channel")]
|
|
/// whether or not this receiver should listen to the channel
|
|
public bool CanListen = true;
|
|
/// the Channel to listen to (has to match the one on the MMRadioBroadcaster you're listening to)
|
|
[MMCondition("CanListen", true)]
|
|
public int Channel = 0;
|
|
|
|
[Header("Modifiers")]
|
|
/// whether or not to randomize the received level, this will generate at awake a random level multiplier, to apply to the level
|
|
public bool RandomizeLevel = false;
|
|
/// if random, the min bound of the random multiplier
|
|
[MMCondition("RandomizeLevel", true)]
|
|
public float MinRandomLevelMultiplier = 0f;
|
|
/// if random, the max bound of the random multiplier
|
|
[MMCondition("RandomizeLevel", true)]
|
|
public float MaxRandomLevelMultiplier = 1f;
|
|
|
|
protected bool _listeningToEvents = false;
|
|
protected float _randomLevelMultiplier = 1f;
|
|
protected float _lastLevel;
|
|
|
|
/// <summary>
|
|
/// On Awake, starts listening and generates a random level multiplier if needed
|
|
/// </summary>
|
|
protected virtual void Awake()
|
|
{
|
|
Receiver.Initialization(this.gameObject);
|
|
|
|
if (!_listeningToEvents && CanListen)
|
|
{
|
|
StartListening();
|
|
}
|
|
|
|
GenerateRandomLevelMultiplier();
|
|
}
|
|
|
|
public virtual void GenerateRandomLevelMultiplier()
|
|
{
|
|
if (RandomizeLevel)
|
|
{
|
|
_randomLevelMultiplier = Random.Range(MinRandomLevelMultiplier, MaxRandomLevelMultiplier);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets the level on the receiver
|
|
/// </summary>
|
|
/// <param name="newLevel"></param>
|
|
public virtual void SetLevel(float newLevel)
|
|
{
|
|
Receiver.SetLevel(newLevel);
|
|
}
|
|
|
|
/// <summary>
|
|
/// When getting a radio level event, we make sure it's the right channel, and apply it if needed
|
|
/// </summary>
|
|
/// <param name="channel"></param>
|
|
/// <param name="level"></param>
|
|
protected virtual void OnRadioLevelEvent(int channel, float level)
|
|
{
|
|
if (channel != Channel)
|
|
{
|
|
return;
|
|
}
|
|
if (RandomizeLevel)
|
|
{
|
|
level *= _randomLevelMultiplier;
|
|
}
|
|
SetLevel(level);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Stops listening to events on destroy
|
|
/// </summary>
|
|
protected virtual void OnDestroy()
|
|
{
|
|
_listeningToEvents = false;
|
|
StopListening();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Starts listening for events
|
|
/// </summary>
|
|
public virtual void StartListening()
|
|
{
|
|
_listeningToEvents = true;
|
|
MMRadioLevelEvent.Register(OnRadioLevelEvent);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Stops listening for events
|
|
/// </summary>
|
|
public virtual void StopListening()
|
|
{
|
|
_listeningToEvents = false;
|
|
MMRadioLevelEvent.Unregister(OnRadioLevelEvent);
|
|
}
|
|
}
|
|
}
|