示例#1
0
 /// <inheritdoc/>
 public override void StartEditing(TriggerEditPanel triggerPanel, ScenarioTrigger trigger,
                                   TriggerEffector effector)
 {
     parentPanel                = triggerPanel;
     editedEffector             = (WaitForDistanceEffector)effector;
     maxDistanceInputField.text = editedEffector.MaxDistance.ToString("F");
 }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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)));
        }
示例#4
0
        /// <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();
            }
        }
示例#5
0
 /// <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));
 }
示例#6
0
 /// <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;
 }
示例#7
0
 /// <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);
 }
示例#8
0
 /// <inheritdoc/>
 public override void StartEditing(TriggerEditPanel triggerPanel, ScenarioTrigger trigger,
                                   TriggerEffector effector)
 {
     parentPanel           = triggerPanel;
     editedTrigger         = trigger;
     editedEffector        = (WaitingPointEffector)effector;
     radiusInputField.text = editedEffector.PointRadius.ToString("F");
 }
示例#9
0
 /// <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;
 }
示例#10
0
 /// <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;
 }
示例#11
0
 /// <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);
 }
示例#12
0
        /// <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);
        }
示例#13
0
 /// <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);
 }
示例#15
0
        /// <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);
        }
示例#16
0
 /// <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);
        }
示例#18
0
        /// <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);
        }
示例#19
0
        /// <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);
示例#23
0
 /// <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;
 }
示例#24
0
 /// <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();
 }
示例#25
0
 /// <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;
 }
示例#28
0
 /// <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);
示例#30
0
 /// <inheritdoc/>
 public override void StartEditing(TriggerEditPanel triggerPanel, ScenarioTrigger trigger, TriggerEffector effector)
 {
     parentPanel          = triggerPanel;
     editedEffector       = (WaitTimeEffector)effector;
     valueInputField.text = editedEffector.Value.ToString("F");
 }