AE 익스프레션만으로 LINE 메시지 화면 애니메이션

익스프레션만으로 해결!



앱 LINE의 움직임을 재현하려고 하면 상당히 힘들었습니다.
내용은 그렇지 않습니다만, 어떻게 하면 스마트한지 생각해 버렸습니다.

AE 화면은 이렇게 되어 있습니다.
메시지 나누어진 컴포지션이 나란히 있을 뿐입니다.


완성은 이런 움직임



익스프레션 설명



기본적으로 최초의 메세지의 위치를 ​​바꾸어 가는 형태로 했습니다.
기본 레이어는 첫 번째 메시지 레이어뿐입니다.
다른 레이어는 그것에 대해 가는 형태입니다.
실제로는 아래 레이어의 위치에 대해 갑니다.

우선 try{}cathe{}
에서 이 레이어가 기준점인지 여부를 정의합니다.
이 레이어가 기준점이 아니면

var check = layerRefer.name.split(/\s+/)[0];
이것은 레이어의 이름을/로 구분합니다.
실제 check에는 grp라는 문자열이 저장됩니다.

if ( check == 'msg' && layerRefer.active)
여기에는 레이어 이름에 "msg"가 포함되어 있고 레이어가 활성 상태일 때

var temp = layerRefer.height/2;
var x = thisLayer.width/2;
var y = temp+layerRefer.position[1]+thisLayer.height/2+pad ;
[x, y];
이제 아래 레이어의 위치 아래에 thislayer 레이어가 오도록 설정하고 있습니다.

첫 번째 try에서 기점이 되는 레이어의 경우 이것은 이른바 thislayer의 인덱스 위의 숫자로 msg의 레이어가 없으면 된다.
이것이 기점인지 판단하고 기점이라면
if (xxx() > bottomPosition ){
[thisLayer.width/2,260+bottomPosition -xxx()]
}
else {
[thisLayer.width/2,260+thisLayer.height/2]
}
적응합니다.

이것은 처음으로 결정한 1550px;
초과한 경우와 초과하지 않는 경우의 처리입니다.
이것에 의해 1550px를 넘으면
기점의 레이어가 표시되어 넘은 레이어분의 포지션을 위로 올리고 있습니다.

설명이 정말 좋지 않습니다.
var CinLNum = thisComp.numLayers; //レイヤー総数
var myIndexNum = thisLayer.index;//レイヤーインデックス
var bottomPosition = 1550; //折り返すポジション
var pad = 50; //コンポジション間のパディング

for ( var i = myIndexNum ; i <= CinLNum ; i++){
    try{
        var layerRefer = thisComp.layer(i+1);
        var check = layerRefer.name.split(/\s+/)[0];
        if ( check == 'msg' && layerRefer.active){
            var temp = layerRefer.height/2;
            var x = thisLayer.width/2;
            var  y =  temp+layerRefer.position[1]+thisLayer.height/2+pad ;
            [x,y]
        break;
        }
    }
    catch (e){
        e  
    }
    if (xxx() > bottomPosition ){
        [thisLayer.width/2,260+bottomPosition -xxx()]
    }
    else{
        [thisLayer.width/2,260+thisLayer.height/2]
    }
}

function xxx(){
    var temp = 0;
    for ( var i = myIndexNum ; i >= 1 ; i--){
    var layerRefer = thisComp.layer(i);
    var check = layerRefer.name.split(/\s+/)[0];
        if ( check == 'msg' && layerRefer.active){
            temp = temp + layerRefer.height+ pad;
        }
    }
    return temp;
}

조금 정정판



var CinLNum = thisComp.numLayers;
var myIndexNum = thisLayer.index;
var firstposition = 260;
var bottomPosition = 1800;
var pad = 50;

for ( var i = myIndexNum ; i <= CinLNum ; i++){
    try{
        var layerRefer = thisComp.layer(i+1);
        var check = layerRefer.name.split(/\s+/)[0];
        if ( check == 'msg' && layerRefer.active){
            var temp = layerRefer.height/2;
            var x = thisLayer.width/2;
            var  y =  temp+layerRefer.position[1]+thisLayer.height/2+pad ;
            [x,y]
        break;
        }
    }
    catch (e){
        e  
    }
    if (xxx() > bottomPosition-pad  ){
        [thisLayer.width/2,firstposition+bottomPosition -xxx()]
    }
    else{
        [thisLayer.width/2,firstposition+thisLayer.height/2]
    }
}
function xxx(){
    var temp = 0;
    for ( var i = myIndexNum ; i >= 1 ; i--){
    var layerRefer = thisComp.layer(i);
    var check = layerRefer.name.split(/\s+/)[0];
        if ( check == 'msg' && layerRefer.active){
            temp = temp + layerRefer.height+ pad;
        }
    }
    return temp+firstposition/2+pad*2;
}

좋은 웹페이지 즐겨찾기