示例#1
0
        // Called when a module is mounted on one of the vehicle's module mounts.
        protected override void OnModuleMounted(Module module)
        {
            // Look for target leading weapons
            TargetLeader targetLeader = module.GetComponent <TargetLeader>();

            if (targetLeader != null)
            {
                if (!targetLeaders.Contains(targetLeader))
                {
                    targetLeaders.Add(targetLeader);

                    targetLeader.SetTarget(weaponsTargetSelector.SelectedTarget);

                    if (weaponsTargetSelector != null)
                    {
                        weaponsTargetSelector.onSelectedTargetChanged.AddListener(targetLeader.SetTarget);
                    }

                    onTargetLeaderLoaded.Invoke(targetLeader);
                }
            }

            // Look for locking weapons
            TargetLocker targetLocker = module.GetComponent <TargetLocker>();

            if (targetLocker != null)
            {
                if (!targetLockers.Contains(targetLocker))
                {
                    targetLockers.Add(targetLocker);

                    targetLocker.SetTarget(weaponsTargetSelector.SelectedTarget);

                    if (weaponsTargetSelector != null)
                    {
                        weaponsTargetSelector.onSelectedTargetChanged.AddListener(targetLocker.SetTarget);
                    }

                    onTargetLockerLoaded.Invoke(targetLocker);
                }
            }

            // Look for gimbaled weapons
            GimbalController gimbalController = module.GetComponentInChildren <GimbalController>();

            if (gimbalController != null)
            {
                if (!gimbaledWeapons.Contains(gimbalController))
                {
                    gimbaledWeapons.Add(gimbalController);
                }
            }
        }
示例#2
0
        // Called when a module is mounted on one of the vehicle's module mounts.
        protected override void OnModuleMounted(Module module)
        {
            // Look for target leading weapons
            TargetLeader targetLeader = module.GetComponent <TargetLeader>();

            if (targetLeader != null)
            {
                if (!targetLeaders.Contains(targetLeader))
                {
                    targetLeaders.Add(targetLeader);

                    onTargetLeaderLoaded.Invoke(targetLeader);
                }
            }

            // Look for locking weapons
            TargetLocker targetLocker = module.GetComponent <TargetLocker>();

            if (targetLocker != null)
            {
                if (!targetLockers.Contains(targetLocker))
                {
                    targetLockers.Add(targetLocker);

                    onTargetLockerLoaded.Invoke(targetLocker);
                }
            }

            // Look for aim assists
            AimAssist aimAssist = module.GetComponent <AimAssist>();

            if (aimAssist != null)
            {
                if (!aimAssists.Contains(aimAssist))
                {
                    aimAssist.IndependentUpdate = aimAssistEnabled;
                    aimAssists.Add(aimAssist);
                }
            }

            // Look for gimbaled weapons
            GimbalController gimbalController = module.GetComponentInChildren <GimbalController>();

            if (gimbalController != null)
            {
                if (!gimbaledWeapons.Contains(gimbalController))
                {
                    gimbaledWeapons.Add(gimbalController);
                }
            }
        }
示例#3
0
    private void Create()
    {
        // Create root gameobject

        GameObject gameObject = new GameObject("Test");

        Selection.activeGameObject = gameObject;

        TargetLocker     targetLocker   = gameObject.AddComponent <TargetLocker>();
        SerializedObject targetLockerSO = new SerializedObject(targetLocker);

        targetLockerSO.Update();

        UnityEventTools.AddPersistentListener(targetLocker.onLocked, targetLocker.SetTarget);
    }
示例#4
0
        protected void OnModuleUnmounted(Module module)
        {
            TargetLeader targetLeader = module.GetComponent <TargetLeader>();

            if (targetLeader != null)
            {
                targetSelector.onSelectedTargetChanged.RemoveListener(targetLeader.SetTarget);
            }

            TargetLocker targetLocker = module.GetComponent <TargetLocker>();

            if (targetLocker != null)
            {
                targetSelector.onSelectedTargetChanged.RemoveListener(targetLocker.SetTarget);
            }
        }
