예제 #1
0
    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);
            }
        }
    }
예제 #2
0
    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)));
            }
        }
    }
예제 #3
0
    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();
        }
    }
예제 #4
0
    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);
        }
    }
예제 #5
0
    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);
    }