// Update is called once per frame
        private void populateAnimation(FabulaClip clip)
        {
            // 3 game objects
            agent              = GameObject.Find(clip.gameobject_name);
            location           = GameObject.Find(clip.startingPos_string);
            animTimelineObject = GameObject.Find(clip.animation_string);

            // control track
            control_track_clip             = ctrack.CreateDefaultClip();
            control_track_clip.start       = clip.start + (float)0.12;
            control_track_clip.duration    = clip.duration - (float)0.12;
            control_track_clip.displayName = clip.Name;
            controlAnim = control_track_clip.asset as ControlPlayableAsset;
            AnimateBind(controlAnim, animTimelineObject);

            // nav track
            nav_track_clip             = ntrack.CreateClip <LerpMoveObjectAsset>();
            nav_track_clip.start       = clip.start;
            nav_track_clip.displayName = clip.Name;
            nav_track_clip.duration    = 0.11;
            LerpMoveObjectAsset tp_obj = nav_track_clip.asset as LerpMoveObjectAsset;

            TransformBind(tp_obj, agent, agent.transform, makeCustomizedTransform(location.transform.position, clip.orientation).transform);
            //setClipOffset(animTimelineObject, anim_loc, anim_rot);
        }
Esempio n. 2
0
        public override void AssignCameraPosition(JSONNode json)
        {
            float   orient           = json["orient"].AsFloat;
            Vector3 dest_minus_start = (ending_location.transform.position - starting_location.transform.position).normalized;

            orientation = Mathf.Atan2(dest_minus_start.x, -dest_minus_start.z) * Mathf.Rad2Deg - 90f;

            var goal_direction = DegToVector3(orient + orientation);

            agentStartPosition = starting_location.transform.position + dest_minus_start * start_disc_offset;
            agentEndPosition   = starting_location.transform.position + dest_minus_start * end_disc_offset;
            agentMidPosition   = agentStartPosition + (agentEndPosition - agentStartPosition) / 2;
            //Debug.Log(agentStartPosition.ToString() + agentEndPosition.ToString() + agentMidPosition.ToString());
            focusTarget = new GameObject();
            focusTarget.transform.position = agentMidPosition;
            var bc = focusTarget.AddComponent <BoxCollider>();

            bc.size = agent.GetComponent <BoxCollider>().size;

            float camDist = CinematographyAttributes.CalcCameraDistance(focusTarget, frame_type);

            //Debug.Log("camera Distance: " + camDist.ToString());
            //Debug.Log("goalDirection: " + (orient + orientation).ToString());

            cbod.FocusDistance = camDist;

            var camHeight = .75f * bc.size.y;

            // position of camera's height depends on angle
            host_go.transform.position = agentMidPosition + (goal_direction * camDist) + new Vector3(0f, camHeight, 0f);;
            //+ new Vector3(0f, target_go.transform.position.y, 0f);
            host_go.transform.rotation.SetLookRotation(agentMidPosition);

            if (json["follow_target"] != null)
            {
                nav_track_clip          = ntrack.CreateClip <LerpMoveObjectAsset>();
                nav_track_clip.start    = start + 0.16f;
                nav_track_clip.duration = duration - 0.16f;
                LerpMoveObjectAsset lerp_clip          = nav_track_clip.asset as LerpMoveObjectAsset;
                GameObject          camera_destination = new GameObject();
                camera_destination.name = "camera lerp destination";
                Vector3 end_camera = ending_location.transform.position + (goal_direction * json["target_distance"].AsFloat) + new Vector3(0f, HEIGHT, 0f);
                camera_destination.transform.position = end_camera;
                GameObject camera_origin = new GameObject();
                camera_origin.name = "camera lerp origin";
                camera_origin.transform.position = host_go.transform.position;
                TransformBind(lerp_clip, host_go, camera_origin.transform, camera_destination.transform);
            }

            //var fwd = host_go.transform.TransformDirection(Vector3.forward);

            if (Physics.Raycast(target_go.transform.position, -goal_direction, camDist - 2))
            {
                cva.m_Lens.NearClipPlane = FindNearPlane(target_go.transform.position, goal_direction, camDist);
            }

            // create clear shot 8 cameras

            CreateClearShot();
        }
