/// <summary> /// Método Start, que se llama antes del primer frame /// </summary> void Start() { activatedEvents[0] = true; /// Instanciar ladrón // Obtener datos aleatorios Quaternion randomRotation = Quaternion.Euler(0, Random.Range(0, 360), 0); // Lo instanciamos GameObject thiefGameObject = Instantiate(scriptedVillagerPrefab, new Vector3(-11.5f, 4.65f, -4.2f), randomRotation, villagersParent.transform);; // Obtener componente ScriptedVillager scriptedThief = thiefGameObject.GetComponent <ScriptedVillager>(); // Establecemos sus objetos scriptedThief.items.villagerColor = ItemDatabase.instance.characterColors[0]; scriptedThief.items.eyes = ItemDatabase.instance.eyes[1]; scriptedThief.items.hatItem = ItemDatabase.instance.hatItems[0]; scriptedThief.items.hornItem = ItemDatabase.instance.noItems[1]; scriptedThief.items.neckItem = ItemDatabase.instance.neckItems[0]; // Instanciamos sus objetos scriptedThief.PutItems(); // Cambiamos su tag scriptedThief.tag = "ScriptedThief"; // Establecemos su id de tutorial scriptedThief.tutorialID = 5; // Lo desactivamos scriptedThief.gameObject.SetActive(false); }
/// <summary> /// Método Event18, que ejecuta la funcionalidad requerida por el evento 18 /// </summary> public void Event18() { // Ocultamos el texto del tutorial marshugusGameObject.SetActive(false); tutorialText.gameObject.SetActive(false); // Dejamos al jugador que se mueva playerCanMove = true; // Establecemos un "robo" que hace de flecha para la plaza GameObject robberyGameObject = Instantiate(robberyPrefab, robberiesParent.transform); Robbery newRobbery = robberyGameObject.GetComponent <Robbery>(); newRobbery.robberyPosition = new Vector3(-13.25f, 4.75f, -8f); newRobbery.robberyRectTransform.anchoredPosition = new Vector2(100000, 100000); newRobbery.robberyIconImage.sprite = arrowSprite; robberyGameObject.transform.localScale = new Vector3(1.5f, 1.5f, 1); TutorialGameManager.instance.robberies.Add(newRobbery); /// Instanciamos aldeano aleatorio y movemos ladrón /// Aldeano aleatorio // Obtener datos aleatorios Quaternion randomRotation = Quaternion.Euler(0, Random.Range(0, 360), 0); // La instanciamos GameObject villagerGameObject = Instantiate(scriptedVillagerPrefab, new Vector3(-14.95f, 4.65f, -12f), randomRotation, villagersParent.transform);; // Obtener componente ScriptedVillager ScriptedVillager fifthScriptedVillager = villagerGameObject.GetComponent <ScriptedVillager>(); // Establecemos sus objetos fifthScriptedVillager.items.villagerColor = ItemDatabase.instance.characterColors[0]; fifthScriptedVillager.items.eyes = ItemDatabase.instance.eyes[1]; fifthScriptedVillager.items.hatItem = ItemDatabase.instance.hatItems[0]; fifthScriptedVillager.items.hornItem = ItemDatabase.instance.hornItems[0]; fifthScriptedVillager.items.neckItem = ItemDatabase.instance.neckItems[0]; // Instanciamos sus objetos fifthScriptedVillager.PutItems(); // Añadimos al aldeano a la lista TutorialGameManager.instance.villagers.Add(fifthScriptedVillager); // Establecemos su id de tutorial fifthScriptedVillager.tutorialID = 4; /// Ladrón // Lo desactivamos scriptedThief.gameObject.SetActive(true); }
/// <summary> /// Método Detention, que ejecuta una detención /// </summary> public void Detention() { // Si acertó if (calledScriptedVillagerIsThief) { // Tutorial if (tutorialManager.actualEvent == 26 && !tutorialManager.activatedEvents[26]) { tutorialManager.activatedEvents[26] = true; tutorialManager.GoToNextStep(); } // Efecto GameObject nervousVFX = Instantiate(TutorialGameManager.instance.nervousVFX, calledScriptedVillager.transform); // Efecto de sonido AudioManager.instance.PlaySound("Nervous"); TutorialGameManager.instance.HideDetentionButton(); TutorialGameManager.instance.EndGameAsWin(); } // Si falló else { // Tutorial if (tutorialManager.actualEvent == 22 && !tutorialManager.activatedEvents[22]) { tutorialManager.activatedEvents[22] = true; tutorialManager.GoToNextStep(); } // Efecto GameObject angerVFX = Instantiate(TutorialGameManager.instance.angerVFX, calledScriptedVillager.transform); AudioManager.instance.PlaySound("Anger"); // Se destruye cuando acaba el efecto ParticleSystem partS = angerVFX.GetComponent <ParticleSystem>(); float totalDuration = partS.main.duration + partS.main.startLifetime.constant; Destroy(angerVFX, totalDuration); calledScriptedVillager.hasBeenCalledByMarshall = false; calledScriptedVillager = null; TutorialGameManager.instance.HideDetentionButton(); TutorialGameManager.instance.AddAttempt(); } }
/// <summary> /// Método Event13, que ejecuta la funcionalidad requerida por el evento 13 /// </summary> public void Event13() { /// Creamos una víctima en el parque // Obtener datos aleatorios Quaternion randomRotation = Quaternion.Euler(0, Random.Range(0, 360), 0); // La instanciamos GameObject villagerGameObject = Instantiate(scriptedVillagerPrefab, new Vector3(45.5f, 2.8f, -10f), randomRotation, villagersParent.transform);; // Obtener componente ScriptedVillager ScriptedVillager parkScriptedVillager = villagerGameObject.GetComponent <ScriptedVillager>(); // Aleatorizamos el aldeano do { parkScriptedVillager.RandomizeNPC(); } while (parkScriptedVillager.items.ToString().Equals(scriptedThief.items.ToString())); // Instanciamos sus objetos parkScriptedVillager.PutItems(); // Añadimos al aldeano a la lista TutorialGameManager.instance.villagers.Add(parkScriptedVillager); // Establecemos los dos objetos que ha visto parkScriptedVillager.informationGameObject.item1 = ItemDatabase.instance.hornItems[0]; parkScriptedVillager.informationGameObject.item2 = ItemDatabase.instance.neckItems[0]; parkScriptedVillager.informationGameObject.doubtfulInformation = true; // Establecemos que sea víctima parkScriptedVillager.GetRobbed(); // Establecemos su id de tutorial parkScriptedVillager.tutorialID = 2; /// Creamos un robo donde la víctima TutorialUIManager.instance.ShowRobberyIcon(villagerGameObject.transform.position); TutorialGameManager.instance.AddRobbery(); //Efecto de sonido AudioManager.instance.PlaySound("TheftFound"); // Mostramos siguiente paso GoToNextStep(); }
/// <summary> /// Método Event8, que ejecuta la funcionalidad requerida por el evento 8 /// </summary> public void Event8() { /// Creamos una víctima en el ayuntamiento // Obtener datos aleatorios Quaternion randomRotation = Quaternion.Euler(0, Random.Range(0, 360), 0); // La instanciamos GameObject villagerGameObject = Instantiate(scriptedVillagerPrefab, new Vector3(-48.5f, 11.5f, 27.5f), randomRotation, villagersParent.transform);; // Obtener componente ScriptedVillager ScriptedVillager townHallScriptedVillager = villagerGameObject.GetComponent <ScriptedVillager>(); // Aleatorizamos el aldeano do { townHallScriptedVillager.RandomizeNPC(); } while (townHallScriptedVillager.items.ToString().Equals(scriptedThief.items.ToString())); // Instanciamos sus objetos townHallScriptedVillager.PutItems(); // Añadimos al aldeano a la lista TutorialGameManager.instance.villagers.Add(townHallScriptedVillager); // Establecemos los dos objetos que ha visto townHallScriptedVillager.informationGameObject.item1 = ItemDatabase.instance.characterColors[0]; townHallScriptedVillager.informationGameObject.item2 = ItemDatabase.instance.eyes[1]; // Establecemos que sea víctima townHallScriptedVillager.GetRobbed(); // Establecemos su id de tutorial townHallScriptedVillager.tutorialID = 0; /// Creamos un robo donde la víctima TutorialUIManager.instance.ShowRobberyIcon(villagerGameObject.transform.position); TutorialGameManager.instance.AddRobbery(); //Efecto de sonido AudioManager.instance.PlaySound("TheftFound"); // Mostramos siguiente paso GoToNextStep(); }
/// <summary> /// Método Event16, que ejecuta la funcionalidad requerida por el evento 16 /// </summary> public void Event16() { /// Creamos testigo para acercarse al usuario // Obtener datos aleatorios Quaternion randomRotation = Quaternion.Euler(0, Random.Range(0, 360), 0); // La instanciamos GameObject villagerGameObject = Instantiate(scriptedVillagerPrefab, new Vector3(51, 2.4f, -30f), randomRotation, villagersParent.transform);; // Obtener componente ScriptedVillager ScriptedVillager fourthScriptedVillager = villagerGameObject.GetComponent <ScriptedVillager>(); // Aleatorizamos el aldeano para que no coincida con el tercero ScriptedVillager thirdVillager = TutorialGameManager.instance.villagers[2]; do { fourthScriptedVillager.RandomizeNPC(); } while (fourthScriptedVillager.items.ToString().Equals(thirdVillager.items.ToString()) || fourthScriptedVillager.items.ToString().Equals(scriptedThief.items.ToString())); // Instanciamos sus objetos fourthScriptedVillager.PutItems(); // Añadimos al aldeano a la lista TutorialGameManager.instance.villagers.Add(fourthScriptedVillager); // Establecemos el objeto que ha visto fourthScriptedVillager.informationGameObject.item1 = ItemDatabase.instance.neckItems[0]; fourthScriptedVillager.informationGameObject.item2 = null; // Establecemos que sea víctima fourthScriptedVillager.SeeRobbery(); // Establecemos su id de tutorial fourthScriptedVillager.tutorialID = 3; // Establecemos que el jugador tiene que esperar playerHasToWait = true; }
/// <summary> /// Método Update, que se llama cada frame /// </summary> void Update() { // Si el jugador tiene que esperar, no realizamos cálculos if (tutorialManager.playerHasToWait) { return; } #region OneClick // Si el jugador hace click con el ratón if (Input.GetMouseButtonDown(0)) { // Establecemos que ha pulsado el ratón hasMouseOnClick = true; // Si puede moverse if (tutorialManager.playerCanMove && !tutorialManager.event22MustArrestHornsVillager && !tutorialManager.event26MustArrestThief) { // Si el juego está en pausa, no realizamos cálculos if (TutorialGameManager.instance.gamePaused) { return; } // Si la partida ha acabado, no realizamos cálculos if (TutorialGameManager.instance.gameOver) { return; } // Si está el ratón sobre la UI, no se lanza Raycast if (IsPointerOverUIObject()) { return; } // En caso contrario, se lanza el Raycast RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, 100.0f, ~playerLayerMask)) { // Va hacia allí destination = hit.point; thisAgent.SetDestination(destination); if (!thisAnimator.GetCurrentAnimatorStateInfo(0).IsName("Marshallow_Run")) { thisAnimator.SetTrigger("run"); } // Si es un aldeano if (hit.transform.CompareTag("ScriptedVillager")) { // Eventos tutorial if (!tutorialManager.event25MustClickThief && !tutorialManager.event26MustArrestThief) { if (tutorialManager.actualEvent == 20 && !tutorialManager.activatedEvents[20]) { // Si ya tenia uno, lo quitamos if (calledScriptedVillager != null) { calledScriptedVillager.hasBeenCalledByMarshall = false; calledScriptedVillager = null; } calledScriptedVillagerIsThief = false; calledScriptedVillager = hit.transform.gameObject.GetComponent <ScriptedVillager>(); calledScriptedVillager.hasBeenCalledByMarshall = true; // Si es el aldeano 4 y estamos en el evento adecuado if (calledScriptedVillager.tutorialID == 4) { // Activamos el evento y llamamos al siguiente tutorialManager.activatedEvents[20] = true; tutorialManager.GoToNextStep(); TutorialGameManager.instance.ShowDetentionButton(calledScriptedVillager.transform); // Efecto de sorpresa GameObject surpriseVFX = Instantiate(TutorialGameManager.instance.surpriseVFX, calledScriptedVillager.transform); ParticleSystem partS = surpriseVFX.GetComponent <ParticleSystem>(); float totalDuration = partS.main.duration + partS.main.startLifetime.constant; Destroy(surpriseVFX, totalDuration); } // Si no es el aldeano 4 y estamos en el evento adecuado else { if (calledScriptedVillager != null) { calledScriptedVillager.hasBeenCalledByMarshall = false; calledScriptedVillager = null; } } } } } // Si es el ladrón else if (hit.transform.CompareTag("ScriptedThief")) { // Eventos tutorial if (!tutorialManager.event20MustClickHornsVillager && !tutorialManager.event22MustArrestHornsVillager) { // Si ya tenia uno, lo quitamos if (calledScriptedVillager != null) { calledScriptedVillager.hasBeenCalledByMarshall = false; calledScriptedVillager = null; } calledScriptedVillagerIsThief = true; calledScriptedVillager = hit.transform.gameObject.GetComponent <ScriptedVillager>(); calledScriptedVillager.hasBeenCalledByMarshall = true; // Si es el aldeano 4 y estamos en el evento adecuado if (tutorialManager.actualEvent == 25 && !tutorialManager.activatedEvents[25]) { // Activamos el evento y llamamos al siguiente tutorialManager.activatedEvents[25] = true; tutorialManager.GoToNextStep(); TutorialGameManager.instance.ShowDetentionButton(calledScriptedVillager.transform); // Efecto de sorpresa GameObject surpriseVFX = Instantiate(TutorialGameManager.instance.surpriseVFX, calledScriptedVillager.transform); ParticleSystem partS = surpriseVFX.GetComponent <ParticleSystem>(); float totalDuration = partS.main.duration + partS.main.startLifetime.constant; Destroy(surpriseVFX, totalDuration); } } } // Si es territorio transitable, mueve al agente a esa posición else if (hit.transform.CompareTag("Walkable") || hit.transform.CompareTag("Zone")) { /// Tutorial /// Evento 1 // Si no ha completado el evento 1, se añade un paso if (!tutorialManager.activatedEvents[1]) { tutorialManager.event1Moves++; // Si ha dado tres pasos, se completa el evento 1 if (tutorialManager.event1Moves >= 3) { tutorialManager.activatedEvents[1] = true; tutorialManager.GoToNextStep(); } } // Si había llamado a un NPC, lo deja ir if (calledScriptedVillager != null && !tutorialManager.event20MustClickHornsVillager && !tutorialManager.event22MustArrestHornsVillager && !tutorialManager.event25MustClickThief && !tutorialManager.event26MustArrestThief) { calledScriptedVillager.hasBeenCalledByMarshall = false; calledScriptedVillager = null; GameManager.instance.HideDetentionButton(); } // Se instancia el efecto if (effectInstance == null) { effectInstance = Instantiate(effectPrefab, hit.point + new Vector3(0, 0.1f, 0), new Quaternion()); } else { effectInstance.Clear(); effectInstance.gameObject.transform.position = hit.point + new Vector3(0, 0.1f, 0); effectInstance.Play(); } } } } // Si no puede moverse y no tiene que arrestar else if (!tutorialManager.event22MustArrestHornsVillager && !tutorialManager.event26MustArrestThief) { // Si el juego está en pausa, no realizamos cálculos if (TutorialGameManager.instance.gamePaused && tutorialManager.actualEvent < 27) { return; } // Si no puede usar la UI y no puede volver al menú if (!tutorialManager.playerCanUseUI && !tutorialManager.event28CanReturnToMenu) { // Comprobamos sobre qué objetos está la UI List <RaycastResult> results = PointerOverUIElements(); // Si hay resultados if (results.Count > 0) { // Si está el ratón sobre ciertos elementos de la UI, no se va al siguiente paso foreach (RaycastResult rr in results) { if (rr.gameObject.name.Equals("Button_Pause") || rr.gameObject.name.Equals("Button_Antihorary") || rr.gameObject.name.Equals("Button_Antihorary") || rr.gameObject.name.Equals("Button_Resume")) { return; } } // Si no, hace el siguiente paso tutorialManager.GoToNextStep(); } // Si no, hace el siguiente paso else { // Si el juego está en pausa, no realizamos cálculos if (TutorialGameManager.instance.gamePaused && tutorialManager.actualEvent < 27) { return; } tutorialManager.GoToNextStep(); } } } } #endregion // Si levanta el ratón, no está haciendo click if (Input.GetMouseButtonUp(0)) { hasMouseOnClick = false; } #region Click Contínuo // Si el jugador hace click con el ratón if (Input.GetMouseButton(0)) { // Si puede moverse if (tutorialManager.playerCanMove && !tutorialManager.event22MustArrestHornsVillager && !tutorialManager.event26MustArrestThief) { // Si el juego está en pausa, no realizamos cálculos if (TutorialGameManager.instance.gamePaused) { return; } // Si la partida ha acabado, no realizamos cálculos if (TutorialGameManager.instance.gameOver) { return; } // Si está el ratón sobre la UI, no se lanza Raycast if (!hasMouseOnClick && IsPointerOverUIObject()) { return; } // En caso contrario, se lanza el Raycast RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, 100.0f, ~playerLayerMask)) { // Comprueba con qué ha chocado el raycast //Debug.Log("You selected the: " + hit.transform.name); // Va hacia allí destination = hit.point; thisAgent.SetDestination(destination); if (!thisAnimator.GetCurrentAnimatorStateInfo(0).IsName("Marshallow_Run")) { thisAnimator.SetTrigger("run"); } } } } #endregion // Si llega al destino, cambia de animación if (Vector3.Distance(destination, transform.position) <= 1.0f) { if (!thisAnimator.GetCurrentAnimatorStateInfo(0).IsName("Marshallow_Idle")) { thisAnimator.SetTrigger("idle"); } } // Si está lo suficientemente cerca del NPC que ha llamado, se para if (calledScriptedVillager != null) { if (Vector3.Distance(this.transform.position, calledScriptedVillager.transform.position) < DETENTION_RANGE) { if (thisAgent.hasPath) { thisAgent.ResetPath(); thisAnimator.SetTrigger("idle"); } } } // Si está lo suficientemente cerca de un robo, lo desactiva List <Robbery> closeRobberies = new List <Robbery>(); foreach (Robbery r in TutorialGameManager.instance.robberies) { if (Vector3.Distance(this.transform.position, r.robberyPosition) < QUIT_STEAL_ICON_RANGE) { closeRobberies.Add(r); } } foreach (Robbery r in closeRobberies) { TutorialUIManager.instance.HideRobberyIcon(r); } }