Пример #1
0
    public override void CopyValues(ScrObjLibraryEntry other)
    {
        base.CopyValues(other);
        EnemyEntry ee = (EnemyEntry)other;

        // General
        enemyModelN = ee.enemyModelN;
        enemyModelS = ee.enemyModelS;
        maxhp       = ee.maxhp;
        speed       = ee.speed;

        // AI values
        waitStates = new List <StateController.WaitStates>();
        for (int i = 0; i < ee.waitStates.Count; i++)
        {
            waitStates.Add(ee.waitStates[i]);
        }
        waitTimeLimits = new RangedFloat(ee.waitTimeLimits.minValue, ee.waitTimeLimits.maxValue);
        chaseTimeLimit = ee.chaseTimeLimit;
        fleeDistance   = ee.fleeDistance;
        fleeTimeLimit  = ee.fleeTimeLimit;

        // Attacking
        meleeRange         = ee.meleeRange;
        attackRate         = ee.attackRate;
        attacks            = ee.attacks;
        meleeTimeStartup   = ee.meleeTimeStartup;
        meleeTimeAnimation = ee.meleeTimeAnimation;

        // Reward
        exp   = ee.exp;
        money = ee.money;
        //Add some kind of loot table
    }
Пример #2
0
    //Add some kind of loot table


    public override void ResetValues()
    {
        base.ResetValues();

        // General
        enemyModelN = null;
        enemyModelS = null;
        maxhp       = 1;
        speed       = new Vector2(0f, 0f);

        // AI values
        waitStates     = new List <WaitStates>();
        waitTimeLimits = new RangedFloat(3f, 5f);
        chaseTimeLimit = 30f;
        fleeDistance   = 3f;
        fleeTimeLimit  = 30f;

        // Attacking
        meleeRange       = 1f;
        attackRate       = 1f;
        attacks          = 1;
        meleeTimeStartup = 0.5f;

        //Sounds
        attackChargeSfx   = null;
        attackActivateSfx = null;
        attackImpactSfx   = null;

        // Reward
        exp   = 0;
        money = 0;
        //Add some kind of loot table
    }
 public CState_JumpMotor(float[] movementSpeed, RangedFloat applicationPeriod, float minDotValue = -1f)
 {
     Debug.Assert(movementSpeed.Length <= 4);
     this.movementSpeed     = movementSpeed;
     this.applicationPeriod = applicationPeriod;
     this.minDotValue       = minDotValue;
 }
Пример #4
0
        public void SetNewDesiredAngle(Transform transform, float rotation, RangedFloat desiredAngleDifference)
        {
            float diff = Random.Range(desiredAngleDifference.min, desiredAngleDifference.max);

            diff = Random.value > 0.5f ? diff : -diff;

            desiredAngle = rotation + diff;
        }
 public GameSetting()
 {
     PlayerView        = new RangedInt(1, 5, 3);
     PlayerSpeed       = new RangedInt(1, 9, 4);
     JumpForce         = new RangedFloat(0.5f, 5.0f, 0.5f);
     RotateSensitivity = new RangedFloat(0.2f, 5.0f, 1.0f);
     PickingDistance   = new RangedInt(12, 32, 16);
 }
Пример #6
0
 public void AddTransitionToAllStates(CharacterState target, RangedFloat transitionRange, bool bufferInput = true)
 {
     foreach (var it in states)
     {
         if (it != target)
         {
             it.AddTransition(target, transitionRange, bufferInput);
         }
     }
 }
        public void SetValue(RangedFloat FloatValue)
        {
            m_Slider.wholeNumbers = false;

            m_Slider.minValue = FloatValue.MinValue;
            m_Slider.maxValue = FloatValue.MaxValue;

            m_Slider.value     = FloatValue.Get();
            m_SliderValue.text = FloatValue.Get().ToString();
        }