Esempio n. 3
0
    private void addTimeTravel(DiscourseClip clip)
    {
        time_track_clip             = ptrack.CreateClip <setFloatClip>();
        time_track_clip.start       = clip.start;
        time_track_clip.duration    = clip.duration;
        time_track_clip.displayName = clip.Name;
        var timeControl = time_track_clip.asset as setFloatClip;

        TimeBind(timeControl, agent, clip.fabulaStart);
    }
    // Use this for initialization
    void Awake()
    {
        List <List <string> > clipList = readFabula();

        foreach (List <string> clipItem in clipList)
        {
            Debug.Log("Clip:");
            foreach (string item in clipItem)
            {
                Debug.Log(item);
            }
        }

        timeline = (TimelineAsset)ScriptableObject.CreateInstance("TimelineAsset");

        PlayableDirector director = GetComponent <PlayableDirector>();

        TrackAsset    ctrack = timeline.CreateTrack <ControlTrack>(null, "control_track");
        PlayableTrack ntrack = timeline.CreateTrack <PlayableTrack>(null, "nav_track");

        foreach (List <string> clipitem_list in clipList)
        {
            string name = clipitem_list[0];
            string type = clipitem_list[1];

            if (type.Equals("animate"))
            {
                float  start         = float.Parse(clipitem_list[2]);
                float  dur           = float.Parse(clipitem_list[3]);
                string anim_location = clipitem_list[4];
                string animation_obj = clipitem_list[5];

                start_pos = GameObject.Find(anim_location).transform;
                var lerp_clip = ntrack.CreateClip <LerpMoveObjectAsset>();
                var lerpclip  = lerp_clip.asset as LerpMoveObjectAsset;

                var clip = ctrack.CreateDefaultClip();
                clip.start       = start;
                clip.duration    = dur;
                clip.displayName = name;
                animTimeline     = GameObject.Find(animation_obj);
                var controlAnim = clip.asset as ControlPlayableAsset;
                anim_transform = animTimeline.transform;
                anim_loc       = anim_transform.position;
                anim_rot       = anim_transform.rotation;

                setClipOffset(animTimeline, anim_loc, anim_rot);
                //List<TimelineClip> lerp_clips = target_lerp_track.GetClips().ToList();

                lerpclip.ObjectToMove.exposedName = UnityEditor.GUID.Generate().ToString();
                lerpclip.LerpMoveTo.exposedName   = UnityEditor.GUID.Generate().ToString();
                //director.SetReferenceValue(lerpclip.ObjectToMove.exposedName, movingObj);
                director.SetReferenceValue(lerpclip.LerpMoveTo.exposedName, start_pos);

                // Set control clip to be on fabula timeline
                controlAnim.sourceGameObject.exposedName = UnityEditor.GUID.Generate().ToString();
                director.SetReferenceValue(controlAnim.sourceGameObject.exposedName, animTimeline);
            }
            else if (type.Equals("navigate"))
            {
                float  start          = float.Parse(clipitem_list[2]);
                float  dur            = float.Parse(clipitem_list[3]);
                string start_location = clipitem_list[4];
                string end_location   = clipitem_list[5];
                string agent          = clipitem_list[6];
                float  speed          = float.Parse(clipitem_list[7]);

                //ntrack
                ////var clip = ctrack.CreateDefaultClip();
                var lerp_clip = ntrack.CreateClip <LerpMoveObjectAsset>();
                var clip      = ntrack.CreateClip <SetAgentTargetAsset>();


                //var navclip = clip.asset as SetAgentTargetAsset;
                lerp_clip.start       = start;
                lerp_clip.duration    = .05f;
                lerp_clip.displayName = "lerp";

                clip.start       = start + .05f;
                clip.duration    = dur - .05f;
                clip.displayName = name;
                GameObject   movingObj       = GameObject.Find(agent);
                NavMeshAgent navigatingAgent = movingObj.GetComponent <NavMeshAgent>();

                start_pos = GameObject.Find(start_location).transform;
                Transform end_pos = GameObject.Find(end_location).transform;

                var navclip  = clip.asset as SetAgentTargetAsset;
                var lerpclip = lerp_clip.asset as LerpMoveObjectAsset;



                navclip.AgentSpeed = speed;
                //navclip.Agent = navigatingAgent as NavMeshAgent;

                navclip.Target.exposedName = UnityEditor.GUID.Generate().ToString();
                navclip.Agent.exposedName  = UnityEditor.GUID.Generate().ToString();
                director.SetReferenceValue(navclip.Agent.exposedName, navigatingAgent);
                director.SetReferenceValue(navclip.Target.exposedName, end_pos);
                lerpclip.ObjectToMove.exposedName = UnityEditor.GUID.Generate().ToString();
                lerpclip.LerpMoveTo.exposedName   = UnityEditor.GUID.Generate().ToString();
                director.SetReferenceValue(lerpclip.ObjectToMove.exposedName, movingObj);
                director.SetReferenceValue(lerpclip.LerpMoveTo.exposedName, start_pos);
            }
            else
            {
                Debug.Log("incorrect clip type");
            }
        }

        director.Play(timeline);
    }
