/* * ============================================================ * MG 排版动效模板 · AE 2022 (22.x) / ExtendScript * 风格:瑞士 / 野兽派 typographic motion(黑底网格 + 橙蓝双色 + 巨字) * 参考风格来自 BV1Jmbp66EfA,内容与文案全部另写,不复刻 * * 用法:AE 2022 → 文件 → 脚本 → 运行脚本文件… → 选它 * * 设计原则(跟人做的一样,不是逐帧画): * · 全部用关键帧 + 缓动 + 表达式 + 形状中继器,不烘帧 * · 网格/网点 = 形状图层 Repeater * · 大字入场 = 位置滑动 + 遮幅 + 缩放冲击 * · 色块转场 = 纯色层 scale/position K 帧 * · 文案集中在 CFG.TEXT,改一行就能换词 * ============================================================ */ (function mgTypeMotion() { // ---------------- 配置 ---------------- var C = { black: "0D0D0D", white: "FFFFFF", orange: "F2500A", blue: "1B3AF0", cream: "F3EDE4" }; var CFG = { compName: "MG_TYPE_STUDY", width: 1920, height: 1080, fps: 30, duration: 12 }; // 文案:全部自己写,跟参考片无关 var TEXT = { label: "MOTION STUDY / 01", hero: "MOTION", big1: "MAKE", big2: "IT MOVE", seq: ["TYPE", "SHAPE", "TIME"], marquee: "KEEP IT MOVING \u00B7 ", collage: ["MOTION", "TYPE", "TIME", "01", "STUDY", "GRID"], outro1: "MOTION STUDY 01", outro2: "AE 2022 / 30FPS / 12S" }; // ---------------- 工具 ---------------- function rgb(hex) { hex = String(hex).replace("#", ""); return [parseInt(hex.substr(0, 2), 16) / 255, parseInt(hex.substr(2, 2), 16) / 255, parseInt(hex.substr(4, 2), 16) / 255]; } function rgba(hex) { var c = rgb(hex); c.push(1); return c; } function T(frame) { return frame / CFG.fps; } function tr(layer) { return layer.property("ADBE Transform Group"); } function pos(layer) { return tr(layer).property("ADBE Position"); } function scl(layer) { return tr(layer).property("ADBE Scale"); } function opa(layer) { return tr(layer).property("ADBE Opacity"); } // 给一个属性在指定帧写值,并设为缓动 function k(prop, frame, value, easeKind) { prop.setValueAtTime(T(frame), value); var i = prop.nearestKeyIndex(T(frame)); if (easeKind === "linear") { prop.setInterpolationTypeAtKey(i, KeyframeInterpolationType.LINEAR, KeyframeInterpolationType.LINEAR); } else if (easeKind === "hold") { prop.setInterpolationTypeAtKey(i, KeyframeInterpolationType.HOLD, KeyframeInterpolationType.HOLD); } else { prop.setInterpolationTypeAtKey(i, KeyframeInterpolationType.BEZIER, KeyframeInterpolationType.BEZIER); } return i; } // 新建纯色层 function solid(comp, hex, name, frameIn, frameOut) { var s = comp.layers.addSolid(rgba(hex), name, CFG.width, CFG.height, 1); if (frameIn !== undefined) s.inPoint = T(frameIn); if (frameOut !== undefined) s.outPoint = T(frameOut); return s; } // 新建文字层。fontName 传了就试,失败用默认字体 function text(comp, str, size, hex, x, y, align, fontName) { var lyr = comp.layers.addText(str); var src = lyr.property("ADBE Text Properties").property("ADBE Text Document"); var td = src.value; td.text = str; td.fontSize = size; td.fillColor = rgba(hex); td.fauxBold = true; td.justification = (align === "center") ? ParagraphJustification.CENTER_JUSTIFY : ParagraphJustification.LEFT_JUSTIFY; if (fontName) { try { td.font = fontName; } catch (e) {} } src.setValue(td); pos(lyr).setValue([x, y]); return lyr; } // 形状层里加一个"线"组 function lineGroup(shapeLayer, name, x1, y1, x2, y2) { var root = shapeLayer.property("ADBE Root Vectors Group"); var g = root.addProperty("ADBE Vector Group"); g.name = name; var gc = g.property("ADBE Vectors Group"); var pathProp = gc.addProperty("ADBE Vector Shape - Group"); var sh = new Shape(); sh.vertices = [[x1, y1], [x2, y2]]; sh.closed = false; pathProp.property("ADBE Vector Shape").setValue(sh); return g; } // 形状层里加一个"矩形填充"组 function rectGroup(shapeLayer, name, w, h) { var root = shapeLayer.property("ADBE Root Vectors Group"); var g = root.addProperty("ADBE Vector Group"); g.name = name; var gc = g.property("ADBE Vectors Group"); var rc = gc.addProperty("ADBE Vector Shape - Rect"); rc.property("ADBE Vector Rect Size").setValue([w, h]); return g; // 填充由调用方加:g.property("ADBE Vectors Group").addProperty("ADBE Vector Graphic - Fill") } // ---------------- 开始 ---------------- app.beginUndoGroup("MG 排版动效 自动搭建"); try { var comp = app.project.items.addComp(CFG.compName, CFG.width, CFG.height, 1, CFG.duration, CFG.fps); comp.bgColor = rgb(C.black); comp.motionBlur = true; // ===== 0. 黑底 ===== solid(comp, C.black, "BG_BLACK"); // ===== 1. 网格(形状 + 中继器,一次成型)===== var grid = comp.layers.addShape(); grid.name = "GRID_60"; var gl = lineGroup(grid, "hline", -CFG.width, 0, CFG.width, 0); var hl = gl.property("ADBE Vectors Group").addProperty("ADBE Vector Graphic - Stroke"); hl.property("ADBE Vector Stroke Color").setValue(rgba(C.white)); hl.property("ADBE Vector Stroke Width").setValue(1); var hrep = gl.property("ADBE Vectors Group").addProperty("ADBE Vector Filter - Repeater"); hrep.property("ADBE Vector Repeater Copies").setValue(24); hrep.property("ADBE Vector Repeater Offset").setValue([0, 72]); var gv = lineGroup(grid, "vline", 0, -CFG.height, 0, CFG.height); var vl = gv.property("ADBE Vectors Group").addProperty("ADBE Vector Graphic - Stroke"); vl.property("ADBE Vector Stroke Color").setValue(rgba(C.white)); vl.property("ADBE Vector Stroke Width").setValue(1); var vrep = gv.property("ADBE Vectors Group").addProperty("ADBE Vector Filter - Repeater"); vrep.property("ADBE Vector Repeater Copies").setValue(40); vrep.property("ADBE Vector Repeater Offset").setValue([72, 0]); pos(grid).setValue([CFG.width / 2, CFG.height / 2]); opa(grid).setValue(0); k(opa(grid), 0, 0); k(opa(grid), 24, 16); k(opa(grid), 330, 16); k(opa(grid), 358, 0); // ===== 2. 顶部小标注 ===== var lab = text(comp, TEXT.label, 26, C.white, 110, 90, "left"); opa(lab).setValue(0); k(opa(lab), 8, 0); k(opa(lab), 20, 100); k(opa(lab), 340, 100); // ===== 3. Beat A:MOTION 巨字 + 斜划红线 ===== var hero = text(comp, TEXT.hero, 340, C.white, 960, 560, "center"); pos(hero).setValue([960, 900]); k(pos(hero), 12, [960, 900], "linear"); k(pos(hero), 30, [960, 560]); k(pos(hero), 60, [960, 545]); k(pos(hero), 74, [960, 380]); opa(hero).setValue(0); k(opa(hero), 12, 0); k(opa(hero), 20, 100); k(opa(hero), 74, 100); hero.motionBlur = true; // 红线:scaleX 从 0 拉到满,再歪一点 var strike = comp.layers.addShape(); strike.name = "STRIKE_RED"; var strikeG = rectGroup(strike, "bar", 1200, 10); var sfill = strikeG.property("ADBE Vectors Group").addProperty("ADBE Vector Graphic - Fill"); sfill.property("ADBE Vector Fill Color").setValue(rgba(C.orange)); pos(strike).setValue([960, 540]); var sclS = scl(strike); sclS.setValue([0, 100]); k(sclS, 22, [0, 100], "linear"); k(sclS, 38, [100, 100]); tr(strike).property("ADBE Rotate Z").setValue(0); k(tr(strike).property("ADBE Rotate Z"), 22, -3); k(tr(strike).property("ADBE Rotate Z"), 70, -7); strike.motionBlur = true; // ===== 4. Beat B:奶白色卡片翻上来 + 大字 ===== var card = solid(comp, C.cream, "CARD_WHITE", 72, 150); tr(card).property("ADBE Anchor Point").setValue([CFG.width / 2, CFG.height]); pos(card).setValue([CFG.width / 2, CFG.height * 2]); k(pos(card), 72, [CFG.width / 2, CFG.height * 2], "linear"); k(pos(card), 84, [CFG.width / 2, CFG.height]); k(pos(card), 132, [CFG.width / 2, CFG.height]); k(pos(card), 144, [CFG.width / 2, 0], "linear"); card.motionBlur = true; var b1 = text(comp, TEXT.big1, 300, C.black, 130, 430, "left"); pos(b1).setValue([-400, 430]); k(pos(b1), 84, [-400, 430], "linear"); k(pos(b1), 98, [130, 430]); k(pos(b1), 130, [130, 430]); b1.motionBlur = true; var b2 = text(comp, TEXT.big2, 300, C.black, 130, 760, "left"); pos(b2).setValue([-900, 760]); k(pos(b2), 92, [-900, 760], "linear"); k(pos(b2), 106, [130, 760]); k(pos(b2), 130, [130, 760]); b2.motionBlur = true; // ===== 5. Beat C:色块 + 三个词快切 + 网点 ===== var blueBar = solid(comp, C.blue, "BAR_BLUE", 144, 216); tr(blueBar).property("ADBE Scale").setValue([100, 18]); pos(blueBar).setValue([-800, 300]); k(pos(blueBar), 144, [-800, 300], "linear"); k(pos(blueBar), 158, [960, 300]); k(pos(blueBar), 206, [960, 300]); k(pos(blueBar), 216, [2700, 300], "linear"); blueBar.motionBlur = true; var orangeBar = solid(comp, C.orange, "BAR_ORANGE", 150, 216); tr(orangeBar).property("ADBE Scale").setValue([100, 46]); pos(orangeBar).setValue([2700, 850]); k(pos(orangeBar), 150, [2700, 850], "linear"); k(pos(orangeBar), 166, [960, 850]); k(pos(orangeBar), 206, [960, 850]); k(pos(orangeBar), 216, [-800, 850], "linear"); orangeBar.motionBlur = true; var seqY = [300, 560, 850]; var seqSizes = [180, 220, 150]; var seqColors = [C.white, C.black, C.black]; var i, w; for (i = 0; i < TEXT.seq.length; i++) { w = text(comp, TEXT.seq[i], seqSizes[i], seqColors[i], 960, seqY[i], "center"); scl(w).setValue([40, 40]); k(scl(w), 156 + i * 12, [40, 40], "linear"); k(scl(w), 164 + i * 12, [105, 105]); k(scl(w), 170 + i * 12, [100, 100]); opa(w).setValue(0); k(opa(w), 156 + i * 12, 0); k(opa(w), 162 + i * 12, 100); w.motionBlur = true; } // 网点条:小圆 + 中继器 var dots = comp.layers.addShape(); dots.name = "DOTS"; var dgrp = dots.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group"); var dgc = dgrp.property("ADBE Vectors Group"); var dell = dgc.addProperty("ADBE Vector Shape - Ellipse"); dell.property("ADBE Vector Ellipse Size").setValue([8, 8]); var dfill = dgc.addProperty("ADBE Vector Graphic - Fill"); dfill.property("ADBE Vector Fill Color").setValue(rgba(C.black)); var drep = dgc.addProperty("ADBE Vector Filter - Repeater"); drep.property("ADBE Vector Repeater Copies").setValue(46); drep.property("ADBE Vector Repeater Offset").setValue([16, 0]); pos(dots).setValue([-200, 980]); k(pos(dots), 160, [-200, 980], "linear"); k(pos(dots), 210, [1500, 980]); dots.motionBlur = true; // ===== 6. Beat D:蓝底 + 跑马灯大屏 ===== var blueBg = solid(comp, C.blue, "BG_BLUE", 216, 288); tr(blueBg).property("ADBE Anchor Point").setValue([CFG.width / 2, CFG.height]); tr(blueBg).property("ADBE Scale").setValue([100, 0]); k(tr(blueBg).property("ADBE Scale"), 216, [100, 0], "linear"); k(tr(blueBg).property("ADBE Scale"), 228, [100, 100]); k(tr(blueBg).property("ADBE Scale"), 276, [100, 100]); k(tr(blueBg).property("ADBE Scale"), 288, [100, 0], "linear"); blueBg.motionBlur = true; var marqueeText = TEXT.marquee; for (i = 0; i < 5; i++) { marqueeText += TEXT.marquee; } var mq = text(comp, marqueeText, 200, C.white, 0, 540, "left"); pos(mq).setValue([400, 540]); k(pos(mq), 216, [400, 540], "linear"); k(pos(mq), 288, [-3200, 540], "linear"); mq.motionBlur = true; var mq2 = text(comp, TEXT.marquee + TEXT.marquee, 96, C.black, 0, 760, "left"); pos(mq2).setValue([-500, 760]); k(pos(mq2), 216, [-500, 760], "linear"); k(pos(mq2), 288, [1400, 760], "linear"); mq2.motionBlur = true; // ===== 7. Beat E:叠字拼贴 ===== var rnd = 0; var placements = [ [-60, 260, -8], [980, 200, 6], [420, 470, -4], [1300, 560, 10], [180, 760, 5], [860, 900, -6] ]; for (i = 0; i < TEXT.collage.length && i < placements.length; i++) { var p = placements[i]; var cw = text(comp, TEXT.collage[i], 150 + (i % 3) * 40, (i % 2 === 0) ? C.white : C.orange, p[0], p[1], "left"); tr(cw).property("ADBE Rotate Z").setValue(p[2]); opa(cw).setValue(0); k(opa(cw), 288 + i * 3, 0); k(opa(cw), 296 + i * 3, 100); k(opa(cw), 312, 100); k(opa(cw), 322, 0); cw.motionBlur = true; } // ===== 8. Beat F:收尾落版 ===== var outro = text(comp, TEXT.outro1, 150, C.white, 960, 520, "center"); opa(outro).setValue(0); k(opa(outro), 320, 0); k(opa(outro), 334, 100); k(opa(outro), 358, 100); var outro2 = text(comp, TEXT.outro2, 40, C.orange, 960, 610, "center"); opa(outro2).setValue(0); k(opa(outro2), 328, 0); k(opa(outro2), 342, 100); k(opa(outro2), 358, 100); // 收尾下方一条红线 var rule = comp.layers.addShape(); rule.name = "RULE"; var ruleG = rectGroup(rule, "bar", 900, 6); var rfill = ruleG.property("ADBE Vectors Group").addProperty("ADBE Vector Graphic - Fill"); rfill.property("ADBE Vector Fill Color").setValue(rgba(C.orange)); pos(rule).setValue([960, 700]); var rs = scl(rule); rs.setValue([0, 100]); k(rs, 330, [0, 100], "linear"); k(rs, 348, [100, 100]); comp.openInViewer(); alert("搭建完成:" + CFG.compName + "\n12 秒 / 30fps / 6 个节奏点\n\n" + "改文案:脚本顶部 CFG.TEXT\n改配色:脚本顶部 C\n" + "所有动画都是关键帧+缓动,没有烘帧,随便调。"); } catch (err) { alert("脚本出错(第 " + err.line + " 行):\n" + err.toString()); } app.endUndoGroup(); })();