Пример #8
0
    public CharacterState AddTransition(CharacterState target, RangedFloat transitionRange, bool bufferInput = true, StateTransition.CanEnter canEnter = null)
    {
        StateTransition transition = new StateTransition();

        transition.target          = target;
        transition.transitionRange = transitionRange;
        transition.bufferInput     = bufferInput;
        transition.canEnter        = canEnter;

        transitions.Add(transition);
        return(this);
    }
Пример #9
0
        public void SetDestination_Flee(FocusOwned focus, RangedFloat desiredDistance, float searchArea = 1.0f)
        {
            if (!focus.HasTarget())
            {
                destination = (Vector2)transform.position + Random.insideUnitCircle.normalized * desiredDistance.GetRandom() + Random.insideUnitCircle * searchArea;
                return;
            }

            Vector2 toTarget = -focus.ToTarget();

            destination = (Vector2)transform.position + toTarget.normalized * desiredDistance.GetRandom() + Random.insideUnitCircle * searchArea;
        }
Пример #10
0
        public Vector2 GetRotationInput(Transform transform, float rotation, RangedFloat desiredangleDifference, float rotationLerp = 0.1f)
        {
            if (tChangeDesiredAngle.IsReadyRestart())
            {
                SetNewDesiredAngle(transform, rotation, desiredangleDifference);
                tChangeDesiredAngle.cd = Random.Range(tChangeAngle.min, tChangeAngle.max);
            }

            angle = Mathf.LerpAngle(angle, desiredAngle, rotationLerp);
            Vector2 desiredRotationInput = Quaternion.Euler(0, 0, angle) * Vector2.up;

            return(desiredRotationInput);
        }
        static public void RangedSlider(ref float value, float range, string text, string tooltip, string saveHash, bool onlyPositive)
        {
            saveHash += text;

            Rect rect = EditorGUILayout.GetControlRect();

            rect.height = GUI.skin.horizontalSlider.CalcSize(new GUIContent(text)).y;

            RangedFloat r = null;

            if (EditorPrefs.HasKey(saveHash))
            {
                r           = new RangedFloat(value, range, onlyPositive);
                r.range.min = EditorPrefs.GetFloat(saveHash + "min");
                r.range.max = EditorPrefs.GetFloat(saveHash + "max");
                r.open      = EditorPrefs.GetBool(saveHash);
            }

            if (r == null || !r.range.InRange(value))
            {
                r      = new RangedFloat(value, range, onlyPositive);
                r.open = EditorPrefs.GetBool(saveHash, false);
            }

            Rect fold = rect;

            fold.width = 32;
            r.open     = EditorGUI.Foldout(fold, r.open, "");

            value = EditorGUI.Slider(rect, new GUIContent(text, tooltip), value, r.range.min, r.range.max);

            if (r.open)
            {
                EditorGUI.indentLevel++;
                RangeField(ref r.range, "Slider Range", "Customize this slider's range");
                EditorGUI.indentLevel--;

                value = r.range.Clamp(value);
            }

            if (onlyPositive && r.range.min < 0)
            {
                r.range.min = 0;
            }

            EditorPrefs.SetFloat(saveHash + "min", r.range.min);
            EditorPrefs.SetFloat(saveHash + "max", r.range.max);
            EditorPrefs.SetBool(saveHash, r.open);
        }
Пример #12
0
        public AnimationState AddTransition(AnimationState target, RangedFloat transitionRange, bool bufferInput = true, BoolMethod canEnter = null)
        {
            AnimationTransition transition = new AnimationTransition();

            transition.target          = target;
            transition.transitionRange = transitionRange;
            transition.bufferInput     = bufferInput;
            if (canEnter != null)
            {
                transition.canEnter = canEnter;
            }

            _transitions.Add(transition);
            return(this);
        }
 private void Reset()
 {
     SoundName           = DEFAULT_SOUND_NAME;
     IgnoreListenerPause = DEFAULT_IGNORE_LISTENER_PAUSE;
     Loop   = DEFAULT_LOOP;
     Volume = new RangedFloat {
         MinValue = DEFAULT_VOLUME, MaxValue = DEFAULT_VOLUME
     };
     Pitch = new RangedFloat {
         MinValue = DEFAULT_PITCH, MaxValue = DEFAULT_PITCH
     };
     SpatialBlend = DEFAULT_SPATIAL_BLEND;
     Mode         = DEFAULT_PLAY_MODE;
     ResetSequenceAfterInactiveTime = DEFAULT_RESET_SEQUENCE_AFTER_INACTIVE_TIME;
     SequenceResetTime = DEFAULT_SEQUENCE_RESET_TIME;
 }
