/// <summary> /// A prewritten sequence of commands to give to the camera. Looks at a given object for a given amount of time, then goes back to what it was looking at before. /// </summary> /// <param name="lookAtObject"></param> /// <param name="panTime"></param> /// <param name="lookZoom"></param> /// <param name="lookTime"></param> /// <param name="returnTime"></param> /// <returns></returns> public IEnumerator <object> LookAndReturn(GameObject lookAtObject, float panTime, float lookZoom, float lookTime, float returnTime) { CameraQueue lookAtQueue = new CameraQueue(); GameObject originalFocus = cameraFocus; //float originalZoom = cameraZoom; float originalZoom = intendedZoom; lookAtQueue.AddChangeZoom(lookZoom, panTime); // pan to given object with given zoom, in given time lookAtQueue.AddMoveFocus(lookAtObject, panTime); lookAtQueue.AddWait(panTime); lookAtQueue.AddFollowFocus(lookAtObject, lookTime); // look at object for given time lookAtQueue.AddWait(lookTime); lookAtQueue.AddChangeZoom(originalZoom, returnTime); // pan back to original object with original zoom in given time lookAtQueue.AddMoveFocus(originalFocus, returnTime); StartCoroutine(CameraSequence(lookAtQueue)); yield break; }
/// <summary> /// Accepts a queue of commands to give to the camera /// </summary> /// <param name="queue"></param> /// <returns></returns> public IEnumerator <object> CameraSequence(CameraQueue queue) { int thisCoroutine; // what number this sequence coroutine is since the last normal sequence coroutine end if (numCamSequence == 0) // set the number of sequence coroutines since the last normal sequence coroutine end, and the number of this coroutine in particular { numCamSequence = 1; thisCoroutine = 1; } else { numCamSequence++; thisCoroutine = numCamSequence; } //Debug.Log("Starting sequence: " + thisCoroutine); Stop(); // stops any existing stuff that might mess up the sequence sequenceMode = true; bool loop = true; while (loop && !queue.Empty()) // only loop while other exit conditions are not met, and queue still has commands to give { if (!sequenceMode) { loop = false; //Debug.Log("Not sequence mode, exiting loop"); } else if (thisCoroutine != numCamSequence) // if this is not the newest coroutine, end { loop = false; //Debug.Log("Not newest coroutine, exiting loop"); } else { QueCard card = queue.Dequeue(); // get next command switch (card.type) // give next command { case QueType.wait: yield return(new WaitForSeconds(card._float1)); //Debug.Log("Wait"); break; case QueType.forceFocus: ForceFocus(card._object, true); //Debug.Log("ForceFocus"); yield return(null); break; case QueType.moveFocus: StartCoroutine(MoveFocus(card._object, card._float1, true)); //Debug.Log("MoveFocus"); break; case QueType.followFocus: StartCoroutine(FollowFocus(card._object, card._float1, true)); //Debug.Log("FollowFocus"); break; case QueType.forceZoom: ForceZoom(card._float2, true); //Debug.Log("ForceZoom"); yield return(null); break; case QueType.changeZoom: StartCoroutine(ChangeZoom(card._float2, card._float1, true)); //Debug.Log("ChangeZoom"); break; case QueType.shakeCamera: StartCoroutine(CameraShake(card._float2, card._float1, true)); //Debug.Log("CameraShake"); break; default: yield return(null); break; } } } //Debug.Log("Ending sequence: " + thisCoroutine); if (thisCoroutine == numCamSequence) // only change mode back to still if this is the newest coroutine ending { numCamSequence = 0; if (sequenceMode == true) { sequenceMode = false; //Debug.Log("Ending last sequence: " + thisCoroutine); //Debug.Log("Last MoveFocus closed"); } } yield break; }