// 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); }
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(); }
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); }
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); }
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; } } } }