Contribution to the VOLUPTAS World At Play Summer School // Professur Charbonnet/Heiz (ETH Zurich D-ARCH) // 21-26 June 2021.
// Noise Video Game Script: switch to bird eye and zoom out on certain events. // Copyright (C) 2021 Julien Rippinger // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // _ _ ___ ___ ____ _____ // | \ | |/ _ \_ _/ ___|| ____| // | \| | | | | |\___ \| _| // | |\ | |_| | | ___) | |___ // |_| \_|\___/___|____/|_____| // using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class SwitchCamera : MonoBehaviour { // _ _ _ // __ ____ _ _ __(_) __ _| |__ | | ___ ___ // \ \ / / _` | '__| |/ _` | '_ \| |/ _ \/ __| // \ V / (_| | | | | (_| | |_) | | __/\__ \ // \_/ \__,_|_| |_|\__,_|_.__/|_|\___||___/ // public Camera CameraPerspective; public Camera CameraAxonometry; public GameObject Avatar; public Light Sun; public AudioSource AudioSourceAxono; public AudioSource AudioSourceSoundtrack; public AudioSource AudioSourceVoice; public Text m_MyText; public Text title_Text; private GameObject[] points; private GameObject[] portals; private Collider[] collision_objects; private Vector3 newPosition; private int index; private int newindex; private bool startZoom = true; private bool zoomOut; private bool game_finished; private bool already_run; private float timeLeft; // private int nbrPoints; // Game Parameters private float maxTime = 109.0f; // +10 = 120 private float timeIncrease = 10.0f; // Start is called before the first frame update // _ _ _ _ _ _ // (_)_ __ (_) |_(_) __ _| |_(_) ___ _ __ // | | '_ \| | __| |/ _` | __| |/ _ \| '_ \ // | | | | | | |_| | (_| | |_| | (_) | | | | // |_|_| |_|_|\__|_|\__,_|\__|_|\___/|_| |_| // void Start() { // AudioSourceAxono.Stop(); CameraPerspective.enabled = true; CameraAxonometry.enabled = false; CameraAxonometry.orthographicSize = 1f; // teleportation points list points = GameObject.FindGameObjectsWithTag("Point"); portals = GameObject.FindGameObjectsWithTag("Portal"); // nbrPoints = points.Length; // initial index for teleportation // index = Random.Range(0,nbrPoints); // m_MyText.text = ""; timeLeft = maxTime; //Zoom(); } // _ _ // _ _ _ __ __| | __ _| |_ ___ ___ // | | | | '_ \ / _` |/ _` | __/ _ \/ __| // | |_| | |_) | (_| | (_| | || __/\__ \ // \__,_ | .__/ \__,_|\__,_|\__\___||___/ // |_| // // Update is called once per frame void Update() { // countdown display float seconds = timeLeft%60; float minutes = Mathf.Floor(timeLeft / 60); if(!game_finished) { string time = minutes.ToString("00") + ":" + seconds.ToString("00.00"); m_MyText.text = time; } // countdown timeLeft -= Time.deltaTime; if((timeLeft < 0) && (!already_run) &&(!game_finished)) { startZoom = true; } Zoom(); } void FixedUpdate() { collision_objects = Physics.OverlapSphere(transform.position, 1.0f); if(collision_objects.Length > 0) { foreach(Collider obj in collision_objects) { // check if player reached an antenna/portal if((obj.tag == "Portal") && (!already_run)) { title_Text.text = "Citizen of Proteus\nYou have contributed to our shared vision"; game_finished = true; startZoom = true; Zoom(); } //Debug.Log("collision with:" + obj.tag); } //Debug.Log("collision : " + Physics.OverlapSphere(transform.position, 2.0f)); } } // _ // ___ _ _ ___| |_ ___ _ __ ___ // / __| | | / __| __/ _ \| '_ ` _ \ // |( _| |_| \__ \ || (_) | | | | | | // \___|\__,_|___/\__\___/|_| |_| |_| // void Zoom() { // initiate zoom out if(startZoom) { // start shepard sound AudioSourceAxono.Play(); AudioSourceSoundtrack.Pause(); AudioSourceVoice.Pause(); // set sun for axo convetion PositionSun(); // make the switch CameraPerspective.enabled = false; CameraAxonometry.enabled = true; zoomOut = true; already_run = true; // increment timer maxTime += timeIncrease; // force execute once } // perform zoom out if (zoomOut) { // zoom out CameraAxonometry.orthographicSize += 0.1f; m_MyText.text = ""; startZoom = false; } // terminate zoom if (CameraAxonometry.orthographicSize > 240) //175 { if(game_finished) { //quit game or switch to next scene Application.Quit(); } // earase title title_Text.text = ""; //stop zoom already_run = false; zoomOut = false; // stop shepard sound AudioSourceVoice.Play(); AudioSourceSoundtrack.Play(); AudioSourceAxono.Stop(); // switch back to 1st person CameraAxonometry.enabled = false; CameraPerspective.enabled = true; // switch cast shadows on Sun.shadows = LightShadows.Soft; // reset axono CameraAxonometry.orthographicSize = 1f; // teleport player Teleportation(); // reset timer timeLeft = maxTime; } } void PositionSun() { // no shadows // Sun.transform.forward = CameraAxonometry.transform.forward; // conventional shadows Sun.transform.forward = CameraAxonometry.transform.forward; Sun.transform.Rotate(0.0f, 135.0f , 0.0f, Space.World); Sun.shadows = LightShadows.None; } void Teleportation() { // random index selection // newPosition = new Vector3(points[index].transform.position.x, points[index].transform.position.y, points[index].transform.position.z); newPosition = GetClosestPoint(points); // move avatar into new position Avatar.transform.position = newPosition; int roatation = Random.Range(0, 360); Avatar.transform.Rotate(0.0f, roatation , 0.0f, Space.Self); //nex index different than previous one // newindex = Random.Range(0,nbrPoints); // between 0 and 31 // while(newindex == index) // { // newindex = Random.Range(0,nbrPoints); // } // index = newindex; // reset shadows //Sun.shadows = LightShadows.Soft; } // _ _ _ // _ _| |_(_) |___ // | | | | __| | / __| // | |_| | |_| | \__ \ // \__,_|\__|_|_|___/ // Vector3 GetClosestPoint(GameObject[] point_list) { Vector3 tMin = new Vector3(Mathf.Infinity, Mathf.Infinity, Mathf.Infinity); float minDist = Mathf.Infinity; Vector3 currentPos = transform.position; foreach (GameObject point in point_list) { float dist = Vector3.Distance(point.transform.position, currentPos); if (dist < minDist) { tMin = new Vector3(point.transform.position.x, point.transform.position.y, point.transform.position.z); minDist = dist; } } return tMin; } }