示例#1
0
    public override void GetAction()
    {
        //Enable
        fear.SetSteering(separation.GetSteering(), separation.weight, separation.priority);
        separation.pushed = true;
        fear.maxSpeed     = initialSpeed * 2;
        //Enable text mesh renderer
        message.transform.position = new Vector3(invocant.transform.position.x, invocant.transform.position.y + 15f, invocant.transform.position.z);
        message.GetComponent <Renderer>().enabled = true;

        //Activate separation for 2 seconds
        if (changeCreationTime)
        {
            creationTime       = System.DateTime.Now;
            changeCreationTime = false;
        }
        DateTime currentTime = System.DateTime.Now;

        if (Mathf.Abs((float)((currentTime - creationTime).TotalSeconds)) > pushTime)
        {
            //Disable
            fear.maxSpeed = initialSpeed;
            message.GetComponent <Renderer>().enabled = false;
            changeCreationTime = true;
            return;
        }
    }
示例#2
0
文件: Flocking.cs 项目: fylux/GameAI
    //OJO! En el steering que sea que vaya a llamar de forma estática a esta función, se deberán ejecutar las dos siguientes lineas
    //   wanderOrientation += Flocking.UpdateWanderOrientation(wanderOrientation, wanderRate)
    //   wanderForce = Wander.GetSteering(npc, wanderForce, wanderCooldown, wanderRate, wanderOrientation, wanderCircleOffset, wanderCircleRadius, maxAccel, timeToTarget, visibleRays)
    //  Es por eso que trabajar con flocking de manera estática está desaconsejado
    public static Steering GetSteering(Agent npc, float groupArea, float decayCoefficient, float maxAccel, bool visibleRays, float timeToTarget, float wanderCooldown, float wanderRate, float wanderOrientation, float wanderCircleOffset, float wanderCircleRadius, Steering wanderForce, float cohesionPriority, float separationPriority, float alignmentPriority, float wanderPriority)
    {
        Steering steering = new Steering();

        steering.linear += Separation.GetSteering(npc, groupArea, decayCoefficient, maxAccel, visibleRays).linear *separationPriority;
        steering.linear += Cohesion.GetSteering(npc, groupArea, decayCoefficient, maxAccel, visibleRays).linear *cohesionPriority;
        steering.angular = Alignment.GetSteering(npc, groupArea, npc.interiorAngle, npc.exteriorAngle, timeToTarget, false).angular *alignmentPriority;
        steering        += Steering.ApplyPriority(wanderForce, wanderPriority);
        return(steering);
    }
示例#3
0
    public static Steering GetSteering(Agent target, Agent npc, Vector3 behind, float slowingRadius, float maxAccel, float threshold, float decayCoefficient, bool visibleRays, float arrivePriority, float separationPriority, float evadePriority)
    {
        Steering steering = new Steering();

        steering.linear += Arrive.GetSteering(behind, npc, slowingRadius, maxAccel).linear *arrivePriority;
        steering.linear += Separation.GetSteering(npc, threshold, decayCoefficient, maxAccel, visibleRays).linear *separationPriority;
        if (OnLeaderSight(target, npc))
        {
            steering.linear += Evade.GetSteering(target, npc, maxAccel, Vector3.Distance(target.position, npc.position) * maxAccel, true).linear *evadePriority;
        }

        return(steering);
    }
示例#4
0
    void LateUpdate()
    {
        Vector3 targetPos;
        // 偏移追随加速度  和  分隔加速度
        Vector3 offsetAccel = offsetPursuit.getSteering(target, offset, out targetPos);
        Vector3 sepAccel    = separation.GetSteering(sensor.targets);

        // 速度会  受到两个方面的影响
        steeringBasics.Steer(offsetAccel + sepAccel);

        /* 如果我们还在前往,那就要朝向我们要去的地方,其他的方向和我们的形成目标是一样的 */
        if (Vector3.Distance(transform.position, targetPos) > groupLookDist)
        {
            steeringBasics.LookWhereYoureGoing();
        }
        else
        {
            steeringBasics.lookAtDirection(target.rotation);
        }
    }
