Unity Timeline自定义学习

做一个简单的位移

1、首先需要创建一个轨道(Track),只需要限制一下轨道(Track)上面片段(TrackClip)的类型即可。

[TrackClipType(typeof(TransformPlayableAsset))]
public class TransformTrack : PlayableTrack
{

}

2、创建一个PlayableAsset

[System.Serializable]
public class TransformPlayableAsset : PlayableAsset
{
    public ExposedReference<Transform> transform;
    public ExposedReference<Transform> start;
    public ExposedReference<Transform> end;
    public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    {
        var playable = ScriptPlayable<TransformBehaviour>.Create(graph);//创建一个带有behaviour的clip
        var behaviour = playable.GetBehaviour();//获取上面的behaviour
        behaviour.transform = transform.Resolve(graph.GetResolver());
        behaviour.start = start.Resolve(graph.GetResolver());
        behaviour.end = end.Resolve(graph.GetResolver());
        return playable;
    }
}

每一个片段可以理解成这是一个Asset资源,本身是找不到场景中的物体的,这时候需要

ExposedReference<Transform>这种方式来找到场景中的物体。如果挂的是Asset中的资源则正常用即可。

然后需要创建playable,也就是片段(TrackClip)上面的逻辑代码,再获取上面的Behaviour,对上面的属性赋值。

我的理解是PlayableAsset的职责就是对片段(TrackClip)加工修饰,让片段可以挂场景中的物体,有逻辑代码(behaviour)。

3、创建片段的Behaviour

public class TransformBehaviour : PlayableBehaviour
{
    public Transform transform;
    public Transform start;
    public Transform end;
    public override void PrepareFrame(Playable playable, FrameData info)
    {
        float t = (float)(playable.GetTime() / playable.GetDuration());
        transform.position = Vector3.Lerp(start.position, end.position, t);
    }
}

主要写一些逻辑代码。

如果使用string、int等属性,则需要注意:

  1. Behaviour脚本添加[System.Serializable]

  1. 属性必须使用public

  1. PlayableAsset中创建的时候使用模板创建例如: public TransformBehaviour behaviour = new TransformBehaviour(); ScriptPlayable<TransformBehaviour>.Create(graph,behaviour);

以下是修改后的代码:

[System.Serializable]
public class TransformPlayableAsset : PlayableAsset
{
    public TransformBehaviour behaviour = new TransformBehaviour();
    public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    {
        var playable = ScriptPlayable<TransformBehaviour>.Create(graph,behaviour);//创建一个带有behaviour的clip
        return playable;
    }
}
[System.Serializable]
public class TransformBehaviour : PlayableBehaviour
{
    public Vector3 pos;
    public override void PrepareFrame(Playable playable, FrameData info)
    {
        
    }
}

猜你喜欢

转载自blog.csdn.net/u010197227/article/details/129278506