82 lines
2.2 KiB
C#
82 lines
2.2 KiB
C#
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.Playables;
|
|
|
|
namespace Streamingle.Subtitles
|
|
{
|
|
public sealed class SubtitleMixerBehaviour : PlayableBehaviour
|
|
{
|
|
private const float MinimumWeight = 0.0001f;
|
|
|
|
private TMP_Text trackBinding;
|
|
private string appliedText;
|
|
|
|
public override void ProcessFrame(Playable playable, FrameData info, object playerData)
|
|
{
|
|
SetBinding(playerData as TMP_Text);
|
|
if (trackBinding == null)
|
|
return;
|
|
|
|
var selectedText = string.Empty;
|
|
var greatestWeight = MinimumWeight;
|
|
var inputCount = playable.GetInputCount();
|
|
|
|
for (var index = 0; index < inputCount; index++)
|
|
{
|
|
var inputWeight = playable.GetInputWeight(index) * Mathf.Max(0f, info.effectiveWeight);
|
|
if (inputWeight <= greatestWeight)
|
|
continue;
|
|
|
|
var inputPlayable = (ScriptPlayable<SubtitleBehaviour>)playable.GetInput(index);
|
|
selectedText = inputPlayable.GetBehaviour().Text ?? string.Empty;
|
|
greatestWeight = inputWeight;
|
|
}
|
|
|
|
ApplyText(selectedText);
|
|
}
|
|
|
|
public override void OnGraphStop(Playable playable)
|
|
{
|
|
RestoreDefault();
|
|
}
|
|
|
|
public override void OnPlayableDestroy(Playable playable)
|
|
{
|
|
RestoreDefault();
|
|
}
|
|
|
|
private void SetBinding(TMP_Text target)
|
|
{
|
|
if (target == trackBinding)
|
|
return;
|
|
|
|
RestoreDefault();
|
|
trackBinding = target;
|
|
if (trackBinding == null)
|
|
return;
|
|
|
|
appliedText = null;
|
|
}
|
|
|
|
private void ApplyText(string value)
|
|
{
|
|
value ??= string.Empty;
|
|
if (appliedText == value && trackBinding.text == value)
|
|
return;
|
|
|
|
trackBinding.text = value;
|
|
appliedText = value;
|
|
}
|
|
|
|
private void RestoreDefault()
|
|
{
|
|
if (trackBinding == null)
|
|
return;
|
|
|
|
trackBinding.text = string.Empty;
|
|
trackBinding = null;
|
|
appliedText = null;
|
|
}
|
|
}
|
|
}
|