// 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); } } }
// 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); } } }
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); } }
// 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); } } }
// 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); } } }
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(); }