Unity之TimeLine自定义-代码示例

前言

这里将Cinemachine的Timeline相关的代码复制出来,为扩展提供一些模板,原理还请参看之前的Timeline自定义

CinemachineTrack

using System;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

namespace Cinemachine.Timeline
{
    [Serializable]
    [TrackClipType(typeof(CinemachineShot))]
    [TrackMediaType(TimelineAsset.MediaType.Script)]
    [TrackBindingType(typeof(CinemachineBrain))]
    [TrackColor(0.53f, 0.0f, 0.08f)]
    public class CinemachineTrack : TrackAsset
    {        
        public override Playable CreateTrackMixer(
            PlayableGraph graph, GameObject go, int inputCount)
        {
            // Hack to set the display name of the clip to match the vcam
            foreach (var c in GetClips())
            {
                CinemachineShot shot = (CinemachineShot)c.asset;
                CinemachineVirtualCameraBase vcam = shot.VirtualCamera.Resolve(graph.GetResolver());
                if (vcam != null)
                    c.displayName = vcam.Name;
            }

            var mixer = ScriptPlayable<CinemachineMixer>.Create(graph);
            mixer.SetInputCount(inputCount);
            return mixer;
        }
    }
}

CinemachineMixer

using UnityEngine;
using UnityEngine.Playables;

namespace Cinemachine.Timeline
{
    public sealed class CinemachineMixer : PlayableBehaviour
    {
        // The brain that this track controls
        private CinemachineBrain mBrain;
        private int mBrainOverrideId = -1;
        private bool mPlaying;

        public override void OnGraphStop(Playable playable)
        {
            if (mBrain != null)
                mBrain.ReleaseCameraOverride(mBrainOverrideId); // clean up
            mBrainOverrideId = -1;
        }

        public override void ProcessFrame(Playable playable, FrameData info, object playerData)
        {
            base.ProcessFrame(playable, info, playerData);

            // Get the brain that this track controls.
            // Older versions of timeline sent the gameObject by mistake.
            GameObject go = playerData as GameObject;
            if (go == null)
                mBrain = (CinemachineBrain)playerData;
            else
                mBrain = go.GetComponent<CinemachineBrain>();
            if (mBrain == null)
                return;

            // Find which clips are active.  We can process a maximum of 2.
            // In the case that the weights don't add up to 1, the outgoing weight
            // will be calculated as the inverse of the incoming weight.
            int activeInputs = 0;
            ICinemachineCamera camA = null;
            ICinemachineCamera camB = null;
            float camWeight = 1f;
            for (int i = 0; i < playable.GetInputCount(); ++i)
            {
                CinemachineShotPlayable shot
                    = ((ScriptPlayable<CinemachineShotPlayable>)playable.GetInput(i)).GetBehaviour();
                float weight = playable.GetInputWeight(i);
                if (shot != null && shot.VirtualCamera != null
                    && playable.GetPlayState() == PlayState.Playing
                    && weight > 0.0001f)
                {
                    if (activeInputs == 1)
                        camB = camA;
                    camWeight = weight;
                    camA = shot.VirtualCamera;
                    ++activeInputs;
                    if (activeInputs == 2)
                        break;
                }
            }

            float deltaTime = info.deltaTime;
            if (!mPlaying)
            {
                if (mBrainOverrideId < 0)
                    mLastOverrideFrame = -1;
                float time = Time.realtimeSinceStartup;
                deltaTime = Time.unscaledDeltaTime;
                if (!Application.isPlaying && (mLastOverrideFrame < 0 || time - mLastOverrideFrame > Time.maximumDeltaTime))
                    deltaTime = -1;
                mLastOverrideFrame = time;
            }

            // Override the Cinemachine brain with our results
            mBrainOverrideId = mBrain.SetCameraOverride(
                    mBrainOverrideId, camB, camA, camWeight, deltaTime);

        }
        float mLastOverrideFrame;

        public override void PrepareFrame(Playable playable, FrameData info)
        {
            mPlaying = info.evaluationType == FrameData.EvaluationType.Playback;
        }
    }
}

CinemachineShot(ClipAsset)

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

namespace Cinemachine.Timeline
{
    public sealed class CinemachineShot : PlayableAsset, IPropertyPreview
    {
        public ExposedReference<CinemachineVirtualCameraBase> VirtualCamera;

        public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
        {
            var playable = ScriptPlayable<CinemachineShotPlayable>.Create(graph);
            playable.GetBehaviour().VirtualCamera = VirtualCamera.Resolve(graph.GetResolver());
            return playable;
        }