Пример #14
0
    public AnimationState AddTransition(AnimationState target, RangedFloat transitionRange, bool bufferInput = true, Func <bool> canEnter = null)
    {
        AnimationTransition transition = new AnimationTransition
        {
            target          = target,
            transitionRange = transitionRange,
            bufferInput     = bufferInput
        };

        if (canEnter != null)
        {
            transition.canEnter = canEnter;
        }

        _transitions.Add(transition);
        return(this);
    }
Пример #15
0
 /// <summary>
 /// Value is in a RangedFloat, max-inclusive.
 /// </summary>
 public static bool InRangeInclusive(this float value, RangedFloat range) =>
 value.InRangeInclusive(range.Min, range.Max);
Пример #16
0
    public static void RotationToDirection(RigidbodyMovement movement, Vector2 direction, RangedFloat applicationPeriod, float rotationSpeed = 0.3f)
    {
        //Vector2 destination = Vector2.Lerp(inputHolder.directionInput, direction, trackFactor);

        //movement.atExternalRotation = false;
        //if (applicationPeriod.InRange(animationTime))
        //movement.ApplyExternalRotation(destination, rotationSpeed);
    }
Пример #17
0
 public static void Motor(Rigidbody2D rb, Vector2 movementSpeed, float animationTime, RangedFloat applicationPeriod)
 {
     if (applicationPeriod.InRange(animationTime))
     {
         Motor(rb, movementSpeed);
     }
 }
Пример #18
0
 public Vector2 StayInRange(RangedFloat range)
 {
     return(StayInRange(range.min, range.max));
 }
