void Update() { myPos = myTrans.position; myV2Pos = myPos.xz(); myRot = myTrans.rotation; myFwd = myRot * Vector3.forward; if (rotatingLookDir > 0) { if (rotatingLookDir == 1) { localLookDir = Vector3.RotateTowards(localLookDir, targetLookDir, lookAngularSpeedRad * Time.deltaTime, 0); if (localLookDir == targetLookDir) { rotatingLookDir = 0; } worldLookDir = myRot * localLookDir; } else if (rotatingLookDir == 2) { worldLookDir = Vector3.RotateTowards(worldLookDir, targetLookDir, lookAngularSpeedRad * Time.deltaTime, 0); worldLookDir = Vector3.RotateTowards(myFwd, worldLookDir, MyExtensions.deg90inRad, 0); if (worldLookDir == targetLookDir) { rotatingLookDir = 0; } localLookDir = myTrans.InverseTransformDirection(worldLookDir); } } else { worldLookDir = myRot * localLookDir; if (searching > 4) { if (!(ctrl.HasBuff(BuffIndex.blind) || ctrl.HasBuff(BuffIndex.stun))) { if (searching == 5) { if (timer > 0) { timer -= Time.deltaTime; } else { searching++; } } else if (searching == 6) { //TauntPos (myPos - 2 * myFwd); LookTowards(Vector3.forward); searching = 8; } else if (searching == 7) { if (timer > 0) { timer -= Time.deltaTime; } else { searching++; } } else if (searching == 8) { LookTowards(nextLookTarget); searching = 9; } else if (searching == 9) { if (timer > 0) { timer -= Time.deltaTime; } else { searching++; } } else if (searching == 10) { LookTowards(Vector3.forward); searching = 0; } } } } worldV2LookDir = worldLookDir.xz(); Debug.DrawLine(myPos, myPos + 5 * worldLookDir, Color.red); if (target == null) { if (searching > 0) { if (searching < 5 && !ctrl.hasPath) { LookAround(); } } else { if (patrolType > 0) { if (!ctrl.hasPath || Vector3.Distance(patrolPoints [currentPatrolPoint], myPos) < 0.1f) { if (currentPatrolPoint < maxPatrolPointsIndex) { currentPatrolPoint++; } else { if (patrolType == 1) { patrolType = -1; } else if (patrolType == 2) { currentPatrolPoint = 0; } else if (patrolType == 3) { currentPatrolPoint--; patrolType = 4; } } } ctrl.MoveTo(patrolPoints [currentPatrolPoint]); } else if (patrolType == 4) { if (!ctrl.hasPath || Vector3.Distance(patrolPoints [currentPatrolPoint], myPos) < 0.1f) { if (currentPatrolPoint > 0) { currentPatrolPoint--; } else { currentPatrolPoint++; patrolType = 3; } } ctrl.MoveTo(patrolPoints [currentPatrolPoint]); } else if (patrolType == -1) { if (!ctrl.hasPath && Vector3.Distance(patrolPoints [currentPatrolPoint], myPos) > 0.1f) { ctrl.MoveTo(patrolPoints [maxPatrolPointsIndex]); } } } foreach (MyController c in CharManager.registeredChars) { if ((searching < 3 || searching > 4) && Vector3.Distance(c.transform.position, myPos) <= presenceDetectionRange) { TauntPos(c.myTrans.position, false, 3); } float suspiciousness = 0; if (!ctrl.HasBuff(BuffIndex.blind)) { suspiciousness += SightCheck(c, Time.deltaTime); } if (!ctrl.HasBuff(BuffIndex.loudNoises)) { suspiciousness += 0.5f * HearCheck(c, Time.deltaTime); } if (suspiciousness > 0) { if (targets.ContainsKey(c)) { targets [c] += suspiciousness; } else { targets.Add(c, suspiciousness); } } else if (targets.ContainsKey(c)) { if (onAlert) { targets [c] -= Time.deltaTime * 0.5f; } else { targets [c] -= Time.deltaTime; } } } foreach (TauntingRock c in TauntingRock.rocks) { float suspiciousness = 0; if (!ctrl.HasBuff(BuffIndex.blind)) { suspiciousness += RockSight(c, Time.deltaTime); } Debug.Log("suspiciousness " + suspiciousness); if ((searching < 3 || searching > 4) && Vector3.Distance(c.transform.position, myPos) <= presenceDetectionRange) { if (suspiciousness > 0) { TauntPos(c.nodes [0], true, 3); } else { TauntPos(c.myTrans.position, false, 3); } } if (suspiciousness > 0) { if (rocks.ContainsKey(c)) { rocks [c] += suspiciousness; } else { rocks.Add(c, suspiciousness); } } else if (rocks.ContainsKey(c)) { if (onAlert) { rocks [c] -= Time.deltaTime * 0.5f; } else { rocks [c] -= Time.deltaTime; } } } if (!ctrl.HasBuff(BuffIndex.stun)) { if (targets.Count > 0) { IEnumerable <KeyValuePair <MyController, float> > targetsKnown = targets.Where(c => (c.Key.gameObject.activeInHierarchy && c.Value >= 1)); int count = targetsKnown.Count(); if (count > 0) { KeyValuePair <MyController, float> sighted; if (count > 1) { sighted = targetsKnown.OrderByDescending(c => c.Value).First(); } else { sighted = targetsKnown.First(); } SetTarget(sighted.Key); } else if (searching < 2 || searching > 4) { IEnumerable <KeyValuePair <MyController, float> > targetsCheck = targets.Where(c => (c.Key.gameObject.activeInHierarchy && c.Value >= 0.5f)); count = targetsCheck.Count(); if (count > 0) { KeyValuePair <MyController, float> sighted; if (count > 1) { sighted = targetsCheck.OrderByDescending(c => c.Value).First(); } else { sighted = targetsCheck.First(); } TauntPos(sighted.Key.myTrans.position, false, 2); } } } if ((searching < 2 || searching > 4) && rocks.Count > 0) { IEnumerable <KeyValuePair <TauntingRock, float> > rocksCheck = rocks.Where(c => (c.Key.gameObject.activeInHierarchy && c.Value >= 0.5f)); int count = rocksCheck.Count(); if (count > 0) { KeyValuePair <TauntingRock, float> sighted; if (count > 1) { sighted = rocksCheck.OrderByDescending(c => c.Value).First(); } else { sighted = rocksCheck.First(); } TauntPos(sighted.Key.nodes [0], true, 2); } } } } else { float vis = 0; float dist = Vector3.Distance(target.myTrans.position, myPos); if (!ctrl.HasBuff(BuffIndex.stun)) { if (dist <= alertPresenceDetectionRange) { vis = 1; } if (vis < 0.2f) { vis = SightCheck(target, Time.deltaTime) + 0.5f * HearCheck(target, Time.deltaTime); } } if (vis < 0.2f) { if (ctrl.target != null) { ctrl.target = null; } if (!(ctrl.HasBuff(BuffIndex.blind) || ctrl.HasBuff(BuffIndex.stun))) { if (vis > 0 && dist <= sightRange) { ctrl.MoveTo(target.myTrans.position); lastTargetSpeed = ctrl.lastSpeed; } else { ctrl.MoveTo(ctrl.targetPos + lastTargetSpeed * Time.deltaTime); } if (searching < 5 && vis == 0) { if (ctrl.nma.path.corners.Length < 3) { LookAround(); } } else { LookTowards(myTrans.InverseTransformDirection(ctrl.targetPos - myPos)); if (Vector3.Dot(targetLookDir, Vector3.forward) < 0) { if (targetLookDir.x > 0) { LookTowards(Vector3.right); } else { LookTowards(Vector3.left); } } } } targetTime -= Time.deltaTime * (1 + (0.2f - vis) * 5); if (targetTime <= 0) { target = null; if (ctrl.hasPath) { searching = 2; } } } else { searching = 4; LookTowards(ctrl.targetPos - myPos, false); lastTargetSpeed = target.lastSpeed; targetTime = Mathf.Clamp(targetTime + vis, 0, 5); if (ctrl.target == null) { ctrl.MoveTo(target.myTrans); } } } }