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