Это просто пример, так как вы просили об этом.
В общем случае UnityMainThreadDispatcher
по вашей ссылке в порядке.
В любом случае, он просто обрабатывает очередь методом Update
. Я бы вместо того, чтобы использовать это решение Singleton-Pattern, просто сделал бы то же самое в компоненте MonoBehaviour
, который у вас уже есть (в большинстве случаев Singleton - только быстрое, но грязное решение)
public class MyScript : MonoBehaviour, IMyComponentListener
{
public GameObject cube;
private MyComponent _myComponent;
private ConcurrentQueue<Action> callbacks = new ConcurrentQueue<Action>();
private void Start()
{
_myComponent = new MyComponent(this);
}
// Work the callbacks queue
private void Update()
{
if(callbacks.Count == 0) return;
while(callbacks.Count != 0)
{
Action a;
if(!callbacks.TryDequeue(out a)) continue;
a.Invoke();
}
}
public void ThreadCompleted()
{
callbacks.Enqueue(OnThreadCompleted);
}
private void OnThreadCompleted()
{
cube.transform.Rotate(Vector3.up, 10f);
}
}
И чем бы вы назвали enqueue
вместо этого, например. как
((MyScript)_listener).ThreadCompleted();
Возможно, проблема в том, что приведена здесь, или вы можете добавить метод в интерфейс.
В случае, если у вас есть несколько слушателей (как это кажется из-за интерфейса), я бы также использовал ваш путь, возможно, все еще без Singleton, но вместо этого с правильными ссылками, например. через инспектора.
Набрано на моем смартфоне, поэтому никаких гарантий, но я надеюсь, что я ясно изложил свою точку зрения