/////////////////////////////////////////////////////////////////////////// bool HandleWaypointChange() { Vector3 targetPoint = GetTargetPoint(); Vector2 selfToTarget2D = (targetPoint - transform.position).xz(); float distanceToTarget = selfToTarget2D.magnitude; if (distanceToTarget < ReachTargetThreshold) { int pathPointCount = WalkerPath.Get().PathLines.Length; m_CurrentTargetPointIndex++; if (m_CurrentTargetPointIndex >= pathPointCount) { GameManager.Get().m_RescuedWalkers++; GameManager.Get().AddTimeBonus(TimeBonusWhenRescued); AudioManager.Get().PlayRandomOneShot(WalkerManager.Get().gameObject, WalkerManager.Get().RescueSound, WalkerManager.Get().RescueSoundVolume); m_CurrentTargetPointIndex--; GameObject.Destroy(gameObject); return(false); } } return(true); }
/////////////////////////////////////////////////////////////////////////// Vector3 GetTargetPoint() { int pathPointCount = WalkerPath.Get().PathLines.Length; if (pathPointCount == 0 || m_CurrentTargetPointIndex >= pathPointCount) { Debug.Assert(false); return(Vector3.zero); } float fixedRnd = VectorExtensions.GetFixedRandom(ID); Vector3 pathPoint = WalkerPath.Get().PathLines[m_CurrentTargetPointIndex].GetLerped(fixedRnd); return(pathPoint); }
/////////////////////////////////////////////////////////////////////////// public void Reorient() { int bestIndex = 0; float bestDistance = float.MaxValue; bool bestLiesInFrontOfUs = false; Vector2 ownPos = transform.position.xz(); for (int i = 0; i < WalkerPath.Get().PathLines.Length; ++i) { Vector2 curPoint = WalkerPath.Get().PathLines[i].GetLerped(0.5f).xz(); float distance = Vector2.Distance(ownPos, curPoint); if (distance < bestDistance) { bestDistance = distance; bestIndex = i; if (i == WalkerPath.Get().PathLines.Length - 1) { bestLiesInFrontOfUs = true; } else { Vector2 nextPoint = WalkerPath.Get().PathLines[i + 1].GetLerped(0.5f).xz(); bestLiesInFrontOfUs = Vector2.Dot(nextPoint - curPoint, curPoint - ownPos) > 0; } } } if (!bestLiesInFrontOfUs && bestIndex < WalkerPath.Get().PathLines.Length - 1) { bestIndex++; } m_CurrentTargetPointIndex = bestIndex; }