Exemple #1
0
    /// <summary>
    /// 设置人物动画轨道,相机轨道
    /// </summary>
    /// <param name="director">播放器</param>
    /// <param name="animator">人物动画</param>
    /// <param name="brain">主相机</param>
    /// <param name="cameras">机位列表</param>
    private void SetCinemachineTrack(PlayableDirector director, CinemachineBrain brain, params CinemachineVirtualCameraBase[] cameras)
    {
        bool cinemachineFinded = false;
        bool animatorFinded    = false;

        foreach (PlayableBinding binding in director.playableAsset.outputs)
        {
            if (binding.streamName.Equals("CinemachineTrack"))
            {
                director.SetGenericBinding(binding.sourceObject, brain);

                int index = 0;

                CinemachineTrack track = (CinemachineTrack)binding.sourceObject;
                foreach (TimelineClip clip in track.GetClips())
                {
                    CinemachineShot cameraShot = clip.asset as CinemachineShot;

                    director.SetReferenceValue(cameraShot.VirtualCamera.exposedName, cameras != null && index < cameras.Length ? cameras[index] : null);

                    index++;
                }
                cinemachineFinded = true;
            }

            if (cinemachineFinded && animatorFinded)
            {
                break;
            }
        }
    }
Exemple #2
0
    public void BindToPlayableDirector(PlayableDirector playableDirector)
    {
        foreach (var output in playableDirector.playableAsset.outputs)
        {
            Binding binding = null;
            if (output.sourceObject is CinemachineTrack)
            {
                CinemachineTrack cinemachineTrack = output.sourceObject as CinemachineTrack;
                if (bindingMap.TryGetValue(cinemachineTrack.name, out binding))
                {
                    playableDirector.SetGenericBinding(cinemachineTrack, binding.cinemachineBrain);
                }

                foreach (var clip in cinemachineTrack.GetClips())
                {
                    if (bindingMap.TryGetValue(clip.displayName, out binding))
                    {
                        var cinemachineShot = clip.asset as CinemachineShot;
                        playableDirector.SetReferenceValue(cinemachineShot.VirtualCamera.exposedName, binding.cinemachineVCam);
                    }
                }
            }
            else if (output.sourceObject is AnimationTrack)
            {
                AnimationTrack animationTrack = output.sourceObject as AnimationTrack;
                if (bindingMap.TryGetValue(animationTrack.name, out binding))
                {
                    playableDirector.SetGenericBinding(animationTrack, binding.animator);
                }
            }
            else if (output.sourceObject != null)
            {
                if (bindingMap.TryGetValue(output.sourceObject.name, out binding))
                {
                    playableDirector.SetGenericBinding(output.sourceObject, binding.gameObject);
                }
            }
        }
    }
Exemple #3
0
    bool Process(TimelineInfo timelineInfo)
    {
        var  timelineState  = EntityManager.GetComponentData <TimelineState>(timelineInfo.Owner);
        bool isCanInterrupt = timelineState.InterruptStatus == TimelineState.InterruptState.Allow;

        if (!isCanInterrupt)
        {
            return(false);
        }
        ResourceManager.GetInstance().LoadAsset <PlayableAsset>(timelineInfo.ResPath, delegate(UnityEngine.Object[] objs)
        {
            if (objs == null || objs.Length <= 0)
            {
                return;
            }
            var entity         = timelineInfo.Owner;
            var playerDirector = EntityManager.GetComponentObject <PlayableDirector>(entity);
            playerDirector.Stop();
            playerDirector.playableAsset = objs[0] as PlayableAsset;
            var looksInfo = EntityManager.GetComponentData <LooksInfo>(entity);
            if (looksInfo.CurState != LooksInfo.State.Loaded)
            {
                return;
            }
            var looksEntity = looksInfo.LooksEntity;
            var animator    = EntityManager.GetComponentObject <Animator>(looksEntity);
            foreach (var at in playerDirector.playableAsset.outputs)
            {
                if (at.sourceObject.GetType() == typeof(AnimationTrack))
                {
                    playerDirector.SetGenericBinding(at.sourceObject, animator);
                }
                else if (at.sourceObject.GetType() == typeof(CinemachineTrack))
                {
                    CinemachineBrain mainCamBrian = SceneMgr.Instance.MainCameraTrans.GetComponent <Cinemachine.CinemachineBrain>();//将主摄像机传入
                    playerDirector.SetGenericBinding(at.sourceObject, mainCamBrian);
                    CinemachineTrack cinemachineTrack = (CinemachineTrack)at.sourceObject;
                    int idx = 0;
                    try
                    {
                        foreach (var c in cinemachineTrack.GetClips())
                        {
                            CinemachineShot shot = (CinemachineShot)c.asset;
                            // playerDirector.SetReferenceValue(shot.VirtualCamera.exposedName, vCams[idx++]);
                        }
                    }
                    catch (Exception)
                    {
                        Debug.LogError("Clip Num InEqual Cam Num");
                    }
                }
                else if (at.streamName.StartsWith("ParticleTrack"))
                {
                    var nameParts     = at.streamName.Split('_');
                    var hangPointName = "root";
                    if (nameParts.Length > 1)
                    {
                        hangPointName = nameParts[1];
                    }
                    var ct             = at.sourceObject as ControlTrack;
                    var looksTrans     = EntityManager.GetComponentObject <Transform>(looksEntity);
                    var particleParent = looksTrans.Find(hangPointName);
                    foreach (var info in ct.GetClips())
                    {
                        var cpa = info.asset as ControlPlayableAsset;
                        playerDirector.SetReferenceValue(cpa.sourceGameObject.exposedName, particleParent.gameObject);
                    }
                }
                // Debug.Log("timelineInfo.Param != null : "+(timelineInfo.Param != null).ToString());
                if (timelineInfo.Param != null)
                {
                    var nameParts = at.streamName.Split('_');
                    // Debug.Log("nameParts : "+nameParts[0]);
                    if (timelineInfo.Param.ContainsKey(nameParts[0]))
                    {
                        var ta = at.sourceObject as TrackAsset;
                        foreach (var info in ta.GetClips())
                        {
                            // var cpa = info.asset as ScriptPlayable<>;
                            var cpa = info.asset as ParamPlayableAsset;
                            Debug.Log("cpa != null : " + (cpa != null).ToString());
                            if (cpa != null)
                            {
                                cpa.Param = timelineInfo.Param[nameParts[0]];
                            }
                            else
                            {
                                Debug.LogError("error : trying to set param with no param playable asset name : " + at.streamName);
                            }
                        }
                    }
                }
            }
            playerDirector.Play();
        });
        return(true);
    }