lua的coroutine

本文详细介绍了Lua语言中协程的使用方法,包括创建、挂起、恢复和状态检查等功能,通过实例演示了如何利用协程进行高效的任务调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编辑器是IDEA,lua协程学习汇总:

---lua协程
--可以使用debug模式一步步查看程序的运行

coroutineFunction = function(a,b)
--coroutine.yield 挂起正在运行的协程 传递给yield的参数将成为resume的额外返回值
for i = 1, 3 do
    print(i,a,b)
    local returnValue01,returnValue02 =  coroutine.yield()
    print(returnValue01,returnValue02)
end
end
--coroutine.create 根据一个函数创建协同程序
co2 = coroutine.create(coroutineFunction)
--coroutine.resume 开始或者继续一个协程的运行
--当第一次执行一个协程时,从主函数开始运行,参数传入函数主体
--如果协程被挂起,resume会重新启动它,参数作为挂起点的返回值
coroutine.resume(co2,100,200)  --输出 1 100 200
coroutine.resume(co2,500,600)  --输出 500 600 和 2 100 200
coroutine.resume(co2,700,800)  --输出 700 800 和 3 100 200


testM01 = function(a,b)
    print(coroutine.status(co1)) --输出running
    print("co",a,b,coroutine.yield("king"))
    return "bbb"
end
co1 = coroutine.create(testM01)
--coroutine.status 显示协程状态
--如果协程正常运行,那么resume返回true和传给yield的参数(当协程挂起)
--或者时主体函数的所有返回值(当协程终止)
print(coroutine.resume(co1,1,2))  --输出 true king
print(coroutine.status(co1)) --输出 suspended
print(coroutine.resume(co1,3,4,5)) --输出 co 1 2 3 4 5 true bbb
print(coroutine.status(co1))  --输出 dead




local co1 = coroutine.create(
        function()
            print("来看看协程出现错误怎么处理")
            coroutine.yield(bb.name)
 end)
--coroutine.resume是在保护模型下运行,如果有错误发生
--lua不会显示错误,而是返回false和错误消息
--同时这个协程的状态变成dead
print(coroutine.resume(co1))
print(coroutine.status(co1)) --输出dead


local co2 = coroutine.create(
        function()
            print(coroutine.running()) --输出thread: 0079C490
 end)
coroutine.resume(co2)
--coroutine.running 返回当前正在运行的协程
print(coroutine.running())  -- 输出 nil

---coroutine.wrap 创建一个新协程
--返回一个函数,每次调用该函数都会延续该协程
--coroutine.wrap不是在保护模型下运行,如果发生错误,则抛出这个错误
local wrap = coroutine.wrap(
        function(input)
            print("函数的参数"..input)
            local can1,can2 = coroutine.yield("bbb")
            print(can1,can2)
            return "函数返回值"
 end)
print(wrap("abc")) --输出 函数的参数abc  bbb
print(wrap("efg")) --输出 efg nil  函数的返回值
<think>嗯,用户遇到了在UnityGame视窗中模型被裁切的问题。我需要先理解这个问题的可能原因,然后逐步分析解决方案。 首先,模型被裁切可能是因为摄像机的近裁剪平面(Near Clipping Plane)设置不当。如果这个值太大,靠近摄像机的物体可能会被裁掉一部分。比如,如果近裁剪平面设置为1,那么距离摄像机1单位以内的物体都不会显示。这时候需要调整到合适的值,比如0.3左右,看看是否解决问题。不过用户可能不太清楚具体怎么调整,应该给出步骤:在Inspector视图中找到Camera组件,修改Near属性。 其次,模型的位置或者缩放可能有问题。如果模型本身的位置超出了摄像机的视锥体范围,或者在Z轴上被缩放过小,也可能导致部分模型不可见。这时候需要检查模型的Transform组件,确保Position的Z轴值在摄像机范围内,同时Scale不要太小或太大。可能需要提醒用户检查父物体的缩放,因为父物体的缩放会影响子物体。 还有可能是摄像机的投影模式(Projection)设置不对。如果是正交模式(Orthographic),Size的大小会影响可见范围。如果Size太小,模型可能会被裁切。这时候需要调整Size的值,或者切换到透视模式(Perspective)并调整Field of View。 另外,场景中的其他物体遮挡也可能导致问题,但用户提到的是裁切,所以更可能是摄像机设置的问题。不过还是可以建议用户检查是否有其他物体遮挡,并尝试隐藏其他物体来排查。 最后,如果以上方法都不奏效,可能需要考虑模型本身的问题,比如顶点数据错误。这时候可以建议用户将模型导入到新项目测试,或者使用ProBuilder重新创建一个简单模型来验证是否是模型的问题。 还需要考虑用户可能对Unity界面不熟悉,所以在步骤中要具体说明如何找到Camera组件,如何调整参数,以及如何检查Transform属性。同时,引用相关的文档或社区建议会增加可信度,比如引用Unity官方关于裁剪平面的说明。 总结下来,解决方案应该分步骤,从摄像机设置、模型变换、投影模式、场景遮挡到模型检查,逐步排除可能的原因。确保用户能够按照步骤操作,并理解每个步骤的作用。</think>在Unity编辑器中解决Game视窗模型被裁切的问题,可按照以下步骤排查和修复: 1. **调整摄像机近裁剪平面** - 在Hierarchy中选择Main Camera - 在Inspector中找到Camera组件 - 将`Clipping Planes/Near`值调整为较小的值(如0.3) $$Near \geq 0.01$$ - 原理:过大的近裁剪平面会剔除靠近摄像机的物体[^1] 2. **检查模型位置和缩放** - 在Scene视图中按F键聚焦模型 - 查看Transform组件的Position Z值是否在摄像机远/近裁剪平面范围内 - 确认Scale值未出现极端数值(如0.01或1000) 3. **验证投影模式** ```csharp // 可通过脚本临时验证 void Start() { Camera.main.orthographic = false; // 切换为透视模式 Camera.main.fieldOfView = 60; // 标准视场角 } ``` - 正交模式需调整`Size`,透视模式需调整`Field of View` 4. **检查父物体缩放** - 在Hierarchy中逐级检查父物体的Scale值 - 异常的父级缩放会导致子物体实际尺寸畸变 $$ActualScale = \prod_{i=1}^{n} Parent_iScale \times LocalScale$$ 5. **强制刷新渲染** - 在Scene视图右上角切换2D/3D模式 - 修改Layer设置后重新分配物体层级 - 使用`Mesh.RecalculateBounds()`重建网格包围盒[^2] 6. **排除遮挡问题** - 临时禁用其他物体的Renderer组件 - 在Scene视图中使用孤立显示模式(右击物体选择"Isolate") 7. **模型数据验证** - 导出为FBX后用建模软件检查 - 在Unity中使用ProBuilder创建替代模型测试 $$VertexError = \sum_{i=1}^{n} |v_i - \overline{v}|$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值