using UnityEngine; using System.Collections; using System.Collections.Generic; using GameKitController.Audio; using UnityEngine.UI; using UnityEngine.Events; public class waypointPlayerPathSystem : MonoBehaviour { [Header ("Main Settings")] [Space] public List wayPoints = new List (); public bool inOrder; public bool showOneByOne; [Space] [Header ("Other Settings")] [Space] public bool useTimer; public float timerSpeed; [Range (0, 60)] public float minutesToComplete; [Range (0, 60)] public float secondsToComplete; public float extraTimePerPoint; public int pointsReached; public AudioClip pathCompleteAudioSound; public AudioElement pathCompleteAudioElement; public AudioClip pathUncompleteAudioSound; public AudioElement pathUncompleteAudioElement; public AudioClip secondTimerSound; public AudioElement secondTimerAudioElement; public float secondSoundTimerLowerThan; public AudioClip pointReachedSound; public AudioElement pointReachedAudioElement; public bool useLineRenderer; public Color lineRendererColor = Color.yellow; public float lineRendererWidth; public string mainManagerName = "Screen Objectives Manager"; [Space] [Header ("Debug")] [Space] public bool pathActive; [Space] [Header ("Event Settings")] [Space] public UnityEvent eventOnPathComplete = new UnityEvent (); public UnityEvent eventOnPathIncomplete = new UnityEvent (); [Space] [Header ("Gizmo Settings")] [Space] public bool showGizmo; public Color gizmoLabelColor; public bool useRegularGizmoRadius; public float gizmoRadius; public float triggerRadius; public bool showOffScreenIcon; public bool showMapWindowIcon; public bool showDistance; public bool showInfoLabel = true; public bool useHandleForVertex; public float handleRadius; public Color handleGizmoColor; public bool showDoPositionHandles; List points = new List (); int i; int pointsNumber; float totalSecondsTimer; Text screenTimerText; AudioSource audioSource; LineRenderer lineRenderer; screenObjectivesSystem screenObjectivesManager; showGameInfoHud gameInfoHudManager; GameObject currentUser; playerComponentsManager mainPlayerComponentsManager; private void InitializeAudioElements () { if (pathCompleteAudioSound != null) { pathCompleteAudioElement.clip = pathCompleteAudioSound; } if (pathUncompleteAudioSound != null) { pathUncompleteAudioElement.clip = pathUncompleteAudioSound; } if (secondTimerSound != null) { secondTimerAudioElement.clip = secondTimerSound; } if (pointReachedSound != null) { pointReachedAudioElement.clip = pointReachedSound; } } void Start () { InitializeAudioElements (); if (inOrder && !showOneByOne && useLineRenderer) { lineRenderer = gameObject.AddComponent (); lineRenderer.material = new Material (Shader.Find ("Sprites/Default")) { color = lineRendererColor }; lineRenderer.startWidth = lineRendererWidth; lineRenderer.endWidth = lineRendererWidth; lineRenderer.startColor = lineRendererColor; lineRenderer.endColor = lineRendererColor; lineRenderer.positionCount = 0; } bool screenObjectivesManagerLocated = screenObjectivesManager != null; if (!screenObjectivesManagerLocated) { screenObjectivesManager = screenObjectivesSystem.Instance; screenObjectivesManagerLocated = screenObjectivesManager != null; } if (!screenObjectivesManagerLocated) { GKC_Utils.instantiateMainManagerOnSceneWithTypeOnApplicationPlaying (screenObjectivesSystem.getMainManagerName (), typeof(screenObjectivesSystem), true); screenObjectivesManager = screenObjectivesSystem.Instance; } } void Update () { if (pathActive) { if (useTimer) { totalSecondsTimer -= Time.deltaTime * timerSpeed; screenTimerText.text = convertSeconds (); if (secondTimerAudioElement != null) { if (totalSecondsTimer - 1 <= secondSoundTimerLowerThan && totalSecondsTimer % 1 < 0.1f) { playAudioSourceShoot (secondTimerAudioElement); } } if (totalSecondsTimer <= 0) { stopPath (); } } if (inOrder && !showOneByOne && useLineRenderer) { lineRenderer.startColor = lineRendererColor; lineRenderer.endColor = lineRendererColor; lineRenderer.positionCount = wayPoints.Count - pointsReached; for (i = 0; i < wayPoints.Count; i++) { if (!wayPoints [i].reached) { lineRenderer.SetPosition (i - pointsReached, wayPoints [i].point.position); } } } } } public string convertSeconds () { int minutes = Mathf.FloorToInt (totalSecondsTimer / 60F); int seconds = Mathf.FloorToInt (totalSecondsTimer - minutes * 60); return string.Format ("{0:00}:{1:00}", minutes, seconds); } //add a new waypoint public void addNewWayPoint () { Vector3 newPosition = transform.position; if (wayPoints.Count > 0) { newPosition = wayPoints [wayPoints.Count - 1].point.position + wayPoints [wayPoints.Count - 1].point.forward * (wayPoints [wayPoints.Count - 1].triggerRadius * 3); } GameObject newWayPoint = new GameObject (); newWayPoint.transform.SetParent (transform); newWayPoint.transform.position = newPosition; newWayPoint.name = (wayPoints.Count + 1).ToString (); wayPointInfo newWayPointInfo = new wayPointInfo (); newWayPointInfo.Name = newWayPoint.name; newWayPointInfo.point = newWayPoint.transform; newWayPointInfo.triggerRadius = triggerRadius; mapObjectInformation newMapObjectInformation = newWayPoint.AddComponent (); newMapObjectInformation.setPathElementInfo (showOffScreenIcon, showMapWindowIcon, showDistance); newMapObjectInformation.enabled = false; wayPoints.Add (newWayPointInfo); updateComponent (); } public void renamePoints () { for (i = 0; i < wayPoints.Count; i++) { wayPoints [i].Name = (i + 1).ToString (); wayPoints [i].point.name = wayPoints [i].Name; } updateComponent (); } public void pointReached (Transform point) { bool pointReachedCorrectly = false; if (showOneByOne) { if (wayPoints [pointsReached].point == point) { wayPoints [pointsReached].reached = true; pointReachedCorrectly = true; pointsReached++; if (pointsReached < pointsNumber) { mapObjectInformation newMapObjectInformation = wayPoints [pointsReached].point.GetComponent (); if (newMapObjectInformation != null) { newMapObjectInformation.createMapIconInfo (); } } } else { stopPath (); } } else { if (inOrder) { if (wayPoints [pointsReached].point == point) { wayPoints [pointsReached].reached = true; pointReachedCorrectly = true; pointsReached++; } else { stopPath (); } } else { for (i = 0; i < wayPoints.Count; i++) { if (wayPoints [i].point == point) { wayPoints [i].reached = true; pointReachedCorrectly = true; pointsReached++; } } } } if (pointReachedCorrectly) { if (pointsReached < pointsNumber && useTimer) { totalSecondsTimer += extraTimePerPoint; } if (pointReachedAudioElement != null) { playAudioSourceShoot (pointReachedAudioElement); } if (pointsReached == pointsNumber) { eventOnPathComplete.Invoke (); pathActive = false; if (useTimer) { screenTimerText.gameObject.SetActive (false); } if (pathCompleteAudioElement != null) { playAudioSourceShoot (pathCompleteAudioElement); } } } } public void setCurrentUser (GameObject user) { currentUser = user; } public void resetPath () { mainPlayerComponentsManager = currentUser.GetComponent (); audioSource = mainPlayerComponentsManager.getPlayerStatesManager ().getAudioSourceElement ("Timer Audio Source"); gameInfoHudManager = mainPlayerComponentsManager.getGameInfoHudManager (); pointsReached = 0; pointsNumber = wayPoints.Count; if (useTimer) { totalSecondsTimer = secondsToComplete + minutesToComplete * 60; if (screenTimerText == null) { screenTimerText = gameInfoHudManager.getHudElement ("Timer", "Timer Text").GetComponent (); } if (screenTimerText != null) { screenTimerText.gameObject.SetActive (true); } } points.Clear (); for (i = 0; i < wayPoints.Count; i++) { wayPoints [i].reached = false; points.Add (wayPoints [i].point.gameObject); } if (screenObjectivesManager != null) { screenObjectivesManager.removeGameObjectListFromList (points); } if (showOneByOne) { mapObjectInformation newMapObjectInformation = wayPoints [pointsReached].point.GetComponent (); if (newMapObjectInformation != null) { newMapObjectInformation.createMapIconInfo (); } } else { for (i = 0; i < wayPoints.Count; i++) { mapObjectInformation newMapObjectInformation = wayPoints [i].point.GetComponent (); if (newMapObjectInformation != null) { newMapObjectInformation.createMapIconInfo (); } } } pathActive = true; if (inOrder && !showOneByOne && useLineRenderer) { lineRenderer.enabled = true; } } public void stopPath () { pathActive = false; if (useTimer) { screenTimerText.gameObject.SetActive (false); } if (screenObjectivesManager != null) { screenObjectivesManager.removeGameObjectListFromList (points); } if (pathUncompleteAudioElement != null) { playAudioSourceShoot (pathUncompleteAudioElement); } if (inOrder && !showOneByOne && useLineRenderer) { lineRenderer.enabled = false; } eventOnPathIncomplete.Invoke (); } public void playAudioSourceShoot (AudioElement clip) { if (audioSource != null) { clip.audioSource = audioSource; } if (clip != null) { AudioPlayer.PlayOneShot (clip, gameObject); } } public void updateComponent () { GKC_Utils.updateComponent (this); GKC_Utils.updateDirtyScene ("Update Waypoint player path system info", gameObject); } void OnDrawGizmos () { if (!showGizmo) { return; } if (GKC_Utils.isCurrentSelectionActiveGameObject (gameObject)) { DrawGizmos (); } } void OnDrawGizmosSelected () { DrawGizmos (); } void DrawGizmos () { if (!Application.isPlaying) { if (showGizmo) { for (i = 0; i < wayPoints.Count; i++) { if (wayPoints [i].point != null) { Gizmos.color = Color.yellow; Gizmos.DrawSphere (wayPoints [i].point.position, gizmoRadius); if (inOrder) { if (i + 1 < wayPoints.Count) { Gizmos.color = Color.white; Gizmos.DrawLine (wayPoints [i].point.position, wayPoints [i + 1].point.position); } } else { Gizmos.color = Color.white; Gizmos.DrawLine (wayPoints [i].point.position, transform.position); } } } } else { for (i = 0; i < wayPoints.Count; i++) { if (wayPoints [i].point != null) { wayPoints [i].point.GetComponent ().showGizmo = showGizmo; } } } } } [System.Serializable] public class wayPointInfo { public string Name; public Transform point; public bool reached; public float triggerRadius; } }