课程地址 : http://www.sikiedu.com/course/271
凉鞋大大的,可以的话大家多支持一波~
UniRx 可以开启两个或多个事件流。并使⽤ Merge 进⾏事件流的合并,比如实现⿏标左键或右键点击时都会进⾏处理:
var leftMouseClickStream = Observable.EveryUpdate().Where(_ =>
Input.GetMouseButtonDown(0));
var rightMouseClickStream = Observable.EveryUpdate().Where(_ =>
Input.GetMouseButtonDown(1));
Observable.Merge(leftMouseClickStream, rightMouseClickStream)
.Subscribe(_ =>
{
// do something
});
UniRx 对 Unity 的 Coroutine 也提供⽀持,可以将⼀个 Coroutine 转化为事件源(Observable)。
public class Observable2YieldExample : MonoBehaviour
{
IEnumerator Delay1Second()
{
yield return Observable.Timer(TimeSpan.FromSeconds(1.0f)).ToYieldInstruction();
Debug.Log("delay 1 seconds");
}
void Start()
{
StartCoroutine(Delay1Second());
}
}
WhenAll 和 Merge 是同类型的,是处理多个流的操作符,就是当所有的事件流都结束,就会触发 Subscribe 注册的回调。
public class CoroutineSpawnExample : MonoBehaviour
{
IEnumerator A()
{
yield return new WaitForSeconds(1.0f);
Debug.Log("A");
}
IEnumerator B()
{
yield return new WaitForSeconds(1.0f);
Debug.Log("B");
}
void Start()
{
var aStream = Observable.FromCoroutine(_ => A());
var bStream = Observable.FromCoroutine(_ => B());
Observable.WhenAll(aStream, bStream)
.Subscribe(_ =>
{
Debug.Log("when all 处理了");
});
}
}
public class AllButtonClickedOnceExample : MonoBehaviour
{
void Start()
{
var leftMouseClickedEvents = Observable.EveryUpdate().Where(_ => Input.GetMouseButtonDown(0)).First();
var rightMouseClickedEvetns = Observable.EveryUpdate().Where(_ => Input.GetMouseButtonDown(1)).First();
Observable.WhenAll(leftMouseClickedEvents, rightMouseClickedEvetns)
.Subscribe(_ =>
{
Debug.Log("mouse clicked");
});
}
}
}
有的 事件流是有结束事件的,⽐如 Timer、First、Coroutine 等。有的则没有,⽐如 EveryUpdate 等。
public class OnCompletedExample : MonoBehaviour
{
void Start()
{
Observable.FromCoroutine(A)
.Subscribe(_ =>
{
Debug.Log("OnNext:");
}, () =>
{
Debug.Log("OnCompleted:");
});
}
IEnumerator A()
{
yield return new WaitForSeconds(2.0f);
}
}
多线程,是作为⾼级开发者必须具备的⼀种技术。了解了多线程可以让我们充分利⽤多核移动端的计算优势,也可以让我们的游戏体验更平滑。
在 Unity 中我们⼀般⽤ Thread.Start 开启⼀个线程。当逻辑⾮常复杂的时候多线程⾮常难以管理。⽽ UniRx 改善了这⼀种状况。
public class ThreadExample : MonoBehaviour
{
void Start()
{
var threadAStream = Observable.Start(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(1));
return 10;
});
var threadBStream = Observable.Start(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(3));
return 10;
});
Observable.WhenAll(threadAStream, threadBStream)
.ObserveOnMainThread()
.Subscribe(results =>
{
Debug.LogFormat("{0}:{1}", results[0], results[1]);
});
}
}
Observable.Start:开启⼀个线程流。
ObserveOnMainThread : 把 WhellAll 结果转到主线程上。这样 Subscribe ⾥的回调就可以使⽤Unity 的 API 了(Unity 的很多 API 不可以在其他线程中使⽤ )。