UniRx一帧陷阱
UniRx的效率极高,高过了Unity及C#的执行时间,由于其异步机制,导致和Unity不同步
await UniTask.Yield(); //别用这个,一帧之内
await UniTask.NextFrame();//这个好用,下一帧
CustomYieldInstruction不兼容内置IEnumerator
// CustomYieldInstruction 不兼容内置 IEnumerator
public class BoomBox : CustomYieldInstruction, IAbility
{
private bool _keepWaiting = true;
public override bool keepWaiting => _keepWaiting;
public IEnumerator ShowVFX(List<Element> elements)
{
for (var i = 0; i < elements.Count; i++)
{
var element = elements[i];
element.transform.localScale *= 0.6f;
yield return new WaitForSeconds(0.1f);
}
_keepWaiting = false;
}
}
Unity自定义多级同步Awaitable,内部流程控制外部流程
class MyClassA : CustomYieldInstruction
{
private bool _keepWaitingToken = true;
public MyClassA(MonoBehaviour mono)
{
Debug.Log("MyClassA");
mono.StartCoroutine(StartSub());
}
IEnumerator StartSub()
{
// bool 当作引用来使用,token
yield return new MySubClassA(ref _keepWaitingToken);
}
public override bool keepWaiting => _keepWaitingToken;
}
class MySubClassA : CustomYieldInstruction
{
public MySubClassA(ref bool keepWaitingToken)
{
Debug.Log("MySubClassA");
keepWaitingToken = false; // 真正控制的地方
keepWaiting = keepWaitingToken;
}
public override bool keepWaiting {
get; }
}
IEnumerator WaitForSth()
{
print("CUSTOM YIELD INSTRUCTION");
yield return new MyClassA(this);
print("SKILL A EFFECTING");
yield return new WaitForSeconds(1f);
print("ALL DONE");
}
// true
// CUSTOM YIELD INSTRUCTION
// MyClassA
// MySubClassA
// SKILL A EFFECTING
// ALL DONE
// false
// CUSTOM YIELD INSTRUCTION
// MyClassA
// MySubClassA
Unity自定义CustomYieldInstruction
https://docs.unity3d.com/ScriptReference/CustomYieldInstruction.html
list快速排序
var list1 = new List<int>() {
1, 1, 1, 1,1 };
var list2 = new List<int>() {
1, 1, 1, 1 };
var list3 = new List<int>() {
1, 1, 1, 1, 1, 1};
var list = new List<List<int>>();
list.Add(list1);
list.Add(list2);
list.Add(list3);
list.Sort((x, y) =>
{
if (x.Count >= y.Count)
{
return -1; // 1为正序 -1为倒序
}
else
{
return 1;
}
});
print(list[0].Count); // 6
Unity中简易线程使用
// 主线程
Debug.Log("main thread:" + Thread.CurrentThread.ManagedThreadId);
// 线程池,功能强大
Task.Run((