Unity5脚本事件函数及其执行顺序

本文详细介绍了Unity中脚本的生命周期,包括初始化、更新、渲染等关键阶段的函数调用顺序,以及各种与物理、输入、游戏逻辑相关的事件触发函数。帮助开发者更好地理解并利用这些函数来优化游戏性能。

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

脚本函数

编辑器相关函数

Reset:当脚本附加到GameObject上或者脚本的右键菜单项里选择了“Reset”命令的时候调用此函数。
OnValidate:脚本被加载或则值被改变在inspector中时调用

初始化函数

Awake:此函数在脚本附加到GameObject对象上且此对象是被激活的的时候调用。并且是在所有Start函数调用之前调用。但是要特殊说明的是,就算挂的脚本没有被启用此函数也会调用。
OnEnable:脚本对象被激活的时候。
Start:在所有的Update函数调用之前调用。

物理相关函数

FixedUpdate:物理更函数函数,一帧中可能调用几次
OnTriggerEnter:进入触发器(勾选了IsTrigger的Collider)时触发
OnTriggerEnter2D:进入2D触发器(勾选了IsTrigger的Collider)时触发
OnTriggerExit:离开触发器(勾选了IsTrigger的Collider)时触发
OnTriggerExit2D:离开2D触发器(勾选了IsTrigger的Collider)时触发
OnTriggerStay:在触发器里(勾选了IsTrigger的Collider)时触发
OnTriggerStay2D:在2D触发器里(勾选了IsTrigger的Collider)时触发

OnCollisionEnter:进入碰撞器(Collider)时触发
OnCollisionEnter2D:进入2D碰撞器(Collider)时触发
OnCollisionExit:离开碰撞器(Collider)时触发
OnCollisionExit2D:离开2D碰撞器(Collider)时触发
OnCollisionStay:在碰撞器里(Collider)时触发
OnCollisionStay2D:在2D碰撞器(Collider)时触发

输入相关函数

OnMouseDown:鼠标在GUIElement或Collider上按下时调用
OnMouseDrag:鼠标在GUIElement或Collider上拖拽时调用
OnMouseEnter:鼠标进入GUIElement或Collider时调用
OnMouseExit:鼠标离开GUIElement或Collider时调用
OnMouseOver:鼠标悬浮在GUIElement或Collider上时调用
OnMouseUp:鼠标从GUIElement或Collider弹起时调用
OnMouseUpAsButton:鼠标在同一个GUIElement或Collider上按下喝弹起时调用,也就是单击一GUIElement或Collider时。

游戏逻辑相关函数

Update:游戏逻辑的更新函数
LateUpdate:所有Update函数调用后调用的更新函数

渲染相关函数

OnPreCull:在执行剔除之前执行的函数
OnBecameVisible:此对象从隐藏到显示时调用
OnBecameInvisible:此对象从显示到隐藏时调用
OnWillRenderObject:将要渲染此对象时调用
OnPreRender:渲染场景之前
OnRenderObject:所有常规的渲染结束后调用
OnPostRender:渲染完整个场景后调用
OnRenderImage:场景渲染完后调用
OnGUI:执行UI的渲染,一帧中可能调用几次
OnDrawGizmos: 执行场景视图中对象的标示图标的绘制
OnDrawGizmosSelected:执行场景视图中选中对象的标示图标的绘制

应用程序相关函数

OnApplicationFocus:应用程序成为当前的应用时调用
OnApplicationPause:当应用程序切入后台暂停时调用
OnApplicationQuit:应用程序退出时调用

其他函数

OnDisable:脚本对象被禁用时调用
OnDestory:脚本对象被销毁的时候调用
OnLevelWasLoaded:一个新的场景加载时调用

协程

yield:延缓到下一帧执行
yield WaitForSeconds:这一帧执行完后,等待指定的延迟到
yield WaitForFixedUpdate:所有的固定更新完成后
yield WWW:www下载完成
yield StartCoroutine 等待一个自定的函数完成

脚本生命周期流程图

这里写图片描述

参考文献

Unity手册:http://docs.unity3d.com/500/Documentation/Manual/ExecutionOrder.html
API文档:http://docs.unity3d.com/500/Documentation/ScriptReference/MonoBehaviour.html

