public void UpdateDrone() { if (ShouldSleep()) { lightObject.shadows = LightShadows.None; if (motor_alive) { distance_sleep = true; GetComponent <Rigidbody>().Sleep(); } if (audiosource_motor.isPlaying) { audiosource_motor.Stop(); } return; } else { if (lightObject.intensity > 0.0f) { lightObject.shadows = LightShadows.Hard; } else { lightObject.shadows = LightShadows.None; } if (motor_alive && distance_sleep) { GetComponent <Rigidbody>().WakeUp(); distance_sleep = false; } if (!audiosource_motor.isPlaying) { audiosource_motor.volume = Preferences.sound_volume; audiosource_motor.Play(); } if (level_creator != null) { int new_tile_position = level_creator.GetTilePosition(transform.position); if (tile_parent_position != new_tile_position) { tile_parent_position = new_tile_position; transform.parent = level_creator.GetPositionTileEnemiesParent(transform.position); } } } if (audiosource_taser.isPlaying && (!barrel_alive || ai_state != AIState.FIRING)) // Turn off taser if we no longer fire { audiosource_taser.Stop(); } Vector3 rel_pos = target_pos - transform.position; if (motor_alive) { float kFlyDeadZone = 0.2f; float kFlySpeed = 10.0f; Vector3 target_vel = (target_pos - transform.position) / kFlyDeadZone; if (target_vel.magnitude > 1.0f) { target_vel = target_vel.normalized; } target_vel *= kFlySpeed; Vector3 target_accel = (target_vel - GetComponent <Rigidbody>().velocity); if (ai_state == AIState.IDLE) { target_accel *= 0.1f; } target_accel.y += 9.81f; rotor_speed = target_accel.magnitude; rotor_speed = Mathf.Clamp(rotor_speed, 0.0f, 14.0f); Vector3 up = transform.rotation * new Vector3(0.0f, 1.0f, 0.0f); Quaternion correction = Quaternion.identity; correction.SetFromToRotation(up, target_accel.normalized); Vector3 correction_vec = Vector3.zero; float correction_angle = 0.0f; correction.ToAngleAxis(out correction_angle, out correction_vec); tilt_correction = correction_vec * correction_angle; tilt_correction -= GetComponent <Rigidbody>().angularVelocity; Vector3 x_axis = transform.rotation * new Vector3(1.0f, 0.0f, 0.0f); Vector3 y_axis = transform.rotation * new Vector3(0.0f, 1.0f, 0.0f); Vector3 z_axis = transform.rotation * new Vector3(0.0f, 0.0f, 1.0f); if (ai_state != AIState.IDLE) { Vector3 y_plane_pos = (new Vector3(Vector3.Dot(rel_pos, z_axis), 0.0f, -Vector3.Dot(rel_pos, x_axis))).normalized; float target_y = Mathf.Atan2(y_plane_pos.x, y_plane_pos.z) / Mathf.PI * 180 - 90; while (target_y > 180) { target_y -= 360.0f; } while (target_y < -180) { target_y += 360.0f; } tilt_correction += y_axis * target_y; tilt_correction *= 5.0f; } else { tilt_correction += y_axis; } if (ai_state == AIState.IDLE) { tilt_correction *= 0.1f; } if (GetComponent <Rigidbody>().velocity.magnitude < 0.2f) { stuck_delay += Time.deltaTime; if (stuck_delay > 1.0f) { target_pos = transform.position + new Vector3(UnityEngine.Random.Range(-1.0f, 1.0f), UnityEngine.Random.Range(-1.0f, 1.0f), UnityEngine.Random.Range(-1.0f, 1.0f)); stuck_delay = 0.0f; } } else { stuck_delay = 0.0f; } } else { rotor_speed = Mathf.Max(0.0f, rotor_speed - Time.deltaTime * 5.0f); GetComponent <Rigidbody>().angularDrag = 0.05f; } top_rotor_rotation += rotor_speed * Time.deltaTime * 1000.0f; bottom_rotor_rotation -= rotor_speed * Time.deltaTime * 1000.0f; if (rotor_speed * Time.timeScale > 7.0f) { bottom_rotor.gameObject.GetComponent <Renderer>().enabled = false; top_rotor.gameObject.GetComponent <Renderer>().enabled = false; } else { bottom_rotor.gameObject.GetComponent <Renderer>().enabled = true; top_rotor.gameObject.GetComponent <Renderer>().enabled = true; } var tmp_cs1 = bottom_rotor.localEulerAngles; tmp_cs1.y = bottom_rotor_rotation; bottom_rotor.localEulerAngles = tmp_cs1; var tmp_cs2 = top_rotor.localEulerAngles; tmp_cs2.y = top_rotor_rotation; top_rotor.localEulerAngles = tmp_cs2; //rigidbody.velocity += transform.rotation * Vector3(0,1,0) * rotor_speed * Time.deltaTime; RaycastHit hit = new RaycastHit(); if (camera_alive) { if (ai_state == AIState.IDLE) { switch (camera_pivot_state) { case CameraPivotState.DOWN: camera_pivot_angle += Time.deltaTime * 25.0f; if (camera_pivot_angle > 50) { camera_pivot_angle = 50.0f; camera_pivot_state = CameraPivotState.WAIT_UP; camera_pivot_delay = 0.2f; } break; case CameraPivotState.UP: camera_pivot_angle -= Time.deltaTime * 25.0f; if (camera_pivot_angle < 0) { camera_pivot_angle = 0.0f; camera_pivot_state = CameraPivotState.WAIT_DOWN; camera_pivot_delay = 0.2f; } break; case CameraPivotState.WAIT_DOWN: camera_pivot_delay -= Time.deltaTime; if (camera_pivot_delay < 0) { camera_pivot_state = CameraPivotState.DOWN; } break; case CameraPivotState.WAIT_UP: camera_pivot_delay -= Time.deltaTime; if (camera_pivot_delay < 0) { camera_pivot_state = CameraPivotState.UP; } break; } } else { camera_pivot_angle -= Time.deltaTime * 25.0f; if (camera_pivot_angle < 0) { camera_pivot_angle = 0.0f; } } // Target interactions var target = GetTarget(); if (target != null) { // Taser if (barrel_alive && ai_state == AIState.FIRING) { if (!audiosource_taser.isPlaying) { audiosource_taser.volume = Preferences.sound_volume; audiosource_taser.Play(); } else { audiosource_taser.volume = Preferences.sound_volume; } if (gun_delay <= 0.0f) { gun_delay = 0.1f; Instantiate(muzzle_flash, point_spark.position, RandomOrientation()); if (Vector3.Distance(point_spark.position, target.position + targetoffsetpos) < 1) { target.GetComponent <AimScript>().Shock(); } } } gun_delay = Mathf.Max(0.0f, gun_delay - Time.deltaTime); // Danger state var tmp_cs3 = camera_pivot.localEulerAngles; tmp_cs3.x = camera_pivot_angle; camera_pivot.localEulerAngles = tmp_cs3; float dist = Vector3.Distance(target.position + targetoffsetpos, transform.position); float danger = Mathf.Max(0.0f, 1.0f - dist / kMaxRange); if (danger > 0.0f) { danger = Mathf.Min(0.2f, danger); } if (ai_state == AIState.AIMING || ai_state == AIState.FIRING) { danger = 1.0f; } if (ai_state == AIState.ALERT || ai_state == AIState.ALERT_COOLDOWN) { danger += 0.5f; } target.GetComponent <MusicScript>().AddDangerLevel(danger); // Target finding rel_pos = (target.position + targetoffsetpos) - drone_camera.position; bool sees_target = false; if (dist < kMaxRange && Vector3.Dot(drone_camera.rotation * new Vector3(0.0f, -1.0f, 0.0f), rel_pos.normalized) > 0.7f) { hit = new RaycastHit(); if (!Physics.Linecast(drone_camera.position, target.position + targetoffsetpos, out hit, 1 << 0)) { sees_target = true; } } // Attacking if (sees_target) { Vector3 new_target = (target.position + targetoffsetpos) + target.GetComponent <AimScript>().GetVelocity() * Mathf.Clamp(Vector3.Distance(target.position + targetoffsetpos, transform.position) * 0.1f, 0.5f, 1.0f); switch (ai_state) { case AIState.IDLE: ai_state = AIState.ALERT; alert_delay = kAlertDelay; audiosource_effect.PlayOneShot(sound_alert, 0.3f * Preferences.sound_volume); break; case AIState.AIMING: target_pos = new_target; if (Vector3.Distance(transform.position, target_pos) < 4) { ai_state = AIState.FIRING; } target_pos.y += 1.0f; break; case AIState.FIRING: target_pos = new_target; if (Vector3.Distance(transform.position, target_pos) > 4) { ai_state = AIState.AIMING; } break; case AIState.ALERT: alert_delay -= Time.deltaTime; target_pos = new_target; target_pos.y += 1.0f; if (alert_delay <= 0.0f) { ai_state = AIState.AIMING; } break; case AIState.ALERT_COOLDOWN: ai_state = AIState.ALERT; alert_delay = kAlertDelay; break; } } else { switch (ai_state) { case AIState.AIMING: case AIState.FIRING: case AIState.ALERT: ai_state = AIState.ALERT_COOLDOWN; alert_cooldown_delay = kAlertCooldownDelay; break; case AIState.ALERT_COOLDOWN: alert_cooldown_delay -= Time.deltaTime; if (alert_cooldown_delay <= 0.0f) { ai_state = AIState.IDLE; audiosource_effect.PlayOneShot(sound_unalert, 0.3f * Preferences.sound_volume); } break; } } } switch (ai_state) { case AIState.IDLE: lightObject.color = new Color(0.0f, 0.0f, 1.0f); break; case AIState.AIMING: lightObject.color = new Color(1.0f, 0.0f, 0.0f); break; case AIState.ALERT: case AIState.ALERT_COOLDOWN: lightObject.color = new Color(1.0f, 1.0f, 0.0f); break; } } if (!camera_alive) { lightObject.intensity *= Mathf.Pow(0.01f, Time.deltaTime); } lensFlareObject.color = lightObject.color; lensFlareObject.brightness = lightObject.intensity; float target_pitch = rotor_speed * 0.2f; target_pitch = Mathf.Clamp(target_pitch, 0.2f, 3.0f); audiosource_motor.pitch = Mathf.Lerp(audiosource_motor.pitch, target_pitch, Mathf.Pow(0.0001f, Time.deltaTime)); audiosource_motor.volume = rotor_speed * 0.1f * Preferences.sound_volume; audiosource_motor.volume -= Vector3.Distance(Camera.main.transform.position, transform.position) * 0.0125f * Preferences.sound_volume; bool line_of_sight = true; if (Physics.Linecast(transform.position, Camera.main.transform.position, out hit, 1 << 0)) { line_of_sight = false; } if (line_of_sight) { sound_line_of_sight += Time.deltaTime * 3.0f; } else { sound_line_of_sight -= Time.deltaTime * 3.0f; } sound_line_of_sight = (float)Mathf.Clamp((int)sound_line_of_sight, 0, 1); audiosource_motor.volume *= 0.5f + sound_line_of_sight * 0.5f; object_audiosource_motor.GetComponent <AudioLowPassFilter>().cutoffFrequency = Mathf.Lerp(5000.0f, 44000.0f, sound_line_of_sight); }
void UpdateDrone (){ if(Vector3.Distance(player.transform.position, transform.position) > kSleepDistance){ GetDroneLightObject().GetComponent<Light>().shadows = LightShadows.None; if(motor_alive){ distance_sleep = true; _rigidbody.Sleep(); } if(audiosource_motor.isPlaying){ audiosource_motor.Stop(); } return; } else { if(GetDroneLightObject().GetComponent<Light>().intensity > 0.0f){ GetDroneLightObject().GetComponent<Light>().shadows = LightShadows.Hard; } else { GetDroneLightObject().GetComponent<Light>().shadows = LightShadows.None; } if(motor_alive && distance_sleep){ _rigidbody.WakeUp(); distance_sleep = false; } if(!audiosource_motor.isPlaying){ audiosource_motor.volume = PlayerPrefs.GetFloat("sound_volume", 1.0f); audiosource_motor.Play(); } } var rel_pos= target_pos - transform.position; if(motor_alive){ var kFlyDeadZone= 0.2f; var kFlySpeed= 10.0f; var target_vel= (target_pos - transform.position) / kFlyDeadZone; if(target_vel.magnitude > 1.0f){ target_vel = target_vel.normalized; } target_vel *= kFlySpeed; var target_accel= (target_vel - _rigidbody.velocity); if(ai_state == AIState.IDLE){ target_accel *= 0.1f; } target_accel.y += 9.81f; rotor_speed = target_accel.magnitude; rotor_speed = Mathf.Clamp(rotor_speed, 0.0f, 14.0f); var up= transform.rotation * new Vector3(0,1,0); Quaternion correction = Quaternion.FromToRotation(up, target_accel.normalized); Vector3 correction_vec; float correction_angle; correction.ToAngleAxis(out correction_angle, out correction_vec); tilt_correction = correction_vec * correction_angle; tilt_correction -= _rigidbody.angularVelocity; var x_axis= transform.rotation * new Vector3(1,0,0); var y_axis= transform.rotation * new Vector3(0,1,0); var z_axis= transform.rotation * new Vector3(0,0,1); if(ai_state != AIState.IDLE){ var y_plane_pos= new Vector3(Vector3.Dot(rel_pos, z_axis), 0.0f, -Vector3.Dot(rel_pos, x_axis)).normalized; var target_y= Mathf.Atan2(y_plane_pos.x, y_plane_pos.z)/Mathf.PI*180-90; while(target_y > 180){ target_y -= 360.0f; } while(target_y < -180){ target_y += 360.0f; } tilt_correction += y_axis * target_y; tilt_correction *= 5.0f; } else { tilt_correction += y_axis; } if(ai_state == AIState.IDLE){ tilt_correction *= 0.1f; } if(_rigidbody.velocity.magnitude < 0.2f){ stuck_delay += Time.deltaTime; if(stuck_delay > 1.0f){ target_pos = transform.position + new Vector3(Random.Range(-1.0f,1.0f), Random.Range(-1.0f,1.0f), Random.Range(-1.0f,1.0f)); stuck_delay = 0.0f; } } else { stuck_delay = 0.0f; } } else { rotor_speed = Mathf.Max(0.0f, rotor_speed - Time.deltaTime * 5.0f); _rigidbody.angularDrag = 0.05f; } if(barrel_alive && ai_state == AIState.FIRING){ if(!audiosource_taser.isPlaying){ audiosource_taser.volume = PlayerPrefs.GetFloat("sound_volume", 1.0f); audiosource_taser.Play(); } else { audiosource_taser.volume = PlayerPrefs.GetFloat("sound_volume", 1.0f); } if(gun_delay <= 0.0f){ gun_delay = 0.1f; Instantiate(muzzle_flash, transform.FindChild("point_spark").position, RandomOrientation()); if(Vector3.Distance(transform.FindChild("point_spark").position, player.transform.position) < 1){; player.GetComponent<AimScript>().Shock(); } } } else { audiosource_taser.Stop(); } gun_delay = Mathf.Max(0.0f, gun_delay - Time.deltaTime); top_rotor_rotation += rotor_speed * Time.deltaTime * 1000.0f; bottom_rotor_rotation -= rotor_speed * Time.deltaTime * 1000.0f; var bottom_rotor = transform.FindChild ("bottom rotor"); var top_rotor = transform.FindChild ("top rotor"); if(rotor_speed * Time.timeScale > 7.0f){ bottom_rotor.gameObject.GetComponent<Renderer>().enabled = false; top_rotor.gameObject.GetComponent<Renderer>().enabled = false; } else { bottom_rotor.gameObject.GetComponent<Renderer>().enabled = true; top_rotor.gameObject.GetComponent<Renderer>().enabled = true; } var bottomEuler = bottom_rotor.localEulerAngles; bottomEuler.y = bottom_rotor_rotation; bottom_rotor.localEulerAngles = bottomEuler; var topEuler = top_rotor.localEulerAngles; topEuler.y = top_rotor_rotation; top_rotor.localEulerAngles = topEuler; //rigidbody.velocity += transform.rotation * Vector3(0,1,0) * rotor_speed * Time.deltaTime; if(camera_alive){ if(ai_state == AIState.IDLE){ switch(camera_pivot_state) { case CameraPivotState.DOWN: camera_pivot_angle += Time.deltaTime * 25.0f; if(camera_pivot_angle > 50){ camera_pivot_angle = 50; camera_pivot_state = CameraPivotState.WAIT_UP; camera_pivot_delay = 0.2f; } break; case CameraPivotState.UP: camera_pivot_angle -= Time.deltaTime * 25.0f; if(camera_pivot_angle < 0){ camera_pivot_angle = 0; camera_pivot_state = CameraPivotState.WAIT_DOWN; camera_pivot_delay = 0.2f; } break; case CameraPivotState.WAIT_DOWN: camera_pivot_delay -= Time.deltaTime; if(camera_pivot_delay < 0){ camera_pivot_state = CameraPivotState.DOWN; } break; case CameraPivotState.WAIT_UP: camera_pivot_delay -= Time.deltaTime; if(camera_pivot_delay < 0){ camera_pivot_state = CameraPivotState.UP; } break; } } else { camera_pivot_angle -= Time.deltaTime * 25.0f; if(camera_pivot_angle < 0){ camera_pivot_angle = 0; } } var cam_pivot= transform.FindChild("camera_pivot"); var cam_pivotEuler= cam_pivot.localEulerAngles; cam_pivotEuler.x = camera_pivot_angle; cam_pivot.localEulerAngles = cam_pivotEuler; var dist= Vector3.Distance(player.transform.position, transform.position); var danger= Mathf.Max(0.0f, 1.0f - dist/kMaxRange); if(danger > 0.0f){ danger = Mathf.Min(0.2f, danger); } if(ai_state == AIState.AIMING || ai_state == AIState.FIRING){ danger = 1.0f; } if(ai_state == AIState.ALERT || ai_state == AIState.ALERT_COOLDOWN){ danger += 0.5f; } player.GetComponent<MusicScript>().AddDangerLevel(danger); var camera= transform.FindChild("camera_pivot").FindChild("camera"); rel_pos = player.transform.position - camera.position; var sees_target= false; if(dist < kMaxRange && Vector3.Dot(camera.rotation*new Vector3(0,-1,0), rel_pos.normalized) > 0.7f){ RaycastHit hit; if(!Physics.Linecast(camera.position, player.transform.position, out hit, 1<<0)){ sees_target = true; } } if(sees_target){ var new_target= player.transform.position + player.GetComponent<CharacterMotor>().GetVelocity() * Mathf.Clamp(Vector3.Distance(player.transform.position, transform.position) * 0.1f, 0.5f, 1.0f); switch(ai_state){ case AIState.IDLE: ai_state = AIState.ALERT; alert_delay = kAlertDelay; audiosource_effect.PlayOneShot(sound_alert, 0.3f * PlayerPrefs.GetFloat("sound_volume", 1.0f)); break; case AIState.AIMING: target_pos = new_target; if(Vector3.Distance(transform.position, target_pos) < 4){ ai_state = AIState.FIRING; } target_pos.y += 1.0f; break; case AIState.FIRING: target_pos = new_target; if(Vector3.Distance(transform.position, target_pos) > 4){ ai_state = AIState.AIMING; } break; case AIState.ALERT: alert_delay -= Time.deltaTime; target_pos = new_target; target_pos.y += 1.0f; if(alert_delay <= 0.0f){ ai_state = AIState.AIMING; } break; case AIState.ALERT_COOLDOWN: ai_state = AIState.ALERT; alert_delay = kAlertDelay; break; } } else { switch(ai_state){ case AIState.AIMING: case AIState.FIRING: case AIState.ALERT: ai_state = AIState.ALERT_COOLDOWN; alert_cooldown_delay = kAlertCooldownDelay; break; case AIState.ALERT_COOLDOWN: alert_cooldown_delay -= Time.deltaTime; if(alert_cooldown_delay <= 0.0f){ ai_state = AIState.IDLE; audiosource_effect.PlayOneShot(sound_unalert, 0.3f * PlayerPrefs.GetFloat("sound_volume", 1.0f)); } break; } } switch(ai_state){ case AIState.IDLE: GetDroneLightObject().GetComponent<Light>().color = new Color(0,0,1); break; case AIState.AIMING: GetDroneLightObject().GetComponent<Light>().color = new Color(1,0,0); break; case AIState.ALERT: case AIState.ALERT_COOLDOWN: GetDroneLightObject().GetComponent<Light>().color = new Color(1,1,0); break; } } if(!camera_alive){ GetDroneLightObject().GetComponent<Light>().intensity *= Mathf.Pow(0.01f, Time.deltaTime); } (GetDroneLensFlareObject().GetComponent<LensFlare>() as LensFlare).color = GetDroneLightObject().GetComponent<Light>().color; (GetDroneLensFlareObject().GetComponent<LensFlare>() as LensFlare).brightness = GetDroneLightObject().GetComponent<Light>().intensity; var target_pitch= rotor_speed * 0.2f; target_pitch = Mathf.Clamp(target_pitch, 0.2f, 3.0f); audiosource_motor.pitch = Mathf.Lerp(audiosource_motor.pitch, target_pitch, Mathf.Pow(0.0001f, Time.deltaTime)); audiosource_motor.volume = rotor_speed * 0.1f * PlayerPrefs.GetFloat("sound_volume", 1.0f); audiosource_motor.volume -= Vector3.Distance(GameObject.Find("Camera (head)").transform.position, transform.position) * 0.0125f * PlayerPrefs.GetFloat("sound_volume", 1.0f); var line_of_sight= true; { RaycastHit hit; if (Physics.Linecast (transform.position, GameObject.Find ("Camera (head)").transform.position, out hit, 1 << 0)) { line_of_sight = false; } } if(line_of_sight){ sound_line_of_sight += Time.deltaTime * 3.0f; } else { sound_line_of_sight -= Time.deltaTime * 3.0f; } sound_line_of_sight = Mathf.Clamp(sound_line_of_sight,0,1); audiosource_motor.volume *= 0.5f + sound_line_of_sight * 0.5f; object_audiosource_motor.GetComponent<AudioLowPassFilter>().cutoffFrequency = Mathf.Lerp(5000, 44000, sound_line_of_sight); }