        // IPropertyPreview implementation
        public void GatherProperties(PlayableDirector director, IPropertyCollector driver)
        {
            driver.AddFromName<Transform>("m_LocalPosition.x");
            driver.AddFromName<Transform>("m_LocalPosition.y");
            driver.AddFromName<Transform>("m_LocalPosition.z");
            driver.AddFromName<Transform>("m_LocalRotation.x");
            driver.AddFromName<Transform>("m_LocalRotation.y");
            driver.AddFromName<Transform>("m_LocalRotation.z");

            driver.AddFromName<Camera>("field of view");
            driver.AddFromName<Camera>("near clip plane");
            driver.AddFromName<Camera>("far clip plane");
        }
    }
}

CinemachineShotPlayable(ClipPlayable)

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

namespace Cinemachine.Timeline
{
    internal sealed class CinemachineShotPlayable : PlayableBehaviour
    {
        public CinemachineVirtualCameraBase VirtualCamera;
    }
}

PlayableDirector(控制TimeLine使用)

void ShowFunction()
    {
        //--设置时间
        playableDirector.time = playableDirector.duration / 2;
        //--开始播放
        playableDirector.Play();
        //--暂停
        playableDirector.Pause();
        //--恢复
        playableDirector.Resume();
        //--停止
        playableDirector.Stop();
        //--获取根节点的Playable
        PlayableGraph pg = playableDirector.playableGraph;
        Playable rpa = pg.GetRootPlayable(0);
        //--获取根节点的输入节点,可以使用递归获取所有playable节点
        for (int i = 0; i < rpa.GetInputCount(); i++)
        {
            var ppa = rpa.GetInput(i);           
        }
        foreach (var bingding in playableDirector.playableAsset.outputs)
        {
            //bingding.streamName--轨道名称
            // bingding.sourceObject--轨道--获取到轨道就可以获取ClipAsset
            TrackAsset trackAsset = bingding.sourceObject as TrackAsset;
            //bingding.outputTargetType--轨道绑定的类型
        }

    }

结束语

以上就是简单的用法。可以复制粘贴了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 您好,以下是 Unity 输入框自定义变量的代码示例: using UnityEngine; using UnityEngine.UI; public class CustomInputField : InputField { [SerializeField] private string customVariable; public string CustomVariable { get { return customVariable; } set { customVariable = value; } } } 在这个示例中,我们继承了 Unity 的 InputField 类,并添加了一个名为 customVariable 的自定义变量。我们还定义了一个名为 CustomVariable 的属性,用于获取和设置自定义变量的值。 希望这个示例能对您有所帮助。 ### 回答2: 在Unity中创建一个自定义输入框变量的代码非常简单。首先,需要确保你在场景中有一个UI Canvas对象。 在脚本中,可以声明一个公共字符串变量,用于存储输入框中的文本。代码如下: ```C# using UnityEngine; using UnityEngine.UI; public class InputFieldExample : MonoBehaviour { public string userInput; // 声明公共字符串变量 private InputField inputField; // 声明一个输入框对象 void Start() { // 获取场景中的输入框组件 inputField = GetComponent<InputField>(); // 添加监听事件,当输入框内容改变时调用UpdateInput方法 inputField.onValueChanged.AddListener(UpdateInput); } private void UpdateInput(string text) { // 每次输入框内容改变时,更新userInput变量 userInput = text; } } ``` 接下来,在Unity编辑器中将此脚本附加到场景中的输入框对象上。这样,当用户在输入框中输入文本时,就会调用`UpdateInput`方法,并更新`userInput`变量的值。 你可以在其他脚本中访问`InputFieldExample`脚本的`userInput`变量,以获取输入框中的文本。 ### 回答3: 在Unity中,可以通过以下代码实现自定义变量的输入框: ```csharp using UnityEngine; using UnityEngine.UI; public class CustomVariableInput : MonoBehaviour { public InputField inputField; // 引用输入框 private int customVariable; // 自定义变量 private void Start() { // 添加输入变化的监听方法 inputField.onValueChanged.AddListener(UpdateCustomVariable); } // 输入值发生变化时更新自定义变量的值 private void UpdateCustomVariable(string value) { int.TryParse(value, out customVariable); } // 可以在需要的地方调用该方法以获取自定义变量的值 public int GetCustomVariableValue() { return customVariable; } } ``` 以上代码首先需要在Unity中创建一个UI输入框,并将该脚本挂载到输入框所在的GameObject上。 在脚本中,我们首先引用Unity的UI命名空间,然后定义了一个公有的InputField变量用于引用输入框。 在Start方法中,我们使用`onValueChanged`来为输入框的值变化事件添加一个监听方法。 `UpdateCustomVariable`方法会在输入框的值发生变化时被调用,函数中使用`int.TryParse`方法将输入框的值转换为整数,并将其赋值给自定义变量`customVariable`。 最后,我们在脚本中提供一个公有方法`GetCustomVariableValue`,以便在需要的地方获取自定义变量的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘培玉--大王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值