using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { Animator animator; public Transform endRun; public Transform endWalk; public Transform man; Queue queue=new Queue(); bool finishFlag = true; private void Awake() { animator = GetComponentInChildren(); } public void WalkAndSquat() { EventManager.Instance.emit("StartTip"); queue.Enqueue(MovePosByWalk(transform, endWalk.position, 2)); queue.Enqueue(MovePosByRun(transform, endRun.position, 2)); queue.Enqueue(Squat(transform, man)); StartCoroutine(StartQueue()); } IEnumerator MovePosByWalk(Transform ts, Vector3 targetPos, float speed) { animator.SetBool("Walk", true); while (true) { yield return new WaitForFixedUpdate(); Vector3 moveDir = (targetPos - ts.position).normalized; ts.position += moveDir * Time.fixedDeltaTime * speed; Quaternion targetRotation = Quaternion.LookRotation(targetPos - ts.position); ts.rotation = Quaternion.Lerp(ts.rotation, targetRotation, 0.01f); if (Vector3.Distance(ts.position, targetPos) <= 0.1) { ts.position = targetPos; animator.SetBool("Walk", false); finishFlag = true; yield break; } } } IEnumerator MovePosByRun(Transform ts, Vector3 targetPos, float speed) { animator.SetBool("Run", true); while (true) { yield return new WaitForFixedUpdate(); Vector3 moveDir = (targetPos - ts.position).normalized; ts.position += moveDir * Time.fixedDeltaTime * speed * 1.5f; Quaternion targetRotation = Quaternion.LookRotation(targetPos - ts.position); ts.rotation = Quaternion.Lerp(ts.rotation, targetRotation, 0.01f); if (Vector3.Distance(ts.position, targetPos) <= 0.1) { ts.position = targetPos; animator.SetBool("Run", false); finishFlag = true; yield break; } } } IEnumerator Squat(Transform my, Transform ts) { transform.position = new Vector3(-46.55f, 1.560401f, 126.989f); transform.localEulerAngles = new Vector3(0,270,0); animator.SetTrigger("Squat"); Invoke("E_OpenQuestion", 1); yield return null; } void E_OpenQuestion(){ EventManager.Instance.emit("Question"); Level1Manager.Instance.AddOperate(Level1Const.operate1Info); } bool Finish() { return finishFlag; } IEnumerator StartQueue() { while (true) { yield return new WaitUntil(Finish); if (queue.Count != 0) { StartCoroutine(queue.Dequeue()); finishFlag = false; yield return null; } else { yield break; } } } }