示例#5
0
        // Called when a module is unmounted from one of the vehicle's module mounts.
        protected override void OnModuleUnmounted(Module module)
        {
            // Unlink target leading weapons
            TargetLeader targetLeader = module.GetComponent <TargetLeader>();

            if (targetLeader != null)
            {
                if (targetLeaders.Contains(targetLeader))
                {
                    targetLeader.SetTarget(null);
                    targetLeaders.Remove(targetLeader);

                    if (weaponsTargetSelector != null)
                    {
                        weaponsTargetSelector.onSelectedTargetChanged.RemoveListener(targetLeader.SetTarget);
                    }
                }
            }

            // Unlink target locking weapons
            TargetLocker targetLocker = module.GetComponent <TargetLocker>();

            if (targetLocker != null)
            {
                if (targetLockers.Contains(targetLocker))
                {
                    targetLocker.SetTarget(null);
                    targetLockers.Remove(targetLocker);

                    if (weaponsTargetSelector != null)
                    {
                        weaponsTargetSelector.onSelectedTargetChanged.RemoveListener(targetLocker.SetTarget);
                    }
                }
            }

            // Look for gimbaled weapons
            GimbalController gimbalController = module.GetComponentInChildren <GimbalController>();

            if (gimbalController != null)
            {
                if (gimbaledWeapons.Contains(gimbalController))
                {
                    gimbaledWeapons.Remove(gimbalController);
                }
            }
        }
示例#6
0
        // Called when a module is unmounted from one of the vehicle's module mounts.
        protected override void OnModuleUnmounted(Module module)
        {
            // Unlink target leading weapons
            TargetLeader targetLeader = module.GetComponent <TargetLeader>();

            if (targetLeader != null)
            {
                if (targetLeaders.Contains(targetLeader))
                {
                    targetLeaders.Remove(targetLeader);
                }
            }

            // Unlink target locking weapons
            TargetLocker targetLocker = module.GetComponent <TargetLocker>();

            if (targetLocker != null)
            {
                if (targetLockers.Contains(targetLocker))
                {
                    targetLockers.Remove(targetLocker);
                }
            }

            // Unlink target locking weapons
            AimAssist aimAssist = module.GetComponent <AimAssist>();

            if (aimAssist != null)
            {
                if (aimAssists.Contains(aimAssist))
                {
                    aimAssists.Remove(aimAssist);
                }
            }

            // Look for gimbaled weapons
            GimbalController gimbalController = module.GetComponentInChildren <GimbalController>();

            if (gimbalController != null)
            {
                if (gimbaledWeapons.Contains(gimbalController))
                {
                    gimbaledWeapons.Remove(gimbalController);
                }
            }
        }
