using UnityEngine; using System.Collections.Generic; using AX.TrackRecord; using AX.MessageSystem; using System; using System.Collections; public class AgentRecord : MonoBehaviour { [HideInInspector] public Vector3[] nowpath;//记录寻路拐点 private AgentControl agentControl; UnityEngine.AI.NavMeshPath navMeshPath; UnityEngine.AI.NavMeshAgent agent; private bool IsFirstPFFlag = false;//该记录的第一次寻路标志,开始记录时赋值true public static bool FirstPFEventFlag = false; public float timer = 0;//计时器 private float startSpeed;//速度 private float startangularSpeed;//转弯速度 private float acceleration;//加速度 public static int speedFactor = 1;//加速倍数 //public static GameObject xfy_nearest = null; public bool theNearestXFY = false; private const float threshold = 1.5f;//距离阈值 private bool startGo; public List xfyList = new List(); public int target_cengID = 0; public BuildType target_buildType = BuildType.TypeA; private Vector3 lastPos; public void SetList() { var list = InputManager.Instance_.GetSelectedCharacters(); xfyList.Clear(); foreach (var xfy in list) { xfyList.Add(xfy); } } // Use this for initialization void Start() { agentControl = GetComponent(); navMeshPath = new UnityEngine.AI.NavMeshPath(); agent = GetComponent(); //speedFactor = 1; startSpeed = agent.speed; startangularSpeed = agent.angularSpeed; acceleration = 50000000; } void OnEnable() { MessageDispatcher.AddListener("StartRecord", StartRecord); TheBackView.instance.SpeedChangeEvent += OnSpeedChangeEvent; if (!agent) { agent = GetComponent(); } StartCoroutine(Delay()); } IEnumerator Delay() { yield return null; agent.speed = startSpeed * speedFactor; agent.angularSpeed = startangularSpeed * speedFactor; acceleration = 50000000; } void OnDestroy() { MessageDispatcher.RemoveListener("StartRecord", StartRecord); } void OnDisable() { MessageDispatcher.RemoveListener("StartRecord", StartRecord); TheBackView.instance.SpeedChangeEvent -= OnSpeedChangeEvent; } private int lastSpeed = -1; void OnSpeedChangeEvent(SpeedChangeEventArgs e) { //e.speed--当前的加倍播放的速率?????? agent.speed = startSpeed * e.speed; agent.angularSpeed = startangularSpeed * e.speed; acceleration = 50000000; if (e.speed == 0) { agent.Stop(); Time.timeScale = 0; } else { if (lastSpeed == 0) { agent.Resume();//Resume()-----暂停之后,沿着当前路径重新恢复前进 Time.timeScale = 1; } } lastSpeed = e.speed; } void StartRecord(IMessage message) { FirstPFEventFlag = true; IsFirstPFFlag = true; timer = RecordManager.Instance.RecordTimer; if (nowpath != null && GetComponent().velocity.magnitude > 0) { navMeshPath.ClearCorners(); try { UnityEngine.AI.NavMesh.CalculatePath(transform.position, nowpath[nowpath.Length - 1], -1, navMeshPath); } catch (Exception e) { System.Diagnostics.Trace.TraceError(e.Message); } nowpath = navMeshPath.corners; } } bool clearPathFlag = false; // Update is called once per frame void Update() { if (startGo && nowpath!=null && nowpath.Length>0) { //ChangeCengID(); //var speed = agent.velocity.magnitude; var dis = Vector3.Distance(transform.position, nowpath[nowpath.Length - 1]); if (dis <= threshold + 0.1f) { startGo = false; //if (theNearestXFY) //{ for (int i = xfyList.Count - 1; i >= 0; i--) { GameObject xfy = xfyList[i]; if (!xfy) {//消防员用delete删除后,查找不到 xfyList.Remove(xfy); continue; } else { xfy.GetComponent().cengID = target_cengID; xfy.GetComponent().CengIDBuildType = target_buildType; } } //} GetComponent().cengID = target_cengID; GetComponent().CengIDBuildType = target_buildType; //clearPathFlag = true; } } if (RecordManager.Instance.IsRecording) { Record(); } //if (clearPathFlag) //{ // var speed= agent.velocity.magnitude; // if (speed == 0) // { // clearPathFlag = false; // nowpath = null; // } //} } private void ChangeCengID() { //靠近一个路点,设置cengID属性(只有消防员需要设置) if (gameObject.name.Contains("xiaofang"))//xiaofangyuan { if (nowpath != null && GetComponent().velocity.magnitude > 0)//寻路过程中 { var pathpointList = new List(nowpath); var index = pathpointList.FindIndex(p => { return Vector3.Distance(transform.position, p) < 3f; }); if (index >= 0)//靠近某一个路径点了 { var buildType = target_buildType; if (target_cengID != 0) { int cengID_get = CengIDManager.Instance.GetCengIDByY(pathpointList[index].y, buildType); gameObject.GetComponent().cengID = cengID_get; //if (cengID_get != 0) //{ // gameObject.GetComponent().CengIDBuildType = buildType; //} //else //{ // gameObject.GetComponent().CengIDBuildType = BuildType.None; //} gameObject.GetComponent().CengIDBuildType = buildType; } else { gameObject.GetComponent().cengID = target_cengID; gameObject.GetComponent().CengIDBuildType = buildType; } } } } } public void StartGo_(GameObject hitObj) { //StartCoroutine(StartGo(hitObj)); startGo = true; if (hitObj.GetComponent()) { target_cengID = hitObj.GetComponent().cengID; target_buildType = hitObj.GetComponent().CengIDBuildType; } } public void StartGo_(int cengID, BuildType buildType) { //StartCoroutine(StartGo(hitObj)); startGo = true; target_cengID = cengID; target_buildType = buildType; } private IEnumerator StartGo(GameObject hitObj) { yield return new WaitForSeconds(0.2f); startGo = true; if (hitObj.GetComponent()) { target_cengID = hitObj.GetComponent().cengID; target_buildType = hitObj.GetComponent().CengIDBuildType; } //SetList(); } void Record() { //if ((gameObject.name.Contains("xiaofangyuan") && theNearestXFY) // || gameObject.name.Contains("xiaofangche")) //当前位置靠近某一个路径点足够进的时候,记录下一个寻路事件 if (nowpath != null && nowpath.Length>0 && GetComponent().velocity.magnitude > 0)//寻路过程中 { var pathpointList = new List(nowpath); var index = pathpointList.FindIndex(p => { return Vector3.Distance(transform.position, p) < threshold; }); if (index >= 0)//靠近某一个路径点了 { if (index == 0)//是nowpath的0号点 { if (IsFirstPFFlag)//该次记录的第一次寻路的第一个路径点,更新下timer时间 { timer = RecordManager.Instance.RecordTimer; IsFirstPFFlag = false; return; } } //var same_point_index = RecordManager.Instance.record.EventList.FindLastIndex( // e => // { // return e.eventType == eventTypeRecord.PathFinding && e.objAttriList.Count > 0 // && e.objAttriList[0].ObjName.Equals(name + "(Node)") && Vector3.Distance(e.Navto, nowpath[index]) < 0.05f // && Mathf.Abs(RecordManager.Instance.RecordTimer - e.timer) <= (threshold * 2 / agent.speed); // }); var dis = Vector3.Distance(nowpath[index], lastPos); if (dis <0.01f)//同一个点,该点已经记录过了 { if (index == 0) { //只更新时间,不记录寻路事件了 timer = RecordManager.Instance.RecordTimer; } } else//未找到满足条件的点,证明该点未记录过 { MessageDispatcher.SendMessage(name, "RecordPathFindingEvent", new PathFindingAttri { Navto = nowpath[index], timer = timer }); lastPos = nowpath[index]; Debug.LogWarning("RecordPathFindingEvent:" + name); timer = RecordManager.Instance.RecordTimer; //if (index < nowpath.Length - 1) //{ // theNearestXFY = false; // GetComponent().SetNearestXfy(nowpath, index); //} if (index == nowpath.Length - 1) { nowpath = null; //theNearestXFY = false; } } } } } }