/// <inheritdoc/> public override void StartEditing(TriggerEditPanel triggerPanel, ScenarioTrigger trigger, TriggerEffector effector) { parentPanel = triggerPanel; editedEffector = (WaitForDistanceEffector)effector; maxDistanceInputField.text = editedEffector.MaxDistance.ToString("F"); }
/// <inheritdoc/> public override IEnumerator Apply(PlaybackPanel playbackPanel, TriggerEffector triggerEffector, ITriggerAgent triggerAgent) { if (!(triggerEffector is WaitingPointEffector waitingPointEffector)) { ScenarioManager.Instance.logPanel.EnqueueError( $"Invalid trigger effector passed to the {GetType().Name}."); yield break; } var egos = ScenarioManager.Instance.GetExtension <ScenarioAgentsManager>().Agents .Where(a => a.Source.AgentType == AgentType.Ego).ToArray(); //Make parent npc wait until any ego is closer than the max distance var lowestDistance = float.PositiveInfinity; do { foreach (var ego in egos) { var distance = Vector3.Distance(waitingPointEffector.ActivatorPoint, ego.TransformForPlayback.position); if (distance < lowestDistance) { lowestDistance = distance; } } yield return(null); } while (lowestDistance > waitingPointEffector.PointRadius); }
/// <inheritdoc/> public override IEnumerator Apply(PlaybackPanel playbackPanel, TriggerEffector triggerEffector, ITriggerAgent triggerAgent) { if (!(triggerEffector is TimeToCollisionEffector ttcEffector)) { ScenarioManager.Instance.logPanel.EnqueueError( $"Invalid trigger effector passed to the {GetType().Name}."); yield break; } var egos = ScenarioManager.Instance.GetExtension <ScenarioAgentsManager>().Agents .Where(a => a.Source.AgentType == AgentType.Ego); ScenarioAgent collisionEgo = null; var lowestTTC = TimeToCollisionEffector.TimeToCollisionLimit; foreach (var ego in egos) { var ttc = ttcEffector.CalculateTTC(ego, triggerAgent, triggerAgent.MovementSpeed); if (ttc >= lowestTTC || ttc < 0.0f) { continue; } lowestTTC = ttc; collisionEgo = ego; } yield return(playbackPanel.StartCoroutine(ttcEffector.Apply(lowestTTC, collisionEgo, triggerAgent))); }
/// <summary> /// Method called when the effector is removed from the selected trigger /// </summary> /// <param name="effector">Effector that was removed from the selected trigger</param> private void TriggerOnEffectorRemoved(TriggerEffector effector) { if (this == null) { return; } if (visiblePanels.TryGetValue(effector, out var panel)) { panel.EffectorRemovedFromTrigger(selectedTrigger, effector); panel.FinishEditing(); if (panel.gameObject != null) { prefabsPools.ReturnInstance(panel.gameObject); } visiblePanels.Remove(effector); } UnityUtilities.LayoutRebuild(transform as RectTransform); if (!availableEffectorTypes.Contains(effector)) { availableEffectorTypes.Add(effector); effectorSelectDropdown.options.Add(new Dropdown.OptionData(effector.TypeName)); effectorSelectDropdown.RefreshShownValue(); } }
/// <summary> /// Removes selected effector from the trigger and returns it to the pool /// </summary> public void RemoveEffector(TriggerEffector effector) { selectedTrigger.Trigger.RemoveEffector(effector); ScenarioManager.Instance.IsScenarioDirty = true; ScenarioManager.Instance.GetExtension <ScenarioUndoManager>() .RegisterRecord(new UndoRemoveEffector(selectedTrigger, effector)); }
/// <inheritdoc/> public override IEnumerator Apply(PlaybackPanel playbackPanel, TriggerEffector triggerEffector, ITriggerAgent triggerAgent) { ScenarioManager.Instance.logPanel.EnqueueInfo( $"{OverriddenEffectorType.Name} is omitted in the playback mode."); yield break; }
/// <summary> /// Removes the effector object from the trigger /// </summary> /// <param name="effector">Effector that uses this object</param> /// <param name="objectName">Effector object name</param> public void RemoveEffectorObject(TriggerEffector effector, string objectName) { if (!effectorsObjects.TryGetValue(effector.TypeName, out var scenarioEffector)) { return; } scenarioEffector.RemoveEffectorObject(objectName); }
/// <inheritdoc/> public override void StartEditing(TriggerEditPanel triggerPanel, ScenarioTrigger trigger, TriggerEffector effector) { parentPanel = triggerPanel; editedTrigger = trigger; editedEffector = (WaitingPointEffector)effector; radiusInputField.text = editedEffector.PointRadius.ToString("F"); }
/// <inheritdoc/> public override void InitializeEffector(ScenarioTrigger trigger, TriggerEffector effector) { if (!(effector is WaitTimeEffector waitTimeEffector)) { throw new ArgumentException($"{GetType().Name} received effector of invalid type {effector.GetType().Name}."); } waitTimeEffector.Value = 0.0f; }
/// <summary> /// Initialization of the effector /// </summary> /// <param name="parent">Parent trigger that contains this effector</param> public void Initialize(ScenarioTrigger parent, TriggerEffector effector) { parentTrigger = parent; this.effector = effector; gameObject = new GameObject(effector.TypeName); gameObject.transform.SetParent(parentTrigger.transform); gameObject.transform.localScale = Vector3.one; gameObject.transform.localRotation = Quaternion.Euler(Vector3.zero); gameObject.transform.localPosition = Vector3.zero; }
/// <summary> /// Method invoked when the effector is removed to the trigger /// </summary> /// <param name="effector">Removed effector</param> private void OnEffectorRemoved(TriggerEffector effector) { effectorsObjects.TryGetValue(effector.TypeName, out var scenarioEffector); if (scenarioEffector == null) { return; } scenarioEffector.Deinitialize(); effectorsObjects.Remove(effector.TypeName); }
/// <summary> /// Method invoked when the effector is added to the trigger /// </summary> /// <param name="effector">Added effector</param> private void OnEffectorAdded(TriggerEffector effector) { if (effectorsObjects.ContainsKey(effector.TypeName)) { return; } var scenarioEffector = new ScenarioEffector(); scenarioEffector.Initialize(this, effector); effectorsObjects.Add(effector.TypeName, scenarioEffector); }
/// <inheritdoc/> public override void Setup(ScenarioTrigger trigger, TriggerEffector effector) { base.Setup(trigger, effector); waitingPointEffector = effector as WaitingPointEffector; if (waitingPointEffector == null) { throw new ArgumentException( $"{GetType().Name} received effector of invalid type {effector.GetType().Name}."); } Refresh(); }
/// <inheritdoc/> public override void InitializeEffector(ScenarioTrigger trigger, TriggerEffector effector) { if (!(effector is ControlTriggerEffector triggerEffector)) { throw new ArgumentException( $"{GetType().Name} received effector of invalid type {effector.GetType().Name}."); } triggerEffector.ControllablesUIDs.Clear(); triggerEffector.ControlPolicy = new List <ControlAction>(); policyEditPanel.Setup(null, triggerEffector.ControlPolicy); }
/// <summary> /// Initializes new prefab for the effector edit panel /// </summary> /// <param name="customEffectorPanels">Custom effector panels that will be used instead of default ones</param> /// <param name="effector">Effector for which panel will be added</param> /// <returns>Effectors panel that will be used for editing the effector</returns> private void InitializeEffectorPanel(Dictionary <Type, EffectorEditPanel> customEffectorPanels, TriggerEffector effector) { var panelPrefab = defaultEffectorEditPanel.GetComponent <EffectorEditPanel>(); if (customEffectorPanels.TryGetValue(effector.GetType(), out var editPanel)) { panelPrefab = editPanel.GetComponent <EffectorEditPanel>(); } effectorPanelsPrefabs.Add(effector.TypeName, panelPrefab); }
/// <inheritdoc/> public override void InitializeEffector(ScenarioTrigger trigger, TriggerEffector effector) { if (!(effector is WaitingPointEffector waitingPointEffector)) { throw new ArgumentException( $"{GetType().Name} received effector of invalid type {effector.GetType().Name}."); } //Put the activator point nearby the trigger waitingPointEffector.ActivatorPoint = trigger.transform.position + zoneVisualization.transform.localPosition; waitingPointEffector.PointRadius = 2.0f; }
/// <inheritdoc/> public override void StartEditing(TriggerEditPanel triggerPanel, ScenarioTrigger trigger, TriggerEffector effector) { parentPanel = triggerPanel; editedEffector = (ControlTriggerEffector)effector; policyEditPanel.PolicyUpdated += PolicyEditPanelOnPolicyUpdated; editedTrigger = trigger; editedTrigger.Moved += OnTriggerMoved; var manager = ScenarioManager.Instance.GetExtension <ScenarioControllablesManager>(); //Link to scenario controllables for (var i = 0; i < editedEffector.ControllablesUIDs.Count; i++) { var controllableUID = editedEffector.ControllablesUIDs[i]; var controllableAdded = false; for (var index = 0; index < manager.Controllables.Count; index++) { var controllable = manager.Controllables[index]; if (controllable.Uid != controllableUID) { continue; } linkedControllables.Add(controllable); controllableAdded = true; break; } if (!controllableAdded) { ScenarioManager.Instance.logPanel.EnqueueWarning( $"Could not find controllable with uid: {controllableUID} in the scenario, which edited {nameof(ControlTriggerEffector)} was using."); } } //Setup LineRenderer lineRenderer.positionCount = linkedControllables.Count + 1; lineRenderer.SetPosition(0, trigger.transform.position + LineRendererPositionOffset); for (var i = 0; i < linkedControllables.Count; i++) { var controllable = linkedControllables[i]; lineRenderer.SetPosition(i + 1, controllable.transform.position + LineRendererPositionOffset); } policyEditPanel.Setup(linkedControllables.Count > 0 ? linkedControllables[0].Variant.controllable : null, editedEffector.ControlPolicy); }
/// <summary> /// Method called when the effector is added to the selected trigger /// </summary> /// <param name="effector">Effector that was added to the selected trigger</param> private void TriggerOnEffectorAdded(TriggerEffector effector) { var effectorPanel = prefabsPools.GetInstance(effectorPanelsPrefabs[effector.TypeName].gameObject) .GetComponent <EffectorEditPanel>(); if (!effectorPanel.AllowMany) { availableEffectorTypes.RemoveAt(effectorSelectDropdown.value); effectorSelectDropdown.options.RemoveAt(effectorSelectDropdown.value); effectorSelectDropdown.SetValueWithoutNotify(0); effectorSelectDropdown.RefreshShownValue(); } effectorPanel.StartEditing(this, selectedTrigger, effector); effectorPanel.EffectorAddedToTrigger(selectedTrigger, effector); effectorPanel.transform.SetParent(transform); effectorPanel.gameObject.SetActive(true); visiblePanels.Add(effector, effectorPanel); UnityUtilities.LayoutRebuild(effectorPanel.transform as RectTransform); }
/// <inheritdoc/> public override void EffectorAddedToTrigger(ScenarioTrigger trigger, TriggerEffector effector) { if (!(effector is WaitingPointEffector waitingPointEffector)) { throw new ArgumentException( $"{GetType().Name} received effector of invalid type {effector.GetType().Name}."); } var zone = trigger.GetEffectorObject(effector, zoneVisualization.name); if (zone != null) { return; } zone = trigger.AddEffectorObject(effector, zoneVisualization.name, zoneVisualization); zone.transform.position = waitingPointEffector.ActivatorPoint; zone.transform.localScale = Vector3.one * waitingPointEffector.PointRadius; zone.gameObject.SetActive(true); var zoneComponent = zone.GetComponent <WaitingPointZone>(); zoneComponent.Refresh(); }
/// <summary> /// Notifies edit panel that the effector was removed from the trigger /// </summary> /// <param name="trigger">Trigger that lost the effector</param> /// <param name="effector">Effector removed from the trigger</param> public virtual void EffectorRemovedFromTrigger(ScenarioTrigger trigger, TriggerEffector effector) { }
/// <summary> /// Notifies edit panel that the effector was added to the trigger /// </summary> /// <param name="trigger">Trigger that gained the new effector</param> /// <param name="effector">New effector added to the trigger</param> public virtual void EffectorAddedToTrigger(ScenarioTrigger trigger, TriggerEffector effector) { }
/// <summary> /// Initializes effector with the default data /// </summary> /// <param name="trigger">Trigger that gained the new effector</param> /// <param name="effector">New effector added to the trigger</param> public abstract void InitializeEffector(ScenarioTrigger trigger, TriggerEffector effector);
/// <summary> /// Setups the zone object with the data /// </summary> /// <param name="trigger">Parent trigger of this zone</param> /// <param name="effector">Parent effector of this zone</param> public virtual void Setup(ScenarioTrigger trigger, TriggerEffector effector) { this.trigger = trigger; this.effector = effector; }
/// <summary> /// Constructor /// </summary> /// <param name="trigger">Scenario trigger from which effector was removed</param> /// <param name="effector">Effector that was removed from the trigger</param> public UndoRemoveEffector(ScenarioTrigger trigger, TriggerEffector effector) { this.trigger = trigger; this.effector = effector; trigger.TryGetEffector(effector)?.Hide(); }
/// <summary> /// Overridden apply method for the playback mode /// </summary> /// <param name="playbackPanel">Playback panel that will run coroutines</param> /// <param name="triggerEffector">Trigger effector that was overridden by this script</param> /// <param name="triggerAgent">Trigger agent affected by the effector</param> /// <returns>Coroutine IEnumerator</returns> public abstract IEnumerator Apply(PlaybackPanel playbackPanel, TriggerEffector triggerEffector, ITriggerAgent triggerAgent);
/// <inheritdoc/> public override void InitializeEffector(ScenarioTrigger trigger, TriggerEffector effector) { }
/// <inheritdoc/> public override void StartEditing(TriggerEditPanel triggerPanel, ScenarioTrigger trigger, TriggerEffector effector) { parentPanel = triggerPanel; editedTrigger = effector; }
/// <summary> /// Tries to get the scenario effector data /// </summary> /// <param name="effector">Effector for which data is requested</param> /// <returns>Scenario effector data, null if it is not available</returns> public ScenarioEffector TryGetEffector(TriggerEffector effector) { effectorsObjects.TryGetValue(effector.TypeName, out var scenarioEffector); return(scenarioEffector); }
/// <summary> /// Initializes panel for editing the selected effector /// </summary> /// <param name="triggerPanel">Parent trigger panel</param> /// <param name="trigger">Trigger being edited</param> /// <param name="effector">Trigger effector being edited</param> public abstract void StartEditing(TriggerEditPanel triggerPanel, ScenarioTrigger trigger, TriggerEffector effector);
/// <inheritdoc/> public override void StartEditing(TriggerEditPanel triggerPanel, ScenarioTrigger trigger, TriggerEffector effector) { parentPanel = triggerPanel; editedEffector = (WaitTimeEffector)effector; valueInputField.text = editedEffector.Value.ToString("F"); }