示例#5
0
    // Update is called once per frame
    void Update()
    {
        Vector3 accel = Vector3.zero;

        // 集群加速度
        accel += cohesion.GetSteering(sensor.targets) * cohesionWeight;
        // 分隔加速度
        accel += separation.GetSteering(sensor.targets) * separationWeight;
        // 速度匹配加速度
        accel += velocityMatch.GetSteering(sensor.targets) * velocityMatchWeight;

        // 如果没有那些 影响, 就漫游好了
        if (accel.magnitude < 0.005f)
        {
            accel = wander.GetSteering();
        }

        // 设置刚体速度  和  朝向
        steeringBasics.Steer(accel);
        steeringBasics.LookWhereYoureGoing();
    }
    // Update is called once per frame
    void Update()
    {
        if (float.IsNaN(angularVel))
        {
            angularVel = 0.0f;
        }

        SteeringOutput moving  = new SteeringOutput();
        SteeringOutput turning = new SteeringOutput();

        seeking.character = this;
        seeking.target    = aiTarget;

        SteeringOutput movement = new SteeringOutput();

        switch (movementType)
        {
        case "Seek":
            moving = seeking.GetSteering();

            if (moving == null)
            {
                movement.linear = Vector3.zero;
            }
            else
            {
                movement.linear  = moving.linear;
                movement.angular = turning.angular;
            }

            break;

        case "Flee":
            flee = true;

            moving = seeking.GetSteering();

            if (moving == null)
            {
                movement.linear = Vector3.zero;
            }
            else
            {
                movement.linear  = moving.linear;
                movement.angular = turning.angular;
            }

            break;

        case "Arrive":
            moving = arrive.GetSteering();

            if (moving == null)
            {
                movement.linear = Vector3.zero;
            }
            else
            {
                movement.linear  = moving.linear;
                movement.angular = turning.angular;
            }

            break;

        case "Face":

            facing.target    = aiTarget;
            facing.character = this;

            //moving = seeking.GetSteering();
            turning = facing.GetSteering();

            movement.linear  = Vector3.zero;
            movement.angular = turning.angular;

            break;

        case "Seek Align":

            aligned.character = this;
            aligned.target    = aiTarget;

            moving  = seeking.GetSteering();
            turning = aligned.GetSteering();

            movement.linear  = moving.linear;
            movement.angular = turning.angular;

            break;

        case "Seek Face":
            facing.character = this;
            facing.target    = aiTarget;

            moving  = seeking.GetSteering();
            turning = facing.GetSteering();

            if (moving == null)
            {
                movement.linear = Vector3.zero;
            }
            else
            {
                movement.linear  = moving.linear;
                movement.angular = turning.angular;
            }

            break;

        case "Seek Look":

            looky.character = this;
            looky.target    = aiTarget;

            //Debug.Log(looky.GetSteering());
            if (looky.GetSteering() == null)
            {
                moving           = seeking.GetSteering();
                movement.linear  = moving.linear;
                movement.angular = 0;
            }
            else
            {
                moving  = seeking.GetSteering();
                turning = looky.GetSteering();

                //Debug.Log(looky.GetSteering());

                movement.linear  = moving.linear;
                movement.angular = turning.angular;
            }

            break;

        case "Arrive Align":

            aligned.character = this;
            aligned.target    = aiTarget;


            moving  = arrive.GetSteering();
            turning = aligned.GetSteering();

            if (moving == null)
            {
                movement.linear = Vector3.zero;
            }
            else
            {
                movement.linear  = moving.linear;
                movement.angular = turning.angular;
            }

            break;

        case "Arrive Face":

            facing.character = this;
            facing.target    = aiTarget;

            moving  = arrive.GetSteering();
            turning = facing.GetSteering();

            movement.linear  = moving.linear;
            movement.angular = turning.angular;

            break;

        case "Arrive Look":

            looky.character = this;
            //looky.target = aiTarget;

            arrive.character = this;
            arrive.target    = aiTarget;

            moving  = arrive.GetSteering();
            turning = looky.GetSteering();

            movement.linear  = moving.linear;
            movement.angular = turning.angular;

            Debug.Log(movement.angular);

            break;

        case "Path Follow":

            pathFollow.path      = aiTargets;
            pathFollow.character = this;

            pathFollow.maxAccel = maxAccel;
            pathFollow.maxSpeed = maxSpeed;

            pathFollow.targetRad = targetRad;
            pathFollow.slowRad   = slowRad;

            moving = pathFollow.GetSteering();

            movement.linear = moving.linear;

            break;

        case "Path Follow Face":

            pathFollow.path      = aiTargets;
            pathFollow.character = this;

            pathFollow.maxAccel = maxAccel;
            pathFollow.maxSpeed = maxSpeed;

            pathFollow.targetRad = targetRad;
            pathFollow.slowRad   = slowRad;

            moving = pathFollow.GetSteering();

            aiTarget = pathFollow.target;

            facing.character = this;
            facing.target    = aiTarget;

            turning = facing.GetSteering();

            movement.linear  = moving.linear;
            movement.angular = turning.angular;

            break;

        case "Separate":

            separate.character = this;
            separate.avoid     = kinTargets;

            separate.threshold = threshold;
            separate.decay     = decay;

            //separate.avoid = avoidance;

            moving = separate.GetSteering();

            movement.linear  = moving.linear;
            movement.angular = 0;

            break;

        case "Pursue":

            pursuing.character = this;
            pursuing.target    = aiTarget;

            moving = pursuing.GetSteering();

            movement.linear  = moving.linear;
            movement.angular = 0;

            break;

        case "Avoidance":
            avoid.character = this;
            avoid.targets   = kinTargets;

            kinTarget = avoid.firstTarget;

            moving = avoid.GetSteering();

            movement.linear = moving.linear;

            movement.angular = 0;

            break;

        case "Obstacles":

            obstacles.character = this;
            //obstacles.target = aiTarget;

            looky.character = this;
            looky.target    = obstacles.target;

            moving  = obstacles.GetSteering();
            turning = looky.GetSteering();

            movement.linear  = moving.linear;
            movement.angular = turning.angular;

            break;

        case "Flocking":

            arrive.character = this;
            arrive.target    = aiTarget;

            arrive.maxAccel = maxAccel;
            arrive.maxSpeed = maxSpeed;

            arrive.targetRad = targetRad;
            arrive.slowRad   = slowRad;

            looky.character = this;

            obstacles.character = this;

            separate.character = this;
            separate.avoid     = kinTargets;

            separate.threshold = threshold;
            separate.decay     = decay;

            behaviors[0] = new BehaviorAndWeight();

            behaviors[0].behavior = arrive;
            behaviors[0].weight   = 35f;

            behaviors[1] = new BehaviorAndWeight();

            behaviors[1].behavior = separate;
            behaviors[1].weight   = 1f;

            behaviors[2] = new BehaviorAndWeight();

            behaviors[2].behavior = looky;
            behaviors[2].weight   = 50f;

            behaviors[3] = new BehaviorAndWeight();

            behaviors[3].behavior = obstacles;
            behaviors[3].weight   = 10f;

            flocking.behaviors = behaviors;

            flocking.maxAccel    = maxAccel;
            flocking.maxRotation = maxRot;

            moving = flocking.GetSteering();

            movement.linear  = moving.linear;
            movement.angular = moving.angular;

            break;

        default:

            facing.character = this;
            facing.target    = aiTarget;


            moving  = seeking.GetSteering();
            turning = aligned.GetSteering();

            if (moving == null)
            {
                movement.linear = Vector3.zero;
            }
            else
            {
                movement.linear  = moving.linear;
                movement.angular = turning.angular;
            }

            break;
        }

        // Update linear and angular velocities

        //Debug.Log(movement.angular);

        linearVel  += movement.linear * Time.deltaTime;
        angularVel += movement.angular * Time.deltaTime;

        //angularInc *= Mathf.Rad2Deg;

        transform.position += linearVel * Time.deltaTime * maxSpeed;

        angularInc = new Vector3(0, angularVel * Time.deltaTime * angVelMax, 0);
        //Debug.Log(angularInc)



        if (!float.IsNaN(angularInc.y))
        {
            transform.eulerAngles += angularInc;
        }

        //Debug.Log(linearVel);

        if (linearVel.magnitude > maxSpeed)
        {
            linearVel.Normalize();
            linearVel *= maxSpeed;
        }
    }
示例#7
0
 public override Steering GetSteering()
 {
     return(Separation.GetSteering(npc, threshold, decayCoefficient, maxAccel, visibleRays));
 }