private IEnumerator TrackTactic(Track track) { GuidanceModule guidance = GetComponent <GuidanceModule>(); if (guidance != null) { while (track != null && track.isLost == false && track.identification != TrackId.Neutrual) { // If original track is lost or missing, we will change our target. // If original track is identified as neutral (counter-measures will all be neutral). // If the new track is very close to the original track, the missile might consider that as the true target. if (guidance.targetTrack == null || guidance.targetTrack.isLost || guidance.targetTrack.identification == TrackId.Neutrual || (UnityEngine.Random.Range(0f, 100f) > 25f && Vector3.Distance(guidance.targetTrack.predictedPosition, track.predictedPosition) < 200f)) { if (guidance.guidanceParameter != null) { Vector3 predictedPosition = (Vector3)guidance.guidanceParameter; float positionError = Vector3.Distance(predictedPosition, track.predictedPosition); yield return(new WaitForSeconds(Mathf.Min(positionError * 0.0002f, 5.0f))); if (guidance.targetTrack == null || guidance.targetTrack.isLost || guidance.targetTrack.identification == TrackId.Neutrual) { guidance.SetupGuidance(track, null); WarheadModule warhead = GetComponent <WarheadModule>(); if (warhead != null) { warhead.SetupTarget(track); } yield return(new WaitForSeconds(4f)); yield return(null); } } else { guidance.SetupGuidance(track, null); WarheadModule warhead = GetComponent <WarheadModule>(); if (warhead != null) { warhead.SetupTarget(track); } yield return(new WaitForSeconds(4f)); yield return(null); } } else { yield return(new WaitForSeconds(1f)); } yield return(null); } } }
private IEnumerator TrackTactic(Track track) { GuidanceModule guidance = GetComponent <GuidanceModule>(); if (guidance != null) { while (track != null && track.isLost == false && track.identification != TrackId.Neutrual) { // If original track is lost or missing, we will change our target. // If original track is identified as neutral (counter-measures will all be neutral). // If the new track is very close to the original track, the missile might consider that as the true target. if (guidance.targetTrack == null || guidance.targetTrack.isLost || guidance.targetTrack.identification == TrackId.Neutrual) { if (guidance.targetTrack != null) { // Sort priority by distance error. yield return(new WaitForSeconds(Mathf.Min(Vector3.Distance(guidance.targetTrack.predictedPosition, track.predictedPosition) * 0.0004f, 4f))); } if (guidance.targetTrack == null || guidance.targetTrack.isLost || guidance.targetTrack.identification == TrackId.Neutrual) { if (UnityEngine.Random.Range(0f, 100f) > 20f) { guidance.SetupGuidance(track, null); WarheadModule warhead = GetComponent <WarheadModule>(); if (warhead != null) { warhead.SetupTarget(track); } yield return(new WaitForSeconds(0.2f)); } } } yield return(new WaitForSeconds(UnityEngine.Random.Range(0.2f, 0.5f))); } } }
void OnGUI() { int i = 0; Track trackToBeEngaged = null; if (selectedVehicle != null && selectedLauncherVehicle != "") { GUI.Label(new Rect(10f, 10f, 50f, 20f), "Targets:"); } else { GUI.Label(new Rect(10f, 10f, 50f, 20f), "Units:"); } viewAir = GUI.Toggle(new Rect(60f, 10f, 50f, 20f), viewAir, "Air", "button"); viewSurf = GUI.Toggle(new Rect(120f, 10f, 50f, 20f), viewSurf, "Surf", "button"); viewSub = GUI.Toggle(new Rect(180f, 10f, 50f, 20f), viewSub, "Sub", "button"); viewWeapon = GUI.Toggle(new Rect(240f, 10f, 50f, 20f), viewWeapon, "Weap", "button"); viewNonWeapon = GUI.Toggle(new Rect(300f, 10f, 50f, 20f), viewNonWeapon, "NoWeap", "button"); viewSide0 = GUI.Toggle(new Rect(360f, 10f, 50f, 20f), viewSide0, "Side0", "button"); viewSide1 = GUI.Toggle(new Rect(420f, 10f, 50f, 20f), viewSide1, "Side1", "button"); viewSideNeutral = GUI.Toggle(new Rect(480f, 10f, 50f, 20f), viewSideNeutral, "Neutral", "button"); showPlumbLine = GUI.Toggle(new Rect(540f, 10f, 50f, 20f), showPlumbLine, "PL"); showIntentionLine = GUI.Toggle(new Rect(600f, 10f, 50f, 20f), showIntentionLine, "IL"); showName = GUI.Toggle(new Rect(660f, 10f, 50f, 20f), showName, "Name"); if (showName) { foreach (Vehicle vehicle in SceneManager.instance.vehicles) { if (Vehicle.sVehicleCanBeTracked[vehicle.typeName]) { Vector3 screenPoint = vehicleCamera.WorldToScreenPoint(vehicle.transform.position); if (screenPoint.z > 0) { if (vehicle.side == 0) { GUI.contentColor = Color.blue; } else if (vehicle.side == 1) { GUI.contentColor = Color.red; } else if (vehicle.side == -1) { GUI.contentColor = Color.white; } GUI.Label(new Rect(screenPoint.x, Screen.height - screenPoint.y, 200f, 30f), vehicle.typeName); } } } } GUI.contentColor = Color.white; GUILayout.BeginArea(new Rect(10f, 40f, 280f, Screen.height - 50f)); scrollPosition = GUILayout.BeginScrollView(scrollPosition); foreach (Vehicle vehicle in SceneManager.instance.vehicles) { if (Vehicle.sVehicleTypes[vehicle.typeName] == Vehicle.VehicleType.Air && viewAir == false) { continue; } if (Vehicle.sVehicleTypes[vehicle.typeName] == Vehicle.VehicleType.Surf && viewSurf == false) { continue; } if (Vehicle.sVehicleTypes[vehicle.typeName] == Vehicle.VehicleType.Sub && viewSub == false) { continue; } if (vehicle.GetComponent <WarheadModule>() != null && viewWeapon == false) { continue; } if (vehicle.GetComponent <WarheadModule>() == null && viewNonWeapon == false) { continue; } if (selectedLauncherVehicle == "") { if (vehicle.side == 0 && viewSide0 == false) { continue; } if (vehicle.side == 1 && viewSide1 == false) { continue; } if (vehicle.side == -1 && viewSideNeutral == false) { continue; } } if (Vehicle.sVehicleCanBeTracked[vehicle.typeName]) { if (selectedVehicle != null && selectedLauncherVehicle != "") { if (vehicle.isDead) { continue; } if (vehicle.side == -1 || vehicle.side == selectedVehicle.side) { continue; } if (selectedVehicle.sensorCtrl == null || selectedVehicle.sensorCtrl.tracksDetected.Exists((Track trk) => trk.target == vehicle) == false) { continue; } Track track = selectedVehicle.sensorCtrl.tracksDetected.Find((Track trk) => trk.target == vehicle); if (selectedVehicle.launcherCtrl.CanEngageWith(track, selectedLauncherVehicle, false) == false) { continue; } bool engage = GUILayout.Button(vehicle.typeName, GUILayout.Height(15f)); if (engage) { trackToBeEngaged = track; } i++; } else { bool selected = selectedVehicle == vehicle; bool nowSelected = (GUILayout.Toggle(selectedVehicle == vehicle, vehicle.typeName + (vehicle.isDead ? "(Dead)" : ""), "button", GUILayout.Height(15f))); if (selected && nowSelected == false) { //vehicleCamera.transform.parent = null; selectedVehicle = null; vehicleCamera.GetComponent <MouseOrbit>().target = null; } else if (selected == false && nowSelected) { selectedVehicle = vehicle; vehicleCamera.transform.parent = vehicle.transform; vehicleCamera.transform.localPosition = new Vector3(500f, 500f, 500f); vehicleCamera.transform.LookAt(vehicle.transform); vehicleCamera.transform.parent = null; vehicleCamera.GetComponent <MouseOrbit>().target = vehicle.transform; //vehicleCamera.GetComponent<MouseOrbit>().UpdateState(); } ++i; } } } GUILayout.EndScrollView(); GUILayout.EndArea(); if (trackToBeEngaged != null) { selectedVehicle.launcherCtrl.Launch(selectedLauncherVehicle, trackToBeEngaged); if (selectedVehicle.launcherCtrl.CanEngageWith(trackToBeEngaged, selectedLauncherVehicle, false, true) == false) { selectedLauncherVehicle = ""; } } if ( selectedVehicle == null || selectedVehicle.launcherCtrl == null || selectedVehicle.launcherCtrl.launchers.Any ( (Launcher launcher) => launcher.enabled && launcher.vehicleNames.Contains(selectedLauncherVehicle) && launcher.vehicleCounts[launcher.vehicleNames.IndexOf(selectedLauncherVehicle)] > 0 ) == false ) { // No launcher available for the selected weapon. (perhaps due to damage) selectedLauncherVehicle = ""; } if (selectedVehicle != null) { GUILayout.BeginArea(new Rect(Screen.width - 310f, 10f, 300f, 1500f)); { GUILayout.BeginVertical(); { GUILayout.Label("Unit: " + selectedVehicle.typeName + " (" + selectedVehicle.armorModule.armorPoint.ToString("F0") + "/" + selectedVehicle.armorModule.maxArmorPoint.ToString("F0") + ")" + " Side: " + selectedVehicle.side.ToString()); if (selectedVehicle.GetComponent <GuidanceModule>() != null) { GuidanceModule guidanceModule = selectedVehicle.GetComponent <GuidanceModule>(); GUILayout.Label("Guidance: " + guidanceModule.GetType().Name); if (guidanceModule.targetTrack != null) { GUILayout.Label(guidanceModule.targetTrack.vehicleTypeName + "(" + guidanceModule.targetTrack.age.ToString("F0") + "): " + Vector3.Distance(selectedVehicle.position, guidanceModule.targetTrack.predictedPosition).ToString("F0")); } else if (guidanceModule.guidanceParameter is Vector3) { GUILayout.Label(((Vector3)guidanceModule.guidanceParameter).ToString() + ": " + Vector3.Distance((Vector3)guidanceModule.guidanceParameter, selectedVehicle.position).ToString("F0")); } } selectedVehicle.OnVehicleControllerGUI(); if (selectedVehicle.launcherCtrl != null && selectedVehicle.launcherCtrl.launchers.Count > 0) { GUILayout.Label("Weapon: "); List <string> launcherVehicles = new List <string>(); List <int> launcherVehicleCount = new List <int>(); foreach (Launcher launcher in selectedVehicle.launcherCtrl.launchers) { if (launcher.enabled == false) { continue; } for (int j = 0; j < launcher.vehicleNames.Count; ++j) { if (launcherVehicles.Contains(launcher.vehicleNames[j])) { launcherVehicleCount[launcherVehicles.IndexOf(launcher.vehicleNames[j])] += launcher.vehicleCounts[j]; } else { launcherVehicles.Add(launcher.vehicleNames[j]); launcherVehicleCount.Add(launcher.vehicleCounts[j]); } } } if (launcherVehicles.Count > 0) { for (int j = 0; j < launcherVehicles.Count; ++j) { bool wasSelected = selectedLauncherVehicle == launcherVehicles[j]; if (launcherVehicleCount[j] == 0) { if (wasSelected) { selectedLauncherVehicle = ""; } continue; } if (GUILayout.Toggle(wasSelected, launcherVehicles[j] + " x" + launcherVehicleCount[j].ToString(), "button", GUILayout.Height(15f))) { selectedLauncherVehicle = launcherVehicles[j]; } else { if (wasSelected) { selectedLauncherVehicle = ""; } } } } else { selectedLauncherVehicle = ""; } } if (selectedVehicle.airstripCtrl != null && selectedVehicle.airstripCtrl.airStrips.Count > 0 && (selectedVehicle.airstripCtrl.vehicleCounts.Any((int v) => v > 0) || selectedVehicle.airstripCtrl.airStrips.Any((Airstrip airStrip) => airStrip.vehicleAttached != null && (airStrip.vehicleIsDeploying || airStrip.vehicleIsLaunching)) ) ) { GUILayout.Label("Flight Deck:"); for (int n = 0; n < selectedVehicle.airstripCtrl.vehicles.Count; ++n) { if (selectedVehicle.airstripCtrl.vehicleCounts[n] == 0) { continue; } bool launch = GUILayout.Button(selectedVehicle.airstripCtrl.vehicles[n] + " x" + selectedVehicle.airstripCtrl.vehicleCounts[n].ToString(), "button", GUILayout.Height(15f)); if (launch) { Airstrip airStrip; selectedVehicle.airstripCtrl.PrepareForTakeOff(selectedVehicle.airstripCtrl.vehicles[n], out airStrip); } } for (int n = 0; n < selectedVehicle.airstripCtrl.airStrips.Count; ++n) { Airstrip a = selectedVehicle.airstripCtrl.airStrips[n]; if (a.vehicleAttached == null) { continue; } string stripState = ""; if (a.vehicleIsDeploying && a.vehicleIsUndeploying == false) { stripState = "Preparing"; } else if (a.vehicleIsDeploying && a.vehicleIsUndeploying) { stripState = "Canceling"; } else if (a.vehicleIsLaunching) { stripState = "Launching"; } else { stripState = "Landing"; } if (a.vehicleIsDeploying && a.vehicleProgress == 100f) { if (Vehicle.sVehicleIsDeployOnly.ContainsKey(a.vehicleAttached.typeName) && Vehicle.sVehicleIsDeployOnly[a.vehicleAttached.typeName] == true) { bool retract = GUILayout.Button("Retract " + a.vehicleAttached.typeName, "button", GUILayout.Height(15f)); if (retract) { selectedVehicle.airstripCtrl.CancelTakeOff(a); } } else { GUILayout.BeginHorizontal(); { bool launch = GUILayout.Button(a.vehicleAttached.typeName + " (Ready to Launch)", "button", GUILayout.Height(15f)); if (launch) { selectedVehicle.airstripCtrl.TakeOff(a); } bool cancelLaunch = GUILayout.Button("Cancel", "button", GUILayout.Height(15f), GUILayout.Width(70f)); if (cancelLaunch) { selectedVehicle.airstripCtrl.CancelTakeOff(a); } } GUILayout.EndHorizontal(); } } else { GUILayout.Label(a.vehicleAttached.typeName + " (" + stripState + "...)", "button", GUILayout.Height(15f)); } } } if (selectedVehicle.takeOffFrom != null && selectedVehicle.enabled && selectedVehicle is Aircraft) { bool rtb = GUILayout.Toggle((selectedVehicle as Aircraft).isRTB, "Return to Base", "button", GUILayout.Height(15f)); if (rtb && (selectedVehicle as Aircraft).isRTB == false) { selectedVehicle.ReturnToBase(); } else if (rtb == false) { if ((selectedVehicle as Aircraft).isRTB == true) { bool landSiteFound = false; foreach (Vehicle v in SceneManager.instance.vehicles) { if (v.airstripCtrl != null) { foreach (Airstrip a in v.airstripCtrl.airStrips) { if (a.vehicleAttached == selectedVehicle) { a.vehicleAttached = null; a.vehicleIsLanding = a.vehicleIsUndeploying = false; landSiteFound = true; break; } } } if (landSiteFound) { break; } } (selectedVehicle as Aircraft).isRTB = false; (selectedVehicle as Aircraft).isAligned = false; } } } if (selectedVehicle.sensorCtrl != null && selectedVehicle.sensorCtrl.sensors.Count > 0) { GUILayout.Label("Sensor:"); foreach (Sensor sensor in selectedVehicle.sensorCtrl.sensors) { bool toggle = GUILayout.Toggle(sensor.isToggled && sensor.enabled, sensor.sensorName + (sensor.enabled ? "" : " (Damaged)"), "button", GUILayout.Height(15f)); if (sensor.isToggleable && sensor.enabled) { selectedVehicle.sensorCtrl.Toggle(sensor.sensorName, toggle); } } } GUILayout.Label("Tactics:"); selectedVehicle.autoDealWithAirThreats = GUILayout.Toggle(selectedVehicle.autoDealWithAirThreats, "Auto Deal With Air Threats"); selectedVehicle.autoDealWithSubThreats = GUILayout.Toggle(selectedVehicle.autoDealWithSubThreats, "Auto Deal With Sub Threats"); selectedVehicle.autoEngageAirTracks = GUILayout.Toggle(selectedVehicle.autoEngageAirTracks, "Auto Engage Air Tracks"); selectedVehicle.autoEngageSurfTracks = GUILayout.Toggle(selectedVehicle.autoEngageSurfTracks, "Auto Engage Surf Tracks"); selectedVehicle.autoEngageSubTracks = GUILayout.Toggle(selectedVehicle.autoEngageSubTracks, "Auto Engage Sub Tracks"); if (selectedVehicle.GetVehicleInfo() != null) { foreach (string line in selectedVehicle.GetVehicleInfo()) { GUILayout.Label(line); } } if (selectedVehicle.sensorCtrl != null && selectedVehicle.sensorCtrl.sensors.Count > 0) { GUILayout.Label("Tracks:"); foreach (Track track in selectedVehicle.sensorCtrl.tracksDetected) { GUILayout.Label(track.vehicleTypeName + "(" + track.age.ToString("F0") + "): " + track.identification.ToString() + ", " + Vector3.Distance(track.predictedPosition, selectedVehicle.position).ToString("F0")); } } } } GUILayout.EndVertical(); GUILayout.EndArea(); GUILayout.BeginArea(new Rect(Screen.width / 2f - 100f, Screen.height - 50f, 200f, 40f)); GUILayout.BeginVertical(); { GUILayout.BeginHorizontal(); { if (GUILayout.RepeatButton("Zoom-", GUILayout.Height(30f))) { vehicleCamera.GetComponent <MouseOrbit>().distance += 20f; } if (GUILayout.RepeatButton("Zoom+", GUILayout.Height(30f))) { vehicleCamera.GetComponent <MouseOrbit>().distance -= 20f; } vehicleCamera.GetComponent <MouseOrbit>().useTailMode = GUILayout.Toggle(vehicleCamera.GetComponent <MouseOrbit>().useTailMode, "Tail", "button", GUILayout.Height(30f)); } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); GUILayout.EndArea(); } }
public bool Launch(string vehicleName, Track target) { if (enabled == false) { return(false); } if (isLoaded == false && currentSalvoCount == 0) { return(false); } if (vehicleNames.Contains(vehicleName) == false) { return(false); } if (vehicleCounts[vehicleNames.IndexOf(vehicleName)] <= 0) { return(false); } GameObject vehicle = ResourceManager.LoadPrefab(Vehicle.sVehiclePrefabPaths[vehicleName]); float eta = Vector3.Distance(this.transform.position, target.predictedPositionAtTime(0)) / Vehicle.sVehicleMaxSpeed[vehicleName] / 0.9f; eta = Vector3.Distance(this.transform.position, target.predictedPositionAtTime(eta)) / Vehicle.sVehicleMaxSpeed[vehicleName] / 0.9f; eta = Vector3.Distance(this.transform.position, target.predictedPositionAtTime(eta)) / Vehicle.sVehicleMaxSpeed[vehicleName] / 0.9f; GuidanceModule guidance = vehicle.GetComponent <GuidanceModule>(); if (guidance == null) { Debug.Log("Vehicle that can be launched should have GuidanceModule."); } else { if (guidance.requiresLockBeforeFiring == true) { guidance.SetupGuidance(target, null); if (vehicle.GetComponent <Vehicle>().sensorCtrl != null) { vehicle.GetComponent <Vehicle>().sensorCtrl.AddTrack(target); } WarheadModule warhead = vehicle.GetComponent <WarheadModule>(); if (warhead != null) { warhead.SetupTarget(target); } // Fill track information via data-link if possible. // (even if this weapon already requires locking, which means the track information will be provided by the launcher). if (vehicle.GetComponent <DatalinkModule>() != null) { if (vehicle.GetComponent <DatalinkModule>().isDuplex) { vehicle.GetComponent <DatalinkModule>().AddReceiver(self); } foreach (DatalinkModule dl in self.GetComponents <DatalinkModule>()) { if (dl.limitTrackedVehicleType == false || dl.trackedVehicleType == Vehicle.sVehicleTypes[target.vehicleTypeName]) { dl.AddReceiver(vehicle.GetComponent <Vehicle>()); } } } } else { GameObject.Destroy(vehicle); bool isLaunched = Launch(vehicleName, target.predictedPositionAtTime(eta), target); if (isLaunched) { Vehicle launchedVehicle = SceneManager.instance.vehicles[SceneManager.instance.vehicles.Count - 1]; launchedVehicle.GetComponent <WarheadModule>().SetupTarget(target); // Fill track information via data-link if possible. if (launchedVehicle.GetComponent <DatalinkModule>() != null) { Track launchedVehicleOwnTrack = new Track(launchedVehicle, target.target, TrackId.Unknown); launchedVehicleOwnTrack.UpdateTrack(target.position, target.velocity, target.timeOfLastUpdate, target.identification); launchedVehicle.sensorCtrl.AddTrack(launchedVehicleOwnTrack); launchedVehicle.OnNewTrack(launchedVehicleOwnTrack, "Fire Control"); if (launchedVehicle.GetComponent <DatalinkModule>().isDuplex) { launchedVehicle.GetComponent <DatalinkModule>().AddReceiver(self); } foreach (DatalinkModule dl in self.GetComponents <DatalinkModule>()) { if (dl.limitTrackedVehicleType == false || dl.trackedVehicleType == Vehicle.sVehicleTypes[target.vehicleTypeName]) { dl.AddReceiver(launchedVehicle); } } } } return(isLaunched); } } Vector3 launcherDirection; float angleDiff; if (isPitchFixed == false && isYawFixed == true) { float directCourse = Mathf.Rad2Deg * Mathf.Atan2(target.predictedPositionAtTime(eta).x - vehicle.transform.localPosition.x, target.predictedPositionAtTime(eta).z - vehicle.transform.localPosition.z); angleDiff = directCourse - (self.course + fixedDirection.y); } else if (isPitchFixed == true && isYawFixed == false) { float directPitch = Mathf.Rad2Deg * Mathf.Atan2(target.predictedPositionAtTime(eta).y - vehicle.transform.localPosition.y, Mathf.Sqrt(Mathf.Pow(target.predictedPositionAtTime(eta).z - vehicle.transform.localPosition.z, 2) + Mathf.Pow(target.predictedPositionAtTime(eta).x - vehicle.transform.localPosition.x, 2))); angleDiff = directPitch - (self.pitch + fixedDirection.x); } else if (isPitchFixed == true && isYawFixed == true) { launcherDirection = this.transform.forward; Quaternion rotation = Quaternion.Euler(new Vector3(-fixedDirection.x, fixedDirection.y, 0f)); launcherDirection = rotation * launcherDirection; angleDiff = Vector3.Angle(target.predictedPositionAtTime(eta) - this.transform.position, launcherDirection); } else { angleDiff = 0f; } if (angleDiff > launchHalfAngle) { // Launcher half angle constraint not met. GameObject.Destroy(vehicle); return(false); } if (guidance.requiresFireControl) { if (fireControlChannels.Count < maxFireControlChannels) { vehicle.transform.parent = SceneManager.instance.transform.Find("Side " + self.side.ToString()); vehicle.transform.position = this.transform.position; float expectedCourse = Mathf.Rad2Deg * Mathf.Atan2(target.predictedPositionAtTime(eta).x - vehicle.transform.localPosition.x, target.predictedPositionAtTime(eta).z - vehicle.transform.localPosition.z); vehicle.GetComponent <Locomotor>().orderedCourse = expectedCourse; if (this.isYawFixed) { vehicle.GetComponent <Vehicle>().course = this.transform.eulerAngles.y + fixedDirection.y; } else { vehicle.GetComponent <Vehicle>().course = expectedCourse; } float expectedPitch = Mathf.Rad2Deg * Mathf.Atan2(target.predictedPositionAtTime(eta).y - vehicle.transform.localPosition.y, Mathf.Sqrt(Mathf.Pow(target.predictedPositionAtTime(eta).z - vehicle.transform.localPosition.z, 2) + Mathf.Pow(target.predictedPositionAtTime(eta).x - vehicle.transform.localPosition.x, 2))); vehicle.GetComponent <Locomotor>().orderedPitch = Mathf.Max(0f, expectedPitch); if (this.isPitchFixed) { vehicle.GetComponent <Vehicle>().pitch = this.transform.eulerAngles.x + fixedDirection.x; } else { vehicle.GetComponent <Vehicle>().pitch = expectedPitch; } vehicle.GetComponent <Vehicle>().speed = self.speed; vehicle.GetComponent <Locomotor>().orderedSpeed = vehicle.GetComponent <Vehicle>().maxSpeed; vehicle.GetComponent <Vehicle>().position = this.transform.position; SceneManager.instance.vehicles.Add(vehicle.GetComponent <Vehicle>()); vehicle.GetComponent <Vehicle>().side = self.side; fireControlChannels.Add(new FireControlChannel(vehicle.GetComponent <Vehicle>(), target)); lastTimeOfFiring = Time.time; vehicleCounts[vehicleNames.IndexOf(vehicleName)]--; currentSalvoCount++; if (muzzleFX != null) { if (currentSalvoCount == 1) { GameObject muzzleFXInstance = (GameObject)GameObject.Instantiate(muzzleFX); muzzleFXInstance.transform.parent = SceneManager.instance.transform; muzzleFXInstance.transform.position = this.transform.position; muzzleFXInstance.GetComponent <ParticleSystem>().Play(true); } } if (currentSalvoCount == salvoCount) { currentSalvoCount = 0; } else { StartCoroutine(DelayedLaunch(vehicleName, target, salvoInterval)); } return(true); } else { // Fire Control Channels are full. GameObject.Destroy(vehicle); return(false); } } else { vehicle.transform.parent = SceneManager.instance.transform.Find("Side " + self.side.ToString()); vehicle.transform.position = this.transform.position; float expectedCourse = Mathf.Rad2Deg * Mathf.Atan2(target.predictedPositionAtTime(eta).x - vehicle.transform.localPosition.x, target.predictedPositionAtTime(eta).z - vehicle.transform.localPosition.z); vehicle.GetComponent <Locomotor>().orderedCourse = expectedCourse; if (this.isYawFixed) { vehicle.GetComponent <Vehicle>().course = self.course + fixedDirection.y; } else { vehicle.GetComponent <Vehicle>().course = expectedCourse; } float expectedPitch = Mathf.Rad2Deg * Mathf.Atan2(target.predictedPositionAtTime(eta).y - vehicle.transform.localPosition.y, Mathf.Sqrt(Mathf.Pow(target.predictedPositionAtTime(eta).z - vehicle.transform.localPosition.z, 2) + Mathf.Pow(target.predictedPositionAtTime(eta).x - vehicle.transform.localPosition.x, 2))); vehicle.GetComponent <Locomotor>().orderedPitch = Mathf.Max(0f, expectedPitch); if (this.isPitchFixed) { vehicle.GetComponent <Vehicle>().pitch = self.pitch + fixedDirection.x; } else { vehicle.GetComponent <Vehicle>().pitch = expectedPitch; } vehicle.GetComponent <Vehicle>().speed = self.speed; vehicle.GetComponent <Locomotor>().orderedSpeed = vehicle.GetComponent <Vehicle>().maxSpeed; vehicle.GetComponent <Vehicle>().position = this.transform.position; SceneManager.instance.vehicles.Add(vehicle.GetComponent <Vehicle>()); vehicle.GetComponent <Vehicle>().side = self.side; lastTimeOfFiring = Time.time; vehicleCounts[vehicleNames.IndexOf(vehicleName)]--; currentSalvoCount++; if (muzzleFX != null) { if (currentSalvoCount == 1) { GameObject muzzleFXInstance = (GameObject)GameObject.Instantiate(muzzleFX); muzzleFXInstance.transform.parent = SceneManager.instance.transform; muzzleFXInstance.transform.position = this.transform.position; muzzleFXInstance.GetComponent <ParticleSystem>().Play(true); } } if (currentSalvoCount == salvoCount) { currentSalvoCount = 0; } else { StartCoroutine(DelayedLaunch(vehicleName, target, salvoInterval)); } return(true); } }
public bool Launch(string vehicleName, Vector3 position, Track actualTrack = null) { if (enabled == false) { return(false); } if (isLoaded == false && currentSalvoCount == 0) { return(false); } if (vehicleNames.Contains(vehicleName) == false) { return(false); } if (vehicleCounts[vehicleNames.IndexOf(vehicleName)] <= 0) { return(false); } GameObject vehicle = ResourceManager.LoadPrefab(Vehicle.sVehiclePrefabPaths[vehicleName]); GuidanceModule guidance = vehicle.GetComponent <GuidanceModule>(); if (guidance == null) { Debug.Log("Vehicle that can be launched should have GuidanceModule."); } Vector3 launcherDirection; float angleDiff; if (isPitchFixed == false && isYawFixed == true) { float directCourse = Mathf.Rad2Deg * Mathf.Atan2(position.x - vehicle.transform.localPosition.x, position.z - vehicle.transform.localPosition.z); angleDiff = directCourse - (self.course + fixedDirection.y); } else if (isPitchFixed == true && isYawFixed == false) { float directPitch = Mathf.Rad2Deg * Mathf.Atan2(position.y - vehicle.transform.localPosition.y, Mathf.Sqrt(Mathf.Pow(position.z - vehicle.transform.localPosition.z, 2) + Mathf.Pow(position.x - vehicle.transform.localPosition.x, 2))); angleDiff = directPitch - (self.pitch + fixedDirection.x); } else if (isPitchFixed == true && isYawFixed == true) { launcherDirection = this.transform.forward; Quaternion rotation = Quaternion.Euler(new Vector3(-fixedDirection.x, fixedDirection.y, 0f)); launcherDirection = rotation * launcherDirection; angleDiff = Vector3.Angle(position - this.transform.position, launcherDirection); } else { angleDiff = 0f; } if (angleDiff > launchHalfAngle) { // Launcher half angle constraint not met. GameObject.Destroy(vehicle); return(false); } guidance.SetupGuidance(null, position); WarheadModule warhead = vehicle.GetComponent <WarheadModule>(); if (warhead != null) { warhead.SetupTarget(position); } vehicle.transform.parent = SceneManager.instance.transform.Find("Side " + self.side.ToString()); vehicle.transform.position = this.transform.position; float expectedCourse = Mathf.Rad2Deg * Mathf.Atan2(position.x - vehicle.transform.localPosition.x, position.z - vehicle.transform.localPosition.z); vehicle.GetComponent <Locomotor>().orderedCourse = expectedCourse; if (this.isYawFixed) { vehicle.GetComponent <Vehicle>().course = self.course + fixedDirection.y; } else { vehicle.GetComponent <Vehicle>().course = expectedCourse; } float expectedPitch = Mathf.Rad2Deg * Mathf.Atan2(position.y - vehicle.transform.localPosition.y, Mathf.Sqrt(Mathf.Pow(position.z - vehicle.transform.localPosition.z, 2) + Mathf.Pow(position.x - vehicle.transform.localPosition.x, 2))); vehicle.GetComponent <Locomotor>().orderedPitch = Mathf.Max(0f, expectedPitch); if (this.isPitchFixed) { vehicle.GetComponent <Vehicle>().pitch = self.pitch + fixedDirection.x; } else { vehicle.GetComponent <Vehicle>().pitch = expectedPitch; } vehicle.GetComponent <Vehicle>().speed = self.speed; vehicle.GetComponent <Locomotor>().orderedSpeed = vehicle.GetComponent <Vehicle>().maxSpeed; vehicle.GetComponent <Vehicle>().position = this.transform.position; SceneManager.instance.vehicles.Add(vehicle.GetComponent <Vehicle>()); vehicle.GetComponent <Vehicle>().side = self.side; lastTimeOfFiring = Time.time; vehicleCounts[vehicleNames.IndexOf(vehicleName)]--; currentSalvoCount++; if (muzzleFX != null) { if (currentSalvoCount == 1) { GameObject muzzleFXInstance = (GameObject)GameObject.Instantiate(muzzleFX); muzzleFXInstance.transform.parent = SceneManager.instance.transform; muzzleFXInstance.transform.position = this.transform.position; muzzleFXInstance.GetComponent <ParticleSystem>().Play(true); } } if (currentSalvoCount == salvoCount) { currentSalvoCount = 0; } else { if (actualTrack == null) { StartCoroutine(DelayedLaunch(vehicleName, position, salvoInterval)); } else { StartCoroutine(DelayedLaunch(vehicleName, actualTrack, salvoInterval)); } } return(true); }