示例#7
0
    private void Create()
    {
        // Create root gameobject

        GameObject gameObject = new GameObject("NewMissile");

        Selection.activeGameObject = gameObject;

        // Create 3D model

        if (missileModel != null)
        {
            GameObject meshObject = Instantiate(missileModel, gameObject.transform);
            meshObject.name = "Model";
            meshObject.transform.localPosition = Vector3.zero;
            meshObject.transform.localRotation = Quaternion.identity;
        }

        // Create the visual effects

        if (exhaustVisualEffects != null)
        {
            GameObject exhaustVisualEffectsObject = Instantiate(exhaustVisualEffects, gameObject.transform);
            exhaustVisualEffectsObject.name = "ExhaustVisualEffects";
            exhaustVisualEffectsObject.transform.localPosition = Vector3.zero;
            exhaustVisualEffectsObject.transform.localRotation = Quaternion.identity;
        }

        // ************************ AUDIO ***************************

        // Create an object to store the audio under
        GameObject audioObject = new GameObject("Audio");

        audioObject.transform.parent        = gameObject.transform;
        audioObject.transform.localPosition = Vector3.zero;
        audioObject.transform.localRotation = Quaternion.identity;

        // Create the launch audio

        if (launchAudioClip != null)
        {
            GameObject launchAudioObject = new GameObject("LaunchAudio");
            launchAudioObject.transform.parent        = audioObject.transform;
            launchAudioObject.transform.localPosition = Vector3.zero;
            launchAudioObject.transform.localRotation = Quaternion.identity;

            AudioSource launchAudioSource = launchAudioObject.AddComponent <AudioSource>();
            launchAudioSource.clip        = launchAudioClip;
            launchAudioSource.playOnAwake = true;
            launchAudioSource.loop        = false;
        }

        // Create the exhaust audio

        if (exhaustAudioClip != null)
        {
            GameObject exhaustAudioObject = new GameObject("ExhaustAudio");
            exhaustAudioObject.transform.parent        = audioObject.transform;
            exhaustAudioObject.transform.localPosition = Vector3.zero;
            exhaustAudioObject.transform.localRotation = Quaternion.identity;

            AudioSource exhaustAudioSource = exhaustAudioObject.AddComponent <AudioSource>();
            exhaustAudioSource.clip        = exhaustAudioClip;
            exhaustAudioSource.playOnAwake = true;
            exhaustAudioSource.loop        = true;
        }

        // ************************ Main Components ***************************

        // Add a rigidbody

        Rigidbody rBody = gameObject.AddComponent <Rigidbody>();

        rBody.useGravity = false;

        // Add the Missile component

        Missile          missile   = gameObject.AddComponent <Missile>();
        SerializedObject missileSO = new SerializedObject(missile);

        missileSO.Update();

        // Add a Target Locker

        TargetLocker     targetLocker   = gameObject.AddComponent <TargetLocker>();
        SerializedObject targetLockerSO = new SerializedObject(targetLocker);

        targetLockerSO.Update();

        targetLockerSO.FindProperty("lockingEnabled").boolValue = false;
        targetLockerSO.ApplyModifiedProperties();

        // Add a target leader

        TargetLeader     targetLeader   = gameObject.AddComponent <TargetLeader>();
        SerializedObject targetLeaderSO = new SerializedObject(targetLeader);

        targetLeaderSO.Update();

        // Add engines

        VehicleEngines3D engines   = gameObject.AddComponent <VehicleEngines3D>();
        SerializedObject enginesSO = new SerializedObject(engines);

        enginesSO.Update();

        // Add a guidance system

        GuidanceController guidanceController   = gameObject.AddComponent <GuidanceController>();
        SerializedObject   guidanceControllerSO = new SerializedObject(guidanceController);

        guidanceControllerSO.Update();

        // Update the guidance system settings
        guidanceControllerSO.FindProperty("engines").objectReferenceValue = engines;
        guidanceControllerSO.ApplyModifiedProperties();

        // Add a Detonator

        Detonator        detonator   = gameObject.AddComponent <Detonator>();
        SerializedObject detonatorSO = new SerializedObject(detonator);

        detonatorSO.Update();

        if (explosion != null)
        {
            detonatorSO.FindProperty("detonatingDuration").floatValue         = 2;
            detonatorSO.FindProperty("detonatingStateSpawnObjects").arraySize = 1;
            detonatorSO.FindProperty("detonatingStateSpawnObjects").GetArrayElementAtIndex(0).objectReferenceValue = explosion;
            detonatorSO.ApplyModifiedProperties();
        }

        UnityEventTools.AddBoolPersistentListener(detonator.onDetonating, engines.SetRigidbodyKinematic, true);
        UnityEventTools.AddBoolPersistentListener(detonator.onDetonated, gameObject.SetActive, false);
        UnityEventTools.AddBoolPersistentListener(detonator.onReset, engines.SetRigidbodyKinematic, false);

        // Add Health Modifier

        HealthModifier   healthModifier   = gameObject.AddComponent <HealthModifier>();
        SerializedObject healthModifierSO = new SerializedObject(healthModifier);

        healthModifierSO.Update();


        if (areaDamage)
        {
            // Add a damage receiver scanner for the area damage

            GameObject areaDamageScannerObject = new GameObject("AreaDamageScanner");
            areaDamageScannerObject.transform.parent        = gameObject.transform;
            areaDamageScannerObject.transform.localPosition = Vector3.zero;
            areaDamageScannerObject.transform.localRotation = Quaternion.identity;

            // Add a kinematic rigidbody

            Rigidbody areaDamageScannerRigidbody = areaDamageScannerObject.AddComponent <Rigidbody>();
            areaDamageScannerRigidbody.isKinematic = true;

            // Add a sphere trigger collider and set the radius

            SphereCollider areaDamageScannerCollider = areaDamageScannerObject.AddComponent <SphereCollider>();
            areaDamageScannerCollider.isTrigger = true;
            areaDamageScannerCollider.radius    = 20;

            // Add a damage receiver scanner

            DamageReceiverScanner areaDamageScanner   = areaDamageScannerObject.AddComponent <DamageReceiverScanner>();
            SerializedObject      areaDamageScannerSO = new SerializedObject(areaDamageScanner);
            areaDamageScannerSO.FindProperty("scannerTriggerCollider").objectReferenceValue = areaDamageScannerCollider;
            areaDamageScannerSO.ApplyModifiedProperties();

            healthModifierSO.FindProperty("areaDamageReceiverScanner").objectReferenceValue = areaDamageScanner;
            healthModifierSO.ApplyModifiedProperties();
        }

        // Add a collision scanner

        CollisionScanner collisionScanner   = gameObject.AddComponent <CollisionScanner>();
        SerializedObject collisionScannerSO = new SerializedObject(collisionScanner);

        collisionScannerSO.Update();

        // Collision scanner settings
        if (areaDamage)
        {
            UnityEventTools.AddPersistentListener(collisionScanner.onHitDetected, healthModifier.RaycastHitAreaDamage);
        }
        else
        {
            UnityEventTools.AddPersistentListener(collisionScanner.onHitDetected, healthModifier.RaycastHitDamage);
        }

        UnityEventTools.AddPersistentListener(collisionScanner.onHitDetected, detonator.Detonate);


        if (targetProximityDetonation)
        {
            // Add a target proximity trigger to the root transform

            TargetProximityTrigger targetProximityTrigger   = gameObject.AddComponent <TargetProximityTrigger>();
            SerializedObject       targetProximityTriggerSO = new SerializedObject(targetProximityTrigger);
            targetProximityTriggerSO.Update();


            // Create an object for the proximity scanner trigger collider

            GameObject proximityTriggerColliderObject = new GameObject("TargetProximityScanner");
            proximityTriggerColliderObject.transform.parent        = gameObject.transform;
            proximityTriggerColliderObject.transform.localPosition = Vector3.zero;
            proximityTriggerColliderObject.transform.localRotation = Quaternion.identity;

            // Add a kinematic rigidbody

            Rigidbody proximityTriggerColliderRigidbody = proximityTriggerColliderObject.AddComponent <Rigidbody>();
            proximityTriggerColliderRigidbody.isKinematic = true;

            // Add a sphere trigger collider and set the radius

            SphereCollider sphereCollider = proximityTriggerColliderObject.AddComponent <SphereCollider>();
            sphereCollider.isTrigger = true;
            sphereCollider.radius    = 20;

            // Add a damage receiver scanner

            DamageReceiverScanner damageReceiverScanner   = proximityTriggerColliderObject.AddComponent <DamageReceiverScanner>();
            SerializedObject      damageReceiverScannerSO = new SerializedObject(damageReceiverScanner);
            damageReceiverScannerSO.Update();

            // Link the collider to the damage receiver scanner

            damageReceiverScannerSO.FindProperty("scannerTriggerCollider").objectReferenceValue = sphereCollider;
            damageReceiverScannerSO.ApplyModifiedProperties();
            damageReceiverScannerSO.Update();

            // Link the scanner to the proximity trigger

            targetProximityTriggerSO.FindProperty("scanner").objectReferenceValue = damageReceiverScanner;
            targetProximityTriggerSO.ApplyModifiedProperties();
            targetProximityTriggerSO.Update();

            UnityEventTools.AddPersistentListener(targetProximityTrigger.onTriggered, healthModifier.EmitDamage);
            UnityEventTools.AddPersistentListener(targetProximityTrigger.onTriggered, detonator.Detonate);

            UnityEventTools.AddPersistentListener(targetLocker.onLocked, targetProximityTrigger.SetTarget);
        }

        // Update the target locker settings

        UnityEventTools.AddPersistentListener(targetLocker.onLocked, targetLeader.SetTarget);
        UnityEventTools.AddVoidPersistentListener(targetLocker.onNoLock, targetLeader.ClearTarget);
        UnityEventTools.AddFloatPersistentListener(targetLocker.onNoLock, detonator.BeginDelayedDetonation, 4);

        // Update the target leader settings
        UnityEventTools.AddPersistentListener(targetLeader.onLeadTargetPositionUpdated, guidanceController.SetTargetPosition);

        missileSO.FindProperty("targetLocker").objectReferenceValue = targetLocker;
        missileSO.ApplyModifiedProperties();
    }
 /// <summary>
 /// Called when a target locker is unloaded from the vehicle.
 /// </summary>
 /// <param name="targetLocker">The unloaded target locker.</param>
 public virtual void OnTargetLockerUnloaded(TargetLocker targetLocker)
 {
     targetLocker.onLocked.RemoveListener(delegate { PlayLockedAudio(); });
     targetLockers.Remove(targetLocker);
 }
 /// <summary>
 /// Called when a target locked is loaded on the vehicle.
 /// </summary>
 /// <param name="targetLocker">The loaded target locker.</param>
 public virtual void OnTargetLockerLoaded(TargetLocker targetLocker)
 {
     targetLocker.onLocked.AddListener(delegate { PlayLockedAudio(); });
     targetLockers.Add(targetLocker);
 }
