做一个简单的位移
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等属性,则需要注意:
Behaviour脚本添加[System.Serializable]
属性必须使用public
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)
{
}
}