社区脚本示例
社区脚本示例
Section titled “社区脚本示例”探索我们收集的社区贡献的 After Effects 脚本。这些自动化工具和工作流程增强器有助于简化您的创作过程并提高生产力。
智能项目清理器
Section titled “智能项目清理器”/** * 智能项目清理器 * 移除未使用的项目并组织项目结构 * 作者: 社区 */
(function() { 'use strict';
function cleanProject() { app.beginUndoGroup('清理项目');
try { var project = app.project; var removedItems = 0;
// 移除未使用的素材项 for (var i = project.numItems; i >= 1; i--) { var item = project.item(i); if (item instanceof FootageItem && item.usedIn.length === 0) { item.remove(); removedItems++; } }
alert('项目已清理!移除了 ' + removedItems + ' 个未使用的项目。');
} catch (error) { alert('错误: ' + error.toString()); } finally { app.endUndoGroup(); } }
cleanProject();})();批量渲染设置
Section titled “批量渲染设置”/** * 批量渲染设置 * 自动为多个合成设置渲染队列 */
(function() { 'use strict';
function setupBatchRender() { var project = app.project; var renderQueue = app.project.renderQueue; var outputPath = Folder.selectDialog('选择输出文件夹');
if (!outputPath) return;
app.beginUndoGroup('批量渲染设置');
try { for (var i = 1; i <= project.numItems; i++) { var item = project.item(i);
if (item instanceof CompItem && item.name.indexOf('[RENDER]') === 0) { var renderItem = renderQueue.items.add(item); var outputModule = renderItem.outputModule(1);
var fileName = item.name.replace('[RENDER]', '').trim(); var outputFile = new File(outputPath.fsName + '/' + fileName + '.mov');
outputModule.file = outputFile; outputModule.applyTemplate('高质量'); } }
alert('渲染队列设置完成!');
} catch (error) { alert('错误: ' + error.toString()); } finally { app.endUndoGroup(); } }
setupBatchRender();})();图层实用工具
Section titled “图层实用工具”智能图层组织器
Section titled “智能图层组织器”/** * 智能图层组织器 * 按类型组织图层并创建文件夹结构 */
(function() { 'use strict';
function organizeLayers() { var comp = app.project.activeItem; if (!comp || !(comp instanceof CompItem)) { alert('请选择一个合成'); return; }
app.beginUndoGroup('整理图层');
try { var folders = { '文本图层': [], '形状图层': [], '固态图层': [], '素材图层': [], '空对象': [] };
// 分类图层 for (var i = 1; i <= comp.numLayers; i++) { var layer = comp.layer(i);
if (layer instanceof TextLayer) { folders['文本图层'].push(layer); } else if (layer instanceof ShapeLayer) { folders['形状图层'].push(layer); } else if (layer.source instanceof SolidSource) { folders['固态图层'].push(layer); } else if (layer.nullLayer) { folders['空对象'].push(layer); } else { folders['素材图层'].push(layer); } }
// 创建文件夹结构 for (var folderName in folders) { if (folders[folderName].length > 0) { var folderLayer = comp.layers.addNull(); folderLayer.name = folderName; folderLayer.label = 14; // 橙色
// 将图层父级链接到文件夹 for (var j = 0; j < folders[folderName].length; j++) { folders[folderName][j].parent = folderLayer; } } }
alert('图层整理成功!');
} catch (error) { alert('错误: ' + error.toString()); } finally { app.endUndoGroup(); } }
organizeLayers();})();关键帧烘焙器
Section titled “关键帧烘焙器”/** * 关键帧烘焙器 * 将表达式烘焙为关键帧以获得更好的性能 */
(function() { 'use strict';
function bakeExpressions() { var comp = app.project.activeItem; if (!comp || !(comp instanceof CompItem)) { alert('请选择一个合成'); return; }
var selectedLayers = comp.selectedLayers; if (selectedLayers.length === 0) { alert('请选择带有表达式的图层'); return; }
var frameRate = comp.frameRate; var duration = comp.duration; var totalFrames = Math.floor(duration * frameRate);
app.beginUndoGroup('烘焙表达式');
try { for (var i = 0; i < selectedLayers.length; i++) { var layer = selectedLayers[i]; bakeLayerExpressions(layer, frameRate, totalFrames); }
alert('表达式已烘焙为关键帧!');
} catch (error) { alert('错误: ' + error.toString()); } finally { app.endUndoGroup(); } }
function bakeLayerExpressions(layer, frameRate, totalFrames) { var properties = ['position', 'scale', 'rotation', 'opacity'];
for (var i = 0; i < properties.length; i++) { var prop = layer.transform[properties[i]];
if (prop.expression !== '') { var expression = prop.expression; prop.expression = ''; // 移除表达式
// 采样值并创建关键帧 for (var frame = 0; frame <= totalFrames; frame++) { var time = frame / frameRate; prop.expression = expression; var value = prop.valueAtTime(time, false); prop.expression = ''; prop.setValueAtTime(time, value); } } } }
bakeExpressions();})();导出与导入工具
Section titled “导出与导入工具”图层数据导出器
Section titled “图层数据导出器”/** * 图层数据导出器 * 将图层信息导出为 JSON 以供外部处理 */
(function() { 'use strict';
function exportLayerData() { var comp = app.project.activeItem; if (!comp || !(comp instanceof CompItem)) { alert('请选择一个合成'); return; }
var exportData = { composition: { name: comp.name, width: comp.width, height: comp.height, duration: comp.duration, frameRate: comp.frameRate }, layers: [] };
// 收集图层数据 for (var i = 1; i <= comp.numLayers; i++) { var layer = comp.layer(i); var layerData = { index: layer.index, name: layer.name, type: getLayerType(layer), inPoint: layer.inPoint, outPoint: layer.outPoint, startTime: layer.startTime, position: layer.transform.position.value, scale: layer.transform.scale.value, rotation: layer.transform.rotation.value, opacity: layer.transform.opacity.value };
exportData.layers.push(layerData); }
// 保存到文件 var file = File.saveDialog('保存图层数据', '*.json'); if (file) { file.open('w'); file.write(JSON.stringify(exportData, null, 2)); file.close(); alert('图层数据导出成功!'); } }
function getLayerType(layer) { if (layer instanceof TextLayer) return 'text'; if (layer instanceof ShapeLayer) return 'shape'; if (layer instanceof CameraLayer) return 'camera'; if (layer instanceof LightLayer) return 'light'; if (layer.nullLayer) return 'null'; if (layer.source instanceof SolidSource) return 'solid'; return 'footage'; }
exportLayerData();})();- 批量操作: 自动处理多个项目
- 工作流程优化: 简化重复性任务
- 项目管理: 组织和维护项目
- 动画助手: 辅助复杂动画
- 效果实用工具: 高效管理和应用效果
- 文本工具: 高级文本图层操作
- 数据交换: 导入/导出项目数据
- 格式转换: 在不同格式之间转换
- 资产管理: 组织和管理项目资产
简单脚本 (< 50行)
Section titled “简单脚本 (< 50行)”- 单一用途的自动化
- 基本的图层操作
- 简单的计算
中等脚本 (50-200行)
Section titled “中等脚本 (50-200行)”- 多步骤工作流程
- 用户界面元素
- 数据处理
复杂脚本 (200+行)
Section titled “复杂脚本 (200+行)”- 完整的工作流程系统
- 高级 UI 面板
- 与外部工具集成
开发最佳实践
Section titled “开发最佳实践”/** * 脚本模板 * 描述: 此脚本的功能 * 作者: 您的姓名 * 版本: 1.0.0 * 日期: YYYY-MM-DD */
(function() { 'use strict';
// 配置 var CONFIG = { scriptName: '我的脚本', version: '1.0.0' };
// 主函数 function main() { try { // 验证环境 if (!validateEnvironment()) { return; }
// 执行主要逻辑 executeScript();
} catch (error) { handleError(error); } }
function validateEnvironment() { if (typeof app === 'undefined') { alert('此脚本需要 After Effects'); return false; } return true; }
function executeScript() { // 您的脚本逻辑在此处 }
function handleError(error) { alert('在 ' + CONFIG.scriptName + ' 中发生错误: ' + error.toString()); }
// 执行 main();})();// 始终使用 try-catch 块try { // 风险操作 var comp = app.project.activeItem; if (!comp) { throw new Error('没有活动的合成'); }
} catch (error) { // 优雅地处理错误 $.writeln('错误: ' + error.toString()); alert('操作失败: ' + error.message);}// 使用撤销组以获得更好的性能app.beginUndoGroup('脚本操作');try { // 此处有多个操作} finally { app.endUndoGroup();}
// 缓存频繁访问的对象var comp = app.project.activeItem;var transform = layer.transform;
// 避免重复的属性访问for (var i = 1; i <= comp.numLayers; i++) { var layer = comp.layer(i); // 缓存图层引用 // 多次使用 layer}- 文档: 清晰的注释和使用说明
- 错误处理: 健壮的错误检查和用户反馈
- 性能: 针对速度和内存使用进行优化
- 兼容性: 在不同的 AE 版本中测试
- 清晰的目的和描述
- 正确的错误处理
- 用户友好的反馈
- 性能优化
- 代码注释
- 使用说明
- 版本兼容性说明
🔗 相关资源
Section titled “🔗 相关资源”- 脚本开发指南 - 学习 ExtendScript
- ExtendScript 工具包 - 开发环境
- 表达式示例 - 社区表达式
- 插件示例 - 社区插件
热门脚本创意
Section titled “热门脚本创意”工作流程增强
Section titled “工作流程增强”- 项目模板创建器
- 资产组织器
- 渲染队列管理器
- 版本控制助手
- 关键帧实用工具
- 运动路径生成器
- 缓动曲线创建器
- 动画预设
- CSV 导入器
- JSON 导出器
- 批量处理器
- 格式转换器
与社区分享您的脚本,帮助每个人更强大地使用 After Effects!