Esempio n. 5
0
    private void populateNavCam(DiscourseClip clip)
    {
        string name     = clip.Name;
        float  start    = clip.start + 0.06f;
        float  duration = clip.duration - 0.06f;
        float  fov      = clip.fov;

        float fab_start = clip.fabulaStart;

        GameObject starting_loc = GameObject.Find(clip.startingPos_string);
        float      start_offset = clip.start_dist_offset;
        GameObject ending_loc   = GameObject.Find(clip.endingPos_string);
        float      end_offset   = clip.end_dist_offset;

        float orient = clip.targetOrientation;

        agent = GameObject.Find(clip.aimTarget);


        // create position of target
        GameObject target_go = new GameObject();

        target_go.name = "target_" + clip.Name;
        target_go.transform.position = agent.transform.position + new Vector3(0f, HEIGHT, 0f);
        target_go.transform.parent   = agent.transform;

        Vector3 dest_minus_start        = (ending_loc.transform.position - starting_loc.transform.position).normalized;
        Vector3 agent_starting_position = starting_loc.transform.position + dest_minus_start * start_offset;
        Vector3 agent_middle_position   = agent_starting_position + dest_minus_start * (end_offset / 2);

        GameObject go = new GameObject();

        go.name = clip.Name;
        float orientation = Mathf.Atan2(dest_minus_start.x, -dest_minus_start.z) * Mathf.Rad2Deg - 90f;

        Vector3 goal_direction = degToVector3(orient + orientation);

        //Debug.Log(orient + orientation);

        go.transform.position = agent_middle_position + (goal_direction * clip.targetDistance) + new Vector3(0f, HEIGHT, 0f);
        go.transform.rotation.SetLookRotation(agent_starting_position);

        CinemachineVirtualCamera cva = go.AddComponent <CinemachineVirtualCamera>();
        CinemachineComposer      cc  = cva.AddCinemachineComponent <CinemachineComposer>();

        cc.m_DeadZoneWidth     = 0.5f;
        cc.m_SoftZoneWidth     = 0.8f;
        cva.m_Lens.FieldOfView = clip.fov;
        cva.m_LookAt           = target_go.transform;


        CinemachineBasicMultiChannelPerlin cbmcp = cva.AddCinemachineComponent <CinemachineBasicMultiChannelPerlin>();

        cbmcp.m_NoiseProfile  = Instantiate(Resources.Load("Handheld_tele_mild", typeof(NoiseSettings))) as NoiseSettings;
        cbmcp.m_AmplitudeGain = 0.5f;
        cbmcp.m_FrequencyGain = 1f;

        if (clip.followTarget != null)
        {
            nav_track_clip          = ntrack.CreateClip <LerpMoveObjectAsset>();
            nav_track_clip.start    = clip.start + 0.16f;
            nav_track_clip.duration = clip.duration - 0.16f;
            LerpMoveObjectAsset lerp_clip          = nav_track_clip.asset as LerpMoveObjectAsset;
            GameObject          camera_destination = new GameObject();
            camera_destination.name = "camera lerp destination";
            Vector3 end_camera = ending_loc.transform.position + (goal_direction * clip.targetDistance) + new Vector3(0f, HEIGHT, 0f);
            camera_destination.transform.position = end_camera;
            GameObject camera_origin = new GameObject();
            camera_origin.name = "camera lerp origin";
            camera_origin.transform.position = go.transform.position;
            TransformBind(lerp_clip, go, camera_origin.transform, camera_destination.transform);
        }


        bool has_fab_switch = false;

        if (clip.fabulaStart >= 0f)
        {
            has_fab_switch = true;
            GameObject ttravel = Instantiate(Resources.Load("time_travel", typeof(GameObject))) as GameObject;
            ttravel.transform.parent = go.transform;
            ttravel.GetComponent <timeStorage>().fab_time = clip.fabulaStart;
            TimelineClip tc = ctrack.CreateDefaultClip();
            tc.start       = clip.start;
            tc.duration    = clip.duration;
            tc.displayName = "Time Travel";
            var time_travel_clip = tc.asset as ControlPlayableAsset;
            AnimateBind(time_travel_clip, ttravel);
        }

        // default clip attributes
        film_track_clip = ftrack.CreateDefaultClip();
        if (has_fab_switch)
        {
            start    = clip.start + (float)0.06;
            duration = clip.duration;
        }
        film_track_clip.start       = start;
        film_track_clip.duration    = duration;
        film_track_clip.displayName = clip.Name;

        // specialize and bind
        var cinemachineShot = film_track_clip.asset as CinemachineShot;

        CamBind(cinemachineShot, cva);
    }