示例#10
0
    private void Create()
    {
        // Create root gameobject

        GameObject gameObject = new GameObject("NewMissileWeapon");

        Selection.activeGameObject = gameObject;

        // Create 3D model

        if (missileWeaponModel != null)
        {
            GameObject meshObject = Instantiate(missileWeaponModel, gameObject.transform);
            meshObject.name = "Model";
            meshObject.transform.localPosition = Vector3.zero;
            meshObject.transform.localRotation = Quaternion.identity;
        }

        // Create spawn point

        GameObject spawnPointObject = new GameObject("MissileSpawnPoint");

        spawnPointObject.transform.parent = gameObject.transform;

        // Create and initialize necessary components

        Module           module   = gameObject.AddComponent <Module>();
        SerializedObject moduleSO = new SerializedObject(module);

        moduleSO.Update();

        MissileWeapon    missileWeapon   = gameObject.AddComponent <MissileWeapon>();
        SerializedObject missileWeaponSO = new SerializedObject(missileWeapon);

        missileWeaponSO.Update();

        TargetLocker     targetLocker   = gameObject.AddComponent <TargetLocker>();
        SerializedObject targetLockerSO = new SerializedObject(targetLocker);

        targetLockerSO.Update();

        Triggerable      triggerable   = gameObject.AddComponent <Triggerable>();
        SerializedObject triggerableSO = new SerializedObject(triggerable);

        triggerableSO.Update();

        Repeater         repeater   = gameObject.AddComponent <Repeater>();
        SerializedObject repeaterSO = new SerializedObject(repeater);

        repeaterSO.Update();

        ProjectileLauncher projectileLauncher   = gameObject.AddComponent <ProjectileLauncher>();
        SerializedObject   projectileLauncherSO = new SerializedObject(projectileLauncher);

        projectileLauncherSO.Update();

        // Link Unity Events

        UnityEventTools.AddPersistentListener(triggerable.onStartTriggering, repeater.StartTriggering);
        UnityEventTools.AddPersistentListener(triggerable.onStopTriggering, repeater.StopTriggering);
        UnityEventTools.AddPersistentListener(triggerable.onTriggerOnce, repeater.TriggerOnce);
        UnityEventTools.AddPersistentListener(repeater.OnAction, projectileLauncher.LaunchProjectile);

        // Update Module settings

        moduleSO.FindProperty("label").stringValue       = "HOMING MISSILE";
        moduleSO.FindProperty("description").stringValue = "Homing missile.";

        if (moduleType != null)
        {
            moduleSO.FindProperty("moduleType").objectReferenceValue = moduleType;
        }
        if (menuSprite != null)
        {
            moduleSO.FindProperty("menuSprite").objectReferenceValue = menuSprite;
        }

        moduleSO.ApplyModifiedProperties();
        moduleSO.Update();

        // Update projectile launcher settings

        projectileLauncherSO.FindProperty("spawnPoint").objectReferenceValue           = spawnPointObject;
        projectileLauncherSO.FindProperty("addLauncherVelocityToProjectile").boolValue = true;
        if (missilePrefab != null)
        {
            projectileLauncherSO.FindProperty("projectilePrefab").objectReferenceValue = missilePrefab.gameObject;
        }

        projectileLauncherSO.ApplyModifiedProperties();
        projectileLauncherSO.Update();

        // Update Missile Weapon settings

        missileWeaponSO.FindProperty("targetLocker").objectReferenceValue       = targetLocker;
        missileWeaponSO.FindProperty("triggerable").objectReferenceValue        = triggerable;
        missileWeaponSO.FindProperty("repeater").objectReferenceValue           = repeater;
        missileWeaponSO.FindProperty("projectileLauncher").objectReferenceValue = projectileLauncher;

        missileWeaponSO.ApplyModifiedProperties();
        missileWeaponSO.Update();
    }