动画系统

参考 https://longqian.me/

Bokeh Plot
public PlayableDirector director;
public Dictionary<String, PlayableBinding> bindingDict = new Dictionary<String, PlayableBinding>(); //轨道映射

public Action onStopAction = null;

bool stop = true;

void OnEnable()
{
    stop = true;
    if (!director)
    {
        var gameObject = new Object()
        var directors = gameObject.GetComponentsInChildren();
        if (directors.Length < 0)
        {
            if (onStopAction != null)
            {
                var tmp = onStopAction;
                onStopAction = null;
                tmp.Invoke();
            }

            return;
        }

        director = directors[0];
        foreach (var bind in director.playableAsset.outputs)
        {
            if (!bindingDict.ContainsKey(bind.streamName))
            {
                bindingDict.Add(bind.streamName, bind);
            }
        }
    }
}

//轨道绑定
public void BindTrackGameObject(String trackName, GameObject go)
{
    PlayableBinding pb;
    if (bindingDict.TryGetValue(trackName, out pb))
    {
        director.SetGenericBinding(pb.sourceObject, go);
    }
}


abc
# Python code snippet
print("Hello World!")

https://www.cnblogs.com/zhaoqingqing/p/3894061.html 鼠标动画很有意思,尝试复刻

Dotween

需求,显示跑马灯。

因为视野内最多只出现 3 个记录,所以在一个 Mask 内,让三个记录对象依次从底部 PosA 到顶部 PosB 移动,并且循环即可。开始实现如下

local PosA = -10
local PosB = 10
local speed = 10
function M:LoopAnim(index)
    local gameObjct = self.list[index].gameObject
    local transform = self.list[index].transform
    API.SetObjUIPosY(gameObject, PosA)
    local time = (PosB - PosA) / speed
    local tween = transform:DOAnchorPosY(PosB, time):SetEase(API.Ease.Linear)
    tween:OnComplete(function()
        -- Set text
    end)
    
    tween:SetLoop(-1)
end

但是开始播放的时候,如果按照循环直接播放,记录会出现的比较晚。所以更改做法,分为两段,新增第一段:安排三个记录设置位置后,先向上播放一次。结束后再进行循环

function M:PlayAnim()
    local tempStartY = -(i * itemSpace + (i - 1) * itemHeight)
    API.SetObjUIPosY(t.gameObject, tempStartY)
    local time = (PosB - tempStartY) / speed
    local tween = t:DOAnchorPosY(PosB, time):SetEase(API.Ease.Linear)
    tween:OnComplete(function()
    	self:LoopAnim(i)
    end)
end

踩到的坑

所以完整的为

function M:PlayAnim()
    for i = 1, 3 do
        local xxx = xxx
        local t = xxx.transform
        local tempStartY = -(i * itemSpace + (i - 1) * itemHeight)

        API.SetObjUIPosY(xxx.gameObject, tempStartY)
        local time = (targetY - tempStartY) / speed
        local tween = t:DOAnchorPosY(targetY, time):SetEase(Ease.Linear)
        tween:OnComplete(function()
            self:LoopAnim(i)
        end)
    end
end

function M:LoopAnim(index)
    local i = index
    local t = xxx.transform
    local followItem = (index - 2) % 3 + 1
    local y = followItem.gameObject.rectTransform.localPosition.y
    local tempStartY = y - itemHeight - itemSpace
    API.SetObjUIPosY(xxx.gameObject, tempStartY)

    local time = (targetY - tempStartY) / speed
    local tween = t:DOAnchorPosY(targetY, time):SetEase(Ease.Linear)
    tween:OnComplete(function()
        -- set text
        self:LoopAnim(i)
    end)
end

注意问题

Tween 创建后再等几秒使用会出现动画不可控的情况,特别是 seq 。

--local seq = DOTween:Sequence() -- bug
TM(delayTime, function()
    local seq = DOTween:Sequence() -- fine
	seq:Append()
	seq:Join()
end)