Esempio n. 6
0
        private static void ConfigTimeline(StoryData root, Dictionary <int, GameObject> goDict)
        {
            if (root == null || root.timlineData == null || root.timlineData.Length < 1)
            {
                return;
            }
            foreach (var data in root.timlineData)
            {
                if (data.pdTrans == null || data.tlAsset == null)
                {
#if UNITY_EDITOR
                    Debug.LogError("[Story Data Error] -- PlayableDirector is Missing!");
#endif
                    continue;
                }
                var pd      = data.pdTrans.gameObject.AddComponent <PlayableDirector>();
                var tlAsset = Object.Instantiate(data.tlAsset);
                pd.playableAsset  = tlAsset;
                pd.playOnAwake    = false;
                pd.timeUpdateMode = DirectorUpdateMode.Manual;
                pd.gameObject.AddComponent <PlayableDirectorManualCtrl>();
                if (data.bindingData != null)
                {
                    foreach (var d in data.bindingData)
                    {
                        GameObject tmpGo = null;
                        if (d.go != null)
                        {
                            tmpGo = d.go;
                        }
                        else
                        {
                            tmpGo = FindNode(root.transform, d.nodeId, d.nestPath, goDict);
                        }
                        if (tmpGo == null)
                        {
                            continue;
                        }

                        var track = tlAsset.GetOutputTrack(d.index);

                        if (d.typeStr == "GameObject")
                        {
                            pd.SetGenericBinding(track, tmpGo);
                        }
                        else
                        {
                            Object comp = tmpGo.GetComponent(d.typeStr);
                            if (comp != null)
                            {
                                if (track is UnityEngine.Timeline.AnimationTrack)
                                {
                                    var anim = comp as Animator;
                                    if (anim != null && anim.runtimeAnimatorController != null)
                                    {
                                        var parentTrans = tmpGo.transform.parent;
                                        if (parentTrans == null || parentTrans.name != "roleAnchro")
                                        {
                                            anim.runtimeAnimatorController = null;
                                        }
                                    }
                                }

                                pd.SetGenericBinding(track, comp);
                            }
#if UNITY_EDITOR
                            else
                            {
                                Debug.LogError("[Story Data Error] -- SetGenericBinding faild :" + tmpGo.name + "type:" + d.typeStr);
                            }
#endif
                        }
                    }
                }

                if (data.exposeData != null)
                {
                    foreach (var d in data.exposeData)
                    {
                        if (d.obj == null)
                        {
                            GameObject tmpGo = FindNode(root.transform, d.nodeId, d.nestPath, goDict);
                            if (tmpGo == null)
                            {
                                continue;
                            }

                            if (d.typeStr == "GameObject")
                            {
                                pd.SetReferenceValue(d.propId, tmpGo);
                            }
                            else
                            {
                                Object comp = tmpGo.GetComponent(d.typeStr);
                                if (comp != null)
                                {
                                    pd.SetReferenceValue(d.propId, comp);
                                }
#if UNITY_EDITOR
                                else
                                {
                                    Debug.LogError("[Story Data Error] -- SetReferenceValue faild :" + tmpGo.name + "type:" + d.typeStr);
                                }
#endif
                            }
                        }
                        else
                        {
                            if (d.typeStr == "GameObject")
                            {
                                pd.SetReferenceValue(d.propId, d.obj);
                            }
                            else
                            {
                                Object comp = d.obj.GetComponent(d.typeStr);
                                if (comp != null)
                                {
                                    pd.SetReferenceValue(d.propId, comp);
                                }
#if UNITY_EDITOR
                                else
                                {
                                    Debug.LogError("[Story Data Error] -- SetReferenceValue faild :" + d.obj.name + "type:" + d.typeStr);
                                }
#endif
                            }
                        }
                    }
                }

                //binding camera
                if (mainCam != null)
                {
                    var camBrain = mainCam.GetComponent <Cinemachine.CinemachineBrain>();
                    for (int i = 0; i < tlAsset.outputTrackCount; i++)
                    {
                        var track = tlAsset.GetOutputTrack(i) as Cinemachine.Timeline.CinemachineTrack;
                        if (track != null)
                        {
                            pd.SetGenericBinding(track, camBrain);
                        }
                    }
                }

                //create wwise track
                if (data.audioInfo != null && data.audioInfo.Length > 0)
                {
                    var           commitTargetTrack    = tlAsset.CreateTrack <PlayableTrack>(null, "WwiseCtrl");
                    PlayableTrack subCommitTargetTrack = null;
                    double        lastEnd = 0f;
                    foreach (var info in data.audioInfo)
                    {
                        TimelineClip clip = null;

                        if (info.startTime < lastEnd)
                        {
                            if (subCommitTargetTrack == null)
                            {
                                subCommitTargetTrack = tlAsset.CreateTrack <PlayableTrack>(null, "WwiseCtrl1");
                            }
                            clip = subCommitTargetTrack.CreateClip <WwiseEvent>();
                        }
                        else
                        {
                            clip = commitTargetTrack.CreateClip <WwiseEvent>();
                        }
                        var asset = clip.asset as WwiseEvent;
                        asset.audioName = info.audioName;
                        clip.start      = info.startTime;
                        clip.duration   = 0.1;
                        lastEnd         = clip.start + clip.duration;
                    }
                }
            }
        }