项目开发疑问汇总


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((
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值