- 修改Zenject下ProfileBlock.cs源码, 取消有关UnityEngine.Profiling.Profiler的代码.
- 然后使用Zenject的Signal:
// 定义Signal public class TestCrossThreadCommEvent : Signal<string, TestCrossThreadCommEvent> { }
1 // Install Signals 2 Container.DeclareSignal<TestCrossThreadCommEvent>();
1 // 启动线程 2 tth = new Thread(() => 3 { 4 while (true) 5 { 6 Thread.Sleep(1000); 7 _crossThreadCommEvent.Fire("fire not in main thread"); 8 //_unityEvent.Invoke(); 9 } 10 }); 11 tth.Start(); 12 // UniRx 13 _crossThreadCommEvent.AsObservable.ObserveOnMainThread(MainThreadDispatchType.Update) 14 // 使用lambda表达式是没有问题的 15 .Subscribe(s => TestCrossThreadComm(s)) 16 .AddTo(this); 17 18 void TestCrossThreadComm(string msg) 19 { 20 Debug.Log(Thread.CurrentThread.ManagedThreadId); 21 Debug.Log(msg); 22 transform.RotateAround(transform.position, Vector3.up, 5f); 23 }
- 输出结果:
1
UnityEngine.Debug:Log(Object)
fire not in main thread
UnityEngine.Debug:Log(Object)
- 多个参数情况:
1 // 定义Signal 2 public class TestCrossThreadCommEvent : Signal<string, string, TestCrossThreadCommEvent> { }
1 // Install Signals 2 Container.DeclareSignal<TestCrossThreadCommEvent>();
1 // 启动线程 2 tth = new Thread(() => 3 { 4 while (true) 5 { 6 Thread.Sleep(1000); 7 _crossThreadCommEvent.Fire("fire not in main thread", "\t so happy."); 8 //_unityEvent.Invoke(); 9 } 10 }); 11 tth.Start(); 12 // UniRx-Lambda 13 _crossThreadCommEvent.AsObservable.ObserveOnMainThread(MainThreadDispatchType.Update) 14 // 使用lambda表达式是没有问题的 15 .Subscribe(tuple => 16 { 17 Debug.Log(Thread.CurrentThread.ManagedThreadId); 18 Debug.Log(tuple.Item1 + tuple.Item2); 19 transform.RotateAround(transform.position, Vector3.up, 5f); 20 }) 21 .AddTo(this);
- 输出结果:
1
UnityEngine.Debug:Log(Object)
fire not in main thread so happy.
UnityEngine.Debug:Log(Object)
时间: 2024-08-27 01:09:45