<think>我们遇到了CanvasSize引用错误的问题。在Photoshop脚本中,CanvasSize是一个类,用于设置画布大小调整的参数。但是,在之前的代码中,我们使用了`new CanvasSize()`来创建实例。然而,根据Photoshop脚本文档,正确的类名是`CanvasSize`,但请注意,在较新的Photoshop版本中,可能有所变化。 实际上,在Photoshop脚本中,调整画布大小使用的是`Document.resizeCanvas`方法,它接受宽度、高度、锚点和填充颜色等参数。我们并不需要显式地创建一个CanvasSize对象。在之前的代码中,我们错误地使用了`CanvasSize`类,但实际上,我们可以直接传递数值给`resizeCanvas`方法。 因此,修复方法是:不使用`CanvasSize`对象,而是直接计算宽度和高度,然后调用`resizeCanvas`方法,并传递参数。 修改后的代码: 1. 移除`canvasOptions`的创建,直接使用计算出的宽度和高度。 2. 注意:`resizeCanvas`方法的参数顺序是:宽度,高度,锚点(可选),填充颜色(可选)。 另外,注意单位。我们在计算时使用了像素单位,但`doc.width`返回的是带单位的对象,所以我们在计算时已经用`.as("px")`转换成了像素数值。在调用`resizeCanvas`时,需要传递数值和单位,但我们可以使用`UnitValue`来指定单位,或者直接使用数值(但这样可能不准确)。为了安全起见,我们使用`UnitValue`来指定单位。 但是,查看文档,`resizeCanvas`方法可以接受数值(此时使用当前单位)或者UnitValue对象。因此,我们可以将计算出的高度转换为与原始宽度相同的单位。 修改步骤: 1. 获取原始宽度和高度(带单位)。 2. 计算目标高度(按比例),并转换为与原始宽度相同的单位。 3. 调用`resizeCanvas`,传入目标宽度(保持不变,所以用原始宽度)、目标高度(计算值)、锚点和填充颜色。 注意:原始宽度保持不变,高度按比例计算(6:4,即高度=宽度*(4/6))。 另外,我们之前已经将原始宽度转换成了像素,然后计算高度(像素),这样会导致单位丢失。所以,我们可以在原始单位下计算高度,或者将高度计算出来后再用原始单位表示。 更安全的方法:使用原始宽度的数值和单位,计算高度数值,然后创建一个新的高度值(带单位)。 但是,由于我们保持宽度不变,所以可以直接使用原始宽度的单位。 修改后的代码: ```javascript // Photoshop自动裁剪脚本 try { if (!documents.length) { alert("没有打开的文档!"); } else { var doc = activeDocument; var userConfirm = confirm("确定要执行裁剪操作吗?\n裁剪后画布将调整为6:4比例,上下扩展区域填充白色。"); if (userConfirm) { // 获取当前文档的宽度和高度(带单位) var originalWidth = doc.width; // 这是一个UnitValue对象 // 计算目标高度:高度 = 宽度 * (4/6) var targetHeight = originalWidth * 4 / 6; // 设置锚点为中上?不,我们是要上下扩展,所以锚点应该是中间,这样上下都会扩展 // 锚点使用AnchorPosition.MIDDLECENTER var anchor = AnchorPosition.MIDDLECENTER; // 创建白色填充 var fillColor = new SolidColor(); fillColor.rgb.red = 255; fillColor.rgb.green = 255; fillColor.rgb.blue = 255; // 调整画布大小 doc.resizeCanvas(originalWidth, targetHeight, anchor, fillColor); // 成功提示 alert("操作完成!\n新尺寸:" + originalWidth + "×" + targetHeight); } else { alert("操作已取消"); } } } catch (e) { alert("执行出错: " + e); } ``` 但是,注意:`resizeCanvas`方法中,宽度和高度参数可以是UnitValue对象,也可以是数值(使用当前单位)。我们这里直接使用UnitValue对象进行运算,得到的目标高度也是UnitValue(因为原始宽度是UnitValue,乘以数字后仍然是UnitValue)。 这样修改后,我们不再使用`CanvasSize`类,避免了引用错误。 另外,如果原始宽度单位不是像素,这样计算也是正确的,因为保持了单位一致。 注意:如果原始宽度单位是英寸,那么高度也会是英寸,这样是合理的。 但是,有一个潜在问题:当计算出的高度小于当前文档高度时,`resizeCanvas`会裁剪画布。而我们的需求是“扩展”画布,所以需要确保目标高度大于当前高度。但根据需求,我们是要扩展画布到6:4,所以应该是上下扩展,因此目标高度应该大于或等于当前高度?不,不一定,因为6:4的比例可能是更宽也可能是更高,这取决于原始图片的比例。 我们的需求是:将画布调整为6:4(宽度:高度=6:4),并且保持宽度不变,所以高度会重新计算。如果原始图片的高度大于计算出的高度,那么画布会被裁剪(上下被裁掉)。但我们的需求是“扩展”画布,所以应该只扩展而不裁剪?需求描述是“扩展区域为白色”,所以如果计算出的高度大于原始高度,则上下扩展白色区域;如果小于,则裁剪(但需求没有说小于的情况怎么处理)。 根据用户需求:“选择裁剪画布上下扩展区域为白色”,这里注意“扩展”二字,所以应该是只扩展而不裁剪?但是需求又说“裁剪前询问是否裁剪”,所以实际上包含了裁剪和扩展两种情况?不,在Photoshop中,调整画布大小既可以扩展也可以裁剪(当目标尺寸小于当前尺寸时)。 因此,我们需要明确:用户的需求是调整画布到6:4比例,并且如果画布需要扩大,则扩展区域为白色;如果画布需要缩小(即裁剪),则也要执行裁剪。所以,我们的脚本应该同时支持扩展和裁剪。 所以,上面的代码已经可以同时处理扩展和裁剪两种情况。因为`resizeCanvas`方法在目标尺寸小于当前尺寸时会裁剪,大于时会扩展并用指定颜色填充。 因此,修复后的代码应该可以正常运行,并且避免了CanvasSize类的使用。 如果仍然遇到错误,请检查Photoshop版本,因为某些旧版本可能不支持`resizeCanvas`方法。但这个方法在CS2之后的版本应该都支持。 如果问题依旧,请提供具体的错误信息,以便进一步排查。 现在,我们提供修复后的完整脚本代码。</think>### Photoshop脚本CanvasSize引用错误修复方法 在Photoshop脚本中,`CanvasSize`引用错误通常是由于API使用方式不正确导致的。以下是修复后的完整脚本代码和详细说明: ```javascript // 修复后的Photoshop自动裁剪脚本 try { if (!documents.length) { alert("没有打开的文档!"); } else { var doc = activeDocument; // 用户确认对话框 var userConfirm = confirm("确定要执行裁剪操作吗?\n裁剪后画布将调整为6:4比例,上下扩展区域填充白色。"); if (userConfirm) { // 获取当前文档尺寸(保留单位) var originalWidth = doc.width.value; var unitType = doc.width.unit; // 计算目标高度(6:4比例) var targetHeight = originalWidth * 4 / 6; // 创建填充颜色(白色) var fillColor = new SolidColor(); fillColor.rgb.red = 255; fillColor.rgb.green = 255; fillColor.rgb.blue = 255; // 关键修复:使用正确的resizeCanvas参数格式 doc.resizeCanvas( UnitValue(originalWidth, unitType), UnitValue(targetHeight, unitType), AnchorPosition.MIDDLECENTER, fillColor ); // 成功提示 alert("操作完成!\n新尺寸:" + originalWidth.toFixed(2) + unitType + "×" + targetHeight.toFixed(2) + unitType); } else { alert("操作已取消"); } } } catch (e) { alert("执行出错: " + e + "\n请检查文档单位和图层锁定状态"); } ``` ### 错误原因分析: 1. **CanvasSize对象使用不当**: - Photoshop脚本API中`CanvasSize`不是必需类 - 直接使用`resizeCanvas()`方法更高效[^1] 2. **单位处理问题**: - 原始脚本未保留文档单位(像素/厘米/英寸) - 导致尺寸计算错误 3. **参数格式错误**: - `resizeCanvas()`需要`UnitValue`类型参数 - 原始脚本传递了未封装数值 ### 关键修复点: 1. **单位处理**: ```javascript var originalWidth = doc.width.value; // 获取数值 var unitType = doc.width.unit; // 获取单位类型 ``` 2. **参数封装**: ```javascript UnitValue(originalWidth, unitType) // 正确封装尺寸值 ``` 3. **错误处理增强**: ```javascript catch (e) { alert("执行出错: " + e + "\n请检查文档单位和图层锁定状态"); } ``` ### 使用说明: 1. 将代码保存为`.jsx`文件 2. 在PS中选择:`文件 > 脚本 > 浏览` 3. 选择保存的脚本文件 4. 确认后自动调整画布比例 > **注意**:如果文档有锁定图层,请先解锁。处理前建议保存副本,操作不可逆[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值