Пример #19
0
    public override void InitBehaviours(AiBehaviourController controller)
    {
        var stateMachine = controller.stateMachine;
        var inputHolder  = controller.GetComponentInParent <InputHolder>();
        var transform    = controller.transform;

        FocusPriority priorityFocus  = controller.focusPriority;
        AttentionMode enemyAttention = AiBehaviourPackUtility.GetAttentionEnemy(controller);

        var tExecute         = new Timer();
        var lookAroundMethod = new LookAround(new RangedFloat(0.5f, 0.8f), new RangedFloat(25, 50));

        // TODO if seeker is not defined create MoveToDestination instead
        var moveToDestination   = new MoveToDestinationNavigation(controller.GetComponent <Seeker>());
        var velocityAccumulator = new VelocityAccumulator(0.89f, 0.125f);

        var destination = controller.InitBlackboardValue <Vector2>("destination");


        ////////////////
        /// idle
        var lookAtTarget = enemyAttention.AddNewState(true)
                           .AddOnBegin(inputHolder.ResetInput)
                           .AddOnBegin(() => tExecute.RestartRandom(1f, 2f))
                           .AddOnUpdate(() => {
            velocityAccumulator.Update(transform, priorityFocus.currentFocus.GetTarget(), 0.01225f);
            inputHolder.rotationInput = velocityAccumulator.position - (Vector2)transform.position;


            inputHolder.directionInput = velocityAccumulator.position - (Vector2)transform.position;
        })
                           .AddShallReturn(() => tExecute.IsReady())
                           .SetUtility(() => 10)
        ;

        var lookAround = enemyAttention.AddNewState(true)
                         .AddOnBegin(() => lookAroundMethod.Begin(transform))
                         .AddOnBegin(inputHolder.ResetInput)
                         .AddOnBegin(() => tExecute.RestartRandom(0.6f, 1.5f))
                         .AddOnUpdate(() =>
        {
            velocityAccumulator.Update(transform, priorityFocus.currentFocus.GetTarget(), 0.01225f);
            Vector2 targetPosition    = velocityAccumulator.position - (Vector2)transform.position;
            float angle               = Vector2.SignedAngle(Vector2.up, targetPosition);
            inputHolder.rotationInput = lookAroundMethod.GetRotationInput(transform, angle, 0.1f);


            inputHolder.directionInput = velocityAccumulator.position - (Vector2)transform.position;
        })
                         .AddShallReturn(() => tExecute.IsReady() || priorityFocus.currentFocus.GetTarget().velocity.sqrMagnitude > 20)
                         .SetUtility(() => 15f - 0.225f * priorityFocus.currentFocus.GetTarget().velocity.sqrMagnitude)
        ;

        RangedFloat desiredDistance = new RangedFloat(8.5f, 15.5f);
        float       margin          = 3.0f;
        var         moveTo          = enemyAttention.AddNewState(true)
                                      .AddOnBegin(() => moveToDestination.SetDestination(velocityAccumulator.position))
                                      .AddOnBegin(() => inputHolder.ResetInput(false, true, true, true))
                                      .AddOnBegin(() => tExecute.RestartRandom(0.25f, 0.5f))
                                      .AddOnUpdate(() =>
        {
            velocityAccumulator.Update(transform, priorityFocus.currentFocus.GetTarget(), 0.01225f);
            Vector2 currentTargetPosition = velocityAccumulator.position;
            moveToDestination.RepathAsNeeded(currentTargetPosition, 3.0f);

            Vector2 toDestination      = moveToDestination.ToDestination(5, 0.5f);
            inputHolder.positionInput  = Vector2.Lerp(inputHolder.positionInput, toDestination, 0.1f);
            inputHolder.directionInput = velocityAccumulator.position - (Vector2)transform.position;
        })
                                      .AddCanEnter(() => enemyAttention.focus.IsFurther(desiredDistance.max))
                                      .AddShallReturn(tExecute.IsReady)
                                      .AddShallReturn(() => enemyAttention.focus.IsCloser(desiredDistance.min + margin))
                                      .AddShallReturn(() => moveToDestination.finished)
                                      .SetUtility(5000f)
        ;

        var moveAway = enemyAttention.AddNewState(true)
                       .AddOnBegin(() => moveToDestination.SetDestination(priorityFocus.GetAwayFromTargetPosition(desiredDistance.max - margin)))
                       .AddOnBegin(() => inputHolder.ResetInput(false, true, true, true))
                       .AddOnBegin(() => tExecute.RestartRandom(0.25f, 0.5f))
                       .AddOnUpdate(() =>
        {
            velocityAccumulator.Update(transform, priorityFocus.currentFocus.GetTarget(), 0.01225f);
            Vector2 currentTargetPosition = velocityAccumulator.position;

            Vector2 toDestination      = moveToDestination.ToDestination(5, 0.5f);
            inputHolder.positionInput  = Vector2.Lerp(inputHolder.positionInput, toDestination, 0.1f);
            inputHolder.directionInput = velocityAccumulator.position - (Vector2)transform.position;
        })
                       .AddCanEnter(() => enemyAttention.focus.IsCloser(desiredDistance.min))
                       .AddShallReturn(tExecute.IsReady)
                       .AddShallReturn(() => enemyAttention.focus.IsFurther(desiredDistance.max - margin))
                       .AddShallReturn(() => moveToDestination.finished)
                       .SetUtility(5000f)
        ;

        /// ideas:
        ///     looks a little bit to sides sometimes
        ///     tries to keep certain distance from enemy

        /*/// lookAround
         * var lookAround = enemyAttention.AddNewState(true)
         *  .AddOnBegin(() => lookAroundMethod.Begin(transform))
         *  .AddOnBegin(inputHolder.ResetInput)
         *  .AddOnBegin(() => tExecute.RestartRandom(0.25f, 0.4f))
         *  .AddOnUpdate(() =>
         *  {
         *      inputHolder.rotationInput = lookAroundMethod.GetRotationInput(transform);
         *  })
         *  .AddShallReturn(() => tExecute.IsReady())
         *  .SetUtility(6)
         * ;
         *
         * /// randomMovement
         * var randomMovement = enemyAttention.AddNewState(true)
         *  .AddOnBegin(() => moveToDestination.SetDestination_Search(priorityFocus, 20))
         *  .AddOnBegin(inputHolder.ResetInput)
         *  .AddOnBegin(() => tExecute.RestartRandom(0.75f, 1.5f))
         *  .AddOnUpdate(() =>
         *  {
         *      inputHolder.positionInput = moveToDestination.ToDestination();
         *      //inputHolder.positionInput = Vector2.Lerp(inputHolder.positionInput, moveToDestination.ToDestination(), 0.985f );
         *  })
         *  .AddShallReturn(() =>  tExecute.IsReady())
         *  .SetUtility(2f)
         *  ;*/
    }
Пример #20
0
 public CState_JumpMotor(float movementSpeed, RangedFloat applicationPeriod, float minDotValue = -1f)
 {
     this.movementSpeed     = new float[] { movementSpeed, movementSpeed, movementSpeed, movementSpeed };
     this.applicationPeriod = applicationPeriod;
     this.minDotValue       = minDotValue;
 }
 public HidAccessPropertyRangedSingle()
 {
     RangedValue = new RangedFloat();
     RangedValue.ValueChanged += (sender, e) => { OnValueChanged(e); };
 }
Пример #22
0
 public Vector2 GetRotationInput(Transform transform, RangedFloat desiredAngleDifference, float rotationLerp = 0.1f)
 {
     return(GetRotationInput(transform, transform.eulerAngles.z, desiredAngleDifference, rotationLerp));
 }
Пример #23
0
 public CState_RotationToDirection(RangedFloat applicationPeriod, float lerpScale = 0.3f, float trackFactor = 1f)
 {
     this.rotationSpeed     = lerpScale;
     this.trackFactor       = trackFactor;
     this.applicationPeriod = applicationPeriod;
 }
Пример #24
0
 public LookAround(RangedFloat tChangeAngle, RangedFloat desiredAngleDifference)
 {
     this.tChangeAngle           = tChangeAngle;
     this.desiredAngleDifference = desiredAngleDifference;
 }
Пример #25
0
 public Slider(RangedFloat property)
     : this(property, property.Min, property.Max)
 {
     property.Changed += SetFromValue;
 }
Пример #26
0
 public LookAround(RangedFloat tChangeAngle)
 {
     this.tChangeAngle = tChangeAngle;
 }
Пример #27
0
 public CState_Motor(Vector2 movementSpeed, RangedFloat applicationPeriod)
 {
     this.movementSpeed     = movementSpeed;
     this.applicationPeriod = applicationPeriod;
 }
Пример #28
0
 public void RestartRandom(RangedFloat cdRange)
 {
     actualTime = Time.time;
     cd         = UnityEngine.Random.Range(cdRange.min, cdRange.max);
 }
Пример #29
0
 private void Start()
 {
     animInfo       = new AnimationInformation();
     waitTimeLimits = new RangedFloat(3f, 5f);
     moveSpeed      = npcMoveSpeed.value;
 }
Пример #30
0
 public static float Range(this Random r, RangedFloat rFloat)
 {
     return(Random.Range(rFloat.minValue, rFloat.maxValue));
 }
Пример #31
0
 public void AddTransitionToAllStates(CharacterState target, ExceptionCondition exceptionCondition, RangedFloat transitionRange, AnimationTransitionData transitionData, bool bufferInput = true)
 {
     foreach (var it in states)
     {
         if (it != target && !exceptionCondition(it))
         {
             it.AddTransition(target, transitionRange, transitionData, bufferInput);
         }
     }
 }