private bool[] m_col; // bei dem Objekt, bei dem es kollidiert --> true. daraus wird "m_CollisionRocketGround" auf true gesetzt // Use this for initialization void Start() { // ClacCollosion Array erstellen m_CalcCollision = new bool[m_StaticObjects.GetLength(0)]; // m_col array erstellen m_col = new bool[m_StaticObjects.GetLength(0)]; // Cuboid Array erstellen m_StaticCubes = new Cuboid[m_StaticObjects.GetLength(0)]; // Material Rot für wenn Kollidiert m_Material = GetComponent <Renderer>().material; m_Movement = 5f; m_MovementRotation = 0; // Eckpunkte des Bodens for (int i = 0; i < m_StaticObjects.GetLength(0); i++) { m_StaticCubes[i] = new Cuboid(CubeEckPosition.GetCubeVectorPosition(m_StaticObjects[i])); } }
// Update is called once per frame void Update() { // Wenn Fallgeschwindigkeit zu Hoch war beim Auftritt auf den Boden if (m_Crash) { return; } // Abfrage ob Taste gedrückt wurde if (Input.GetKey(KeyCode.Space)) { // wenn Space gedrückt wurde // rise m_Fall += m_Thrust * m_Thrust; } else { // wenn Space nicht gedrückt wurde // fall // überprüfen ob Rakete auf dem Boden ist if (!m_CollisionRocketGround && !m_Crash) { m_Fall -= m_Gravity * m_Gravity; } else { m_Fall = 0; } } m_CollisionRocketGround = false; // Get position of Rocket m_VectorDLL = VectorUmwandeln(transform.position); // Rakete nach links und rechts bewegen if (Input.GetKey(KeyCode.A)) { // X - m_VectorDLL.X -= m_Movement; } if (Input.GetKey(KeyCode.D)) { // X + m_VectorDLL.X += m_Movement; } // Rakete rotieren if (Input.GetKey(KeyCode.Q)) { // Y - m_MovementRotation += m_Movement / 90; } if (Input.GetKey(KeyCode.E)) { // Y + m_MovementRotation += -(m_Movement / 90); } // cap rise speed if (m_Fall >= m_MaxRiseSpeed) { m_Fall = m_MaxRiseSpeed; } // Berechne die Fallgeschwindigkeit der Y-Achse hinzu m_VectorDLL.Y += m_Fall; // Eckpunkte der Rakete herausfinden + setzen m_CubeRocket = new Cuboid(CubeEckPosition.GetCubeVectorPosition(this.gameObject)); // set bool whether to calculate collision or not for (int i = 0; i < m_CalcCollision.GetLength(0); i++) { Vector tempRocket = VectorUmwandeln(this.transform.position); Vector tempStaticObjects = tempRocket - new Vector( m_StaticObjects[i].transform.position.x, m_StaticObjects[i].transform.position.y, m_StaticObjects[i].transform.position.z) ; if ((tempRocket.X >= tempStaticObjects.X - 250f && tempRocket.X <= tempStaticObjects.X + 250) || (tempRocket.Y >= tempStaticObjects.Y - 500f && tempRocket.Y <= tempStaticObjects.Y + 500)) { m_CalcCollision[i] = true; } else { m_CalcCollision[i] = false; } } // check collision of static objects for (int i = 0; i < m_StaticObjects.GetLength(0); i++) { if (m_CalcCollision[i] == false) { continue; } m_col[i] = Collisions.CuboidInCuboid(m_CubeRocket, m_StaticCubes[i]); // Collision setzen if (m_col[i]) { m_CollisionRocketGround = true; } } // wenn nichts kollidiert -> CollisionRocketGround = false bool tempVarForNothing = false; for (int i = 0; i < m_col.GetLength(0); i++) { if (m_col[i]) { tempVarForNothing = true; } } if (tempVarForNothing = false) { m_CollisionRocketGround = false; } // überprüft ob die Rakete halbwegs gerade aufgekommen ist (+-10 Grad) if (m_CollisionRocketGround) { float checkRot = this.gameObject.transform.rotation.eulerAngles.z; checkRot %= 90f; if (checkRot < 80f && checkRot > 10f) { m_Crash = true; } } // fall check if (m_Fall <= m_FallCrashValue && m_CollisionRocketGround) { m_Crash = true; } // Position setzen if (!m_CollisionRocketGround) { // setze neue Position transform.position = VectorUmwandeln(m_VectorDLL); // setzt neue Rotation transform.localRotation = Quaternion.Euler(0, 0, transform.rotation.eulerAngles.z + m_MovementRotation); } // Wenn Rakete sanft landet else if (m_CollisionRocketGround && !m_Crash) { // setze neue Position falls leertaste gedrückt wurde if (Input.GetKey(KeyCode.Space)) { transform.position = VectorUmwandeln(m_VectorDLL); } // setze rotationsgeschwindigkeit zurück m_MovementRotation = 0; } if (m_Crash) { m_Material.CopyPropertiesFromMaterial(m_Red); //m_Material = m_Red; } }