public FlyStraightBehaviour( SteeringManager manager )
     : base(manager)
 {
     this.tag = "FlyStraight";
     this.steeringWeight = 1.0f;
     seek = new SeekBehaviour (manager);
 }
예제 #2
0
        /// <summary>
        /// Update the behavior.
        /// </summary>
        /// <param name="manager">The steering manager.</param>
        /// <param name="actor">The actor being updated.</param>
        /// <param name="dt">The time since the last update, in seconds.
        /// </param>
        /// <returns>The steering object.</returns>
        public override Steering Update(SteeringManager manager, Actor actor,
                                        float dt)
        {
            float threshold = base.MaxDistance;

            Vector3 accum = Vector3.zero;

            foreach (Actor f in Flock.Members)
            {
                if (base.IsAffecting(actor, f))
                {
                    Vector3 v   = actor.Position - f.Position;
                    float   d   = v.magnitude;
                    float   str = Mathf.Max(0.0f, (threshold - d) / threshold)
                                  * manager.MaxForce;
                    accum += (v / d) * str;
                }
            }

            if (manager.IsPlanar)
            {
                accum.y = 0f;
            }

            return(new Steering(accum, Vector3.zero));
        }
예제 #3
0
파일: Avoid.cs 프로젝트: tosos/SanityEngine
        /// <summary>
        /// Update the behavior.
        /// </summary>
        /// <param name="manager">The steering manager.</param>
        /// <param name="actor">The actor being updated.</param>
        /// <param name="dt">The time since the last update, in seconds.
        /// </param>
        /// <returns>The steering object.</returns>
        protected override Steering FlockingUpdate(SteeringManager manager, Actor actor,
			float dt)
        {
            float smallestHitTime = float.PositiveInfinity;
            Vector3 tgt = Vector3.zero;
            bool hit = false;

            foreach (Actor other in Flock.Members)
            {
                Vector3 a = actor.Position - other.Position;
                Vector3 b = actor.Velocity - other.Velocity;

                // Calculate future hit time
                float hTime = -(Vector3.Dot(a, b)) / b.sqrMagnitude;

                // We want the smallest hit time but it must be greater
                // than zero. Zero and smaller means no collision
                if (hTime < smallestHitTime && hTime > 0)
                {
                    smallestHitTime = hTime;
                    // If we have the smallest hit time, compute where that
                    // actor will be at that time and set it to the target
                    hit = true;
                    tgt = smallestHitTime * other.Velocity + other.Position;
                }
            }
            //Flee from the target
            if (hit)
            {
                target.Point = tgt;
                return flee.Update(manager, actor, dt);
            }

            return Steering.zero;
        }
예제 #4
0
    protected override void OnStart()
    {
        base.OnStart();
        if (FollowTarget != null)
        {
            followTargetController = FollowTarget.GetComponent <SceneObjController>();
        }


        m_CheckAroundController = GetComponent <CheckAroundEntityController>();
        if (m_CheckAroundController == null)
        {
            m_CheckAroundController = gameObject.AddComponent <CheckAroundEntityController>();
        }

        m_MoveSpeed_Max  = 0.1f;
        m_ForceSteer_Max = 1f;

        m_StopRadius    = 0.5f;
        m_SlowingRadius = 1f;

        m_CurrentVelocity = Vector2.zero;
        m_TempMass        = 1;
        m_Steering        = new SteeringManager(this);

        m_PathfindingRequested = false;
        InitAnimComponent();
    }
예제 #5
0
        public override void Update()
        {
            float range = 50.0f;

            timeShot += Time.deltaTime;
            float fov = Mathf.PI / 4.0f;
            // Can I see the leader?
            GameObject leader = SteeringManager.Instance().currentScenario.leader;

            if ((leader.transform.position - entity.transform.position).magnitude > range)
            {
                entity.GetComponent <StateMachine>().SwicthState(new IdleState(entity));
            }
            else
            {
                float   angle;
                Vector3 toEnemy = (leader.transform.position - entity.transform.position);
                toEnemy.Normalize();
                angle = (float)Math.Acos(Vector3.Dot(toEnemy, entity.transform.forward));
                if (angle < fov)
                {
                    if (timeShot > 0.25f)
                    {
                        GameObject lazer = new GameObject();
                        lazer.AddComponent <Lazer>();
                        lazer.transform.position = entity.transform.position;
                        lazer.transform.forward  = entity.transform.forward;
                        timeShot = 0.0f;
                    }
                }
            }
        }
예제 #6
0
        public override sealed Steering Update(SteeringManager manager, Actor actor, float dt)
        {
            if(flock == null) {
                return Steering.zero;
            }

            return FlockingUpdate(manager, actor, dt);
        }
예제 #7
0
 public void Update()
 {
     if (currentState != null)
     {
         SteeringManager.PrintMessage("Current state: " + currentState.Description());
         currentState.Update();
     }
 }
예제 #8
0
 public override void Enter()
 {
     entity.GetComponent <SteeringBehaviours>().turnOffAll();
     entity.GetComponent <SteeringBehaviours>().OffsetPursuitEnabled     = true;
     entity.GetComponent <SteeringBehaviours>().ObstacleAvoidanceEnabled = true;
     entity.GetComponent <SteeringBehaviours>().offset = new Vector3(0, 0, 5);
     entity.GetComponent <SteeringBehaviours>().leader = SteeringManager.Instance().currentScenario.leader;
 }
예제 #9
0
 // Use this for initialization
 void Start()
 {
     mSettingsScript  = GetComponent <EnemySettings>();
     mSteeringManager = new SteeringManager();
     mSteeringManager.Initiate(this.gameObject, mSettingsScript);
     mTarget    = GameObject.FindGameObjectWithTag("Player");
     mRigidBody = GetComponent <Rigidbody>();
 }
예제 #10
0
    //public void Init(AnimationAnalyzer analyzer, FootstepPlanningTest planner,
    public void Init(AnimationAnalyzer analyzer, Planner planner,
                     AnimationEngine animEngine, CollisionReaction collisionReact,
                     NavMeshWayPoints navMeshWaypoints, SteeringManager steering,
                     NeighbourAgents agents, NeighbourObstacles obstacles,
                     PlaceFootSteps steps)
    {
        planning = planner;
        if (planning != null && !planning.initialized)
        {
            planning.Init(analyzer, agents, obstacles);
        }

        engine = animEngine;
        if (engine != null && !engine.initialized)
        {
            engine.Init(analyzer, planning, agents, obstacles);
        }

        collision = collisionReact;
        if (collision != null && !collision.initialized)
        {
            collision.Init(analyzer, planner, engine, agents, obstacles);
        }

        waypoints = navMeshWaypoints;
        //if (waypoints != null && !waypoints.initialized)
        //	waypoints.Init(planning,steering,analyzer,agents,obstacles);

        neighborhood = agents;
        if (neighborhood != null && !neighborhood.initialized)
        {
            neighborhood.Init();
        }

        footsteps = steps;
        if (footsteps != null && !footsteps.initiated)
        {
            footsteps.Init(analyzer, planner, engine, neighborhood, obstacles);
        }

        nObstacles = obstacles;
        if (nObstacles != null && !nObstacles.initialized)
        {
            nObstacles.Init();
        }

        timeSinceLastPlan      = 0;
        timeSinceLastWaypoints = 0;

        previousGoalPosition        = planning.goalStateTransform.position;
        previousCurrentGoalPosition = planning.currentGoal;

        previousActionsSinceLastPlan = -1;

        newWaypoint = false;

        initialized = true;
    }
예제 #11
0
 public void UpdateFlightControl(Vessel vessel)
 {
     control = GetControllerByVessel(vessel);
     if (steeringManager != null)
     {
         steeringManager = SteeringManagerProvider.SwapInstance(shared, steeringManager);
         steeringManager.Update(vessel);
     }
 }
예제 #12
0
 public void Dispose()
 {
     Enabled = false;
     if (steeringManager != null)
     {
         SteeringManagerProvider.RemoveInstance(shared.Vessel);
         steeringManager = null;
     }
 }
예제 #13
0
 private void Awake()
 {
     home  = new GameObject();
     pivot = new GameObject();
     home.transform.position  = transform.position;
     pivot.transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z + 1.5f);
     manager  = new SteeringManager();
     steering = new Vector3(0.0f, 0.0f, 0.0f);
     velocity = new Vector3(0.0f, 0.0f, 0.0f);
 }
예제 #14
0
        public GameObject CreateBoid(Vector3 position, GameObject prefab)
        {
            GameObject boid;

            boid     = (GameObject)SteeringManager.Instantiate(prefab);
            boid.tag = "boid";
            boid.AddComponent <SteeringBehaviours>();
            boid.transform.position = position;

            return(boid);
        }
예제 #15
0
    // Use this for initialization
    //public void Init (FootstepPlanningTest planner, SteeringManager steeringManager, AnimationAnalyzer analyzer, NeighbourAgents agents, NeighbourObstacles obstacles, RootMotionComputer computer) {
    public void Init(Planner planner, SteeringManager steeringManager, AnimationAnalyzer analyzer, NeighbourAgents agents, NeighbourObstacles obstacles)
    {
        steering = steeringManager;

        planning = planner;
        if (planning != null && !planning.initialized)
            planning.Init(analyzer, agents, obstacles);

        navMeshLayer = 1 << LayerMask.NameToLayer("StaticWorld");

        initialized = true;
    }
예제 #16
0
 protected BMovableGameObject(Texture2D texture, float positionX, float positionY, float textureOffsetX, float textureOffsetY, float collisionBoxSizeX = 0.7f, float collisionBoxSizeY = 0.7f)
     : base(texture, positionX, positionY, textureOffsetX, textureOffsetY, collisionBoxSizeX, collisionBoxSizeY)
 {
     InputManager.AnyActionEvent += MoveToTarget;
     mSteering       = new SteeringManager(this);
     mBloodAnimation = AnimationManager.GetAnimation(AnimationManager.Blood, this);
     mBloodAnimation.AnimationFinished = true;
     mBlood = TextureManager.GetTexture("blood", 32, 32, 0);
     InputManager.AnyActionEvent += StopMovement;
     Mass      = 1;
     Position += QuadTree.ClampPosition(this);
 }
        public override void Update()
        {
            float range = 50.0f;
            // Can I see the leader?
            GameObject leader = SteeringManager.Instance().currentScenario.leader;

            if ((leader.transform.position - entity.transform.position).magnitude < range)
            {
                // Is the leader inside my FOV
                entity.GetComponent <StateMachine>().SwicthState(new AttackingState(entity));
            }
        }
예제 #18
0
        /// <summary>
        /// Update the behavior.
        /// </summary>
        /// <param name="manager">The steering manager.</param>
        /// <param name="actor">The actor being updated.</param>
        /// <param name="dt">The time since the last update, in seconds.
        /// </param>
        /// <returns>The steering object.</returns>
        protected override Steering FlockingUpdate(SteeringManager manager, Actor actor,
			float dt)
        {
            int count = 0;
            Vector3 avg = Vector3.zero;
            foreach (Actor f in Flock.Members)
            {
                avg += f.Position;
                count++;
            }
            target.Point = count > 0 ? avg / count : avg;
            return seeker.Update(manager, actor, dt);
        }
    public BankHardRightBehaviour(SteeringManager manager) : base(manager)
    {
        this.tag = "BankHardRight";

        this.radius = 400;
        this.dist   = 600;

        this.pointOnSphere = Vector3.zero;

        this.sphere      = new GameObject();
        this.sphere.name = "BankHardRight";

        seek = new SeekBehaviour(manager);
    }
예제 #20
0
    // Use this for initialization
    //public void Init (FootstepPlanningTest planner, SteeringManager steeringManager, AnimationAnalyzer analyzer, NeighbourAgents agents, NeighbourObstacles obstacles, RootMotionComputer computer) {
    public void Init(Planner planner, SteeringManager steeringManager, AnimationAnalyzer analyzer, NeighbourAgents agents, NeighbourObstacles obstacles)
    {
        steering = steeringManager;

        planning = planner;
        if (planning != null && !planning.initialized)
        {
            planning.Init(analyzer, agents, obstacles);
        }

        navMeshLayer = 1 << LayerMask.NameToLayer("StaticWorld");

        initialized = true;
    }
    public BankHardRightBehaviour( SteeringManager manager )
        : base(manager)
    {
        this.tag = "BankHardRight";

        this.radius = 400;
        this.dist = 600;

        this.pointOnSphere = Vector3.zero;

        this.sphere = new GameObject ();
        this.sphere.name = "BankHardRight";

        seek = new SeekBehaviour (manager);
    }
예제 #22
0
 void Start()
 {
     myTransform = transform;
     steering    = GetComponent <SteeringManager>();
     if (steering == null)
     {
         Debug.LogError("No steering manager found!");
     }
     model = myTransform.Find(modelName);
     if (model == null)
     {
         Debug.LogWarning("No steerable model found!");
     }
     OnStart();
 }
예제 #23
0
        /// <summary>
        /// After a decouple or part explosion, it's possible for this vessel to
        /// still have an assigned flight control parameter that is coming from
        /// a kOS core that is no longer on this vessel but is instead on the newly
        /// branched vessel we left behind.  If so, that parameter needs to be
        /// removed from this vessel.  The new kOSVesselModule will take care of
        /// making a new parameter on the new vessel, but this kOSVesselModule needs
        /// to detach it from this one.
        /// </summary>
        private void ResetPhysicallyDetachedParameters()
        {
            List <string> removeKeys = new List <string>();

            foreach (string key in flightControlParameters.Keys)
            {
                IFlightControlParameter p = flightControlParameters[key];
                if (p.GetShared() != null && p.GetShared().Vessel != null && Vessel != null &&
                    p.GetShared().Vessel.id != Vessel.id)
                {
                    removeKeys.Add(key);
                }
            }
            foreach (string key in removeKeys)
            {
                SafeHouse.Logger.SuperVerbose(string.Format(
                                                  "kOSVesselModule: re-defaulting parameter \"{0}\" because it's on a detached part of the vessel.", key));
                RemoveFlightControlParameter(key);
                IFlightControlParameter p = null;
                if (key.Equals("steering"))
                {
                    p = new SteeringManager(Vessel);
                }
                else if (key.Equals("throttle"))
                {
                    p = new ThrottleManager(Vessel);
                }
                else if (key.Equals("wheelsteering"))
                {
                    p = new WheelSteeringManager(Vessel);
                }
                else if (key.Equals("wheelthrottle"))
                {
                    p = new WheelThrottleManager(Vessel);
                }
                else if (key.Equals("flightcontrol"))
                {
                    p = new FlightControl(Vessel);
                }

                if (p != null)
                {
                    AddFlightControlParameter(key, p);
                }
            }
            foundWrongVesselAutopilot = false;
        }
예제 #24
0
        /// <summary>
        /// Update the behavior.
        /// </summary>
        /// <param name="manager">The steering manager.</param>
        /// <param name="actor">The actor being updated.</param>
        /// <param name="dt">The time since the last update, in seconds.
        /// </param>
        /// <returns>The steering object.</returns>
        public override Steering Update(SteeringManager manager, Actor actor,
                                        float dt)
        {
            int     count = 0;
            Vector3 avg   = Vector3.zero;

            foreach (Actor f in Flock.Members)
            {
                if (base.IsAffecting(actor, f))
                {
                    avg += f.Position;
                    count++;
                }
            }
            target.Point = count > 0 ? avg / count : avg;
            return(seeker.Update(manager, actor, dt));
        }
예제 #25
0
            public FlightCtrlParam(string name, SharedObjects sharedObjects)
            {
                this.name = name;
                shared    = sharedObjects;
                control   = GetControllerByVessel(sharedObjects.Vessel);

                binding = sharedObjects.BindingMgr;
                Enabled = false;
                value   = null;

                if (string.Equals(name, "steering", StringComparison.CurrentCultureIgnoreCase))
                {
                    steeringManager = SteeringManagerProvider.GetInstance(sharedObjects);
                }

                HookEvents();
            }
    protected void Awake()
    {
        actor = GetComponent<GameObjectActor>();
        if(!actor) {
            Debug.LogError("Steering manager is not attached to an actor!");
        }
        manager = new SteeringManager();

        behaviors = new Dictionary<string, SteeringBehaviorProxy>();
        foreach(SteeringBehaviorAsset asset in steeringAssets) {
            SteeringBehaviorProxy proxy = new SteeringBehaviorProxy(asset);
            behaviors[asset.name] = proxy;
            foreach(SteeringBehavior behavior in proxy.behaviors) {
                manager.AddBehavior(behavior);
            }
        }
    }
예제 #27
0
        /// <summary>
        /// Update the behavior.
        /// </summary>
        /// <param name="manager">The steering manager.</param>
        /// <param name="actor">The actor being updated.</param>
        /// <param name="dt">The time since the last update, in seconds.
        /// </param>
        /// <returns>The steering object.</returns>
        protected override Steering FlockingUpdate(SteeringManager manager, Actor actor,
			float dt)
        {
            Vector3 accum = Vector3.zero;
            int count = 0;
            foreach (Actor f in Flock.Members)
            {
                Vector3 vel = f.Velocity;
                vel.Normalize();
                accum += vel;
                count++;
            }

            accum /= count > 0 ? count : 1.0f;
            return new Steering(SteerToward(manager, actor,
                actor.Position + accum, dt), Vector3.zero);
        }
예제 #28
0
        public GameObject CreateCamFollower(GameObject leader, Vector3 offset)
        {
            GameObject camFollower = new GameObject();

            camFollower.tag = "camFollower";
            camFollower.AddComponent <SteeringBehaviours>();
            camFollower.GetComponent <SteeringBehaviours>().leader = leader;
            camFollower.GetComponent <SteeringBehaviours>().offset = offset;
            camFollower.transform.position = leader.transform.TransformPoint(offset);
            camFollower.GetComponent <SteeringBehaviours> ().OffsetPursuitEnabled = true;
            //camFighter.GetComponent<SteeringBehaviours>().turnOn(SteeringBehaviours.behaviour_type.wall_avoidance);
            camFollower.GetComponent <SteeringBehaviours> ().ObstacleAvoidanceEnabled = true;
            SteeringManager.Instance().camFighter = camFollower;
            GameObject.FindGameObjectWithTag("MainCamera").transform.position = camFollower.transform.position;

            return(camFollower);
        }
예제 #29
0
    public AvoidLockOnRightLeftBehaviour(SteeringManager manager) : base(manager)
    {
        this.tag  = "AvoidLockOnRightLeft";
        this.left = false;

        this.timeMax = 4.0f;

        this.radius = 200;
        this.dist   = 400;

        this.pointOnSphere = Vector3.zero;

        this.sphere      = new GameObject();
        this.sphere.name = "AvoidLockOnSphere";

        seek = new SeekBehaviour(manager);
    }
예제 #30
0
    //public void Init(AnimationAnalyzer analyzer, FootstepPlanningTest planner,
    public void Init(AnimationAnalyzer analyzer, Planner planner, 
	                 AnimationEngine animEngine, CollisionReaction collisionReact, 
	                 NavMeshWayPoints navMeshWaypoints, SteeringManager steering,
	                 NeighbourAgents agents, NeighbourObstacles obstacles,
	                 PlaceFootSteps steps)
    {
        planning = planner;
        if (planning != null && !planning.initialized)
            planning.Init(analyzer,agents,obstacles);

        engine = animEngine;
        if (engine != null && !engine.initialized)
            engine.Init(analyzer,planning,agents,obstacles);

        collision = collisionReact;
        if (collision != null && !collision.initialized)
            collision.Init(analyzer,planner,engine,agents,obstacles);

        waypoints = navMeshWaypoints;
        //if (waypoints != null && !waypoints.initialized)
        //	waypoints.Init(planning,steering,analyzer,agents,obstacles);

        neighborhood = agents;
        if (neighborhood != null && !neighborhood.initialized)
            neighborhood.Init();

        footsteps = steps;
        if (footsteps != null && !footsteps.initiated)
            footsteps.Init(analyzer,planner,engine,neighborhood,obstacles);

        nObstacles = obstacles;
        if (nObstacles != null && !nObstacles.initialized)
            nObstacles.Init();

        timeSinceLastPlan = 0;
        timeSinceLastWaypoints = 0;

        previousGoalPosition = planning.goalStateTransform.position;
        previousCurrentGoalPosition = planning.currentGoal;

        previousActionsSinceLastPlan = -1;

        newWaypoint = false;

        initialized = true;
    }
예제 #31
0
        /// <summary>
        /// Update the behavior.
        /// </summary>
        /// <param name="manager">The steering manager.</param>
        /// <param name="actor">The actor being updated.</param>
        /// <param name="dt">The time since the last update, in seconds.
        /// </param>
        /// <returns>The steering object.</returns>
        protected override Steering FlockingUpdate(SteeringManager manager, Actor actor,
			float dt)
        {
            Vector3 accum = Vector3.zero;
            foreach (Actor f in Flock.Members)
            {
                Vector3 v = actor.Position - f.Position;
                float d = v.magnitude;
                float str = Mathf.Max(0.0f, (threshold - d) / threshold)
                    * manager.MaxForce;
                accum += (v / d) * str;
            }

            if(manager.IsPlanar) {
                accum.y = 0f;
            }

            return new Steering(accum, Vector3.zero);
        }
예제 #32
0
    protected void Awake()
    {
        actor = GetComponent <GameObjectActor>();
        if (!actor)
        {
            Debug.LogError("Steering manager is not attached to an actor!");
        }
        manager = new SteeringManager();

        behaviors = new Dictionary <string, SteeringBehaviorProxy>();
        foreach (SteeringBehaviorAsset asset in steeringAssets)
        {
            SteeringBehaviorProxy proxy = new SteeringBehaviorProxy(asset);
            behaviors[asset.name] = proxy;
            foreach (SteeringBehavior behavior in proxy.behaviors)
            {
                manager.AddBehavior(behavior);
            }
        }
    }
    public AvoidLockOnBehaviour(SteeringManager manager) : base(manager)
    {
        this.tag       = "AvoidLockOn";
        this.firstTime = true;

        this.timePassed = 0.0f;
        this.timeMax    = 10.0f;

        this.radius        = 100;
        this.dist          = 200;
        this.range         = 300;
        this.FOV           = 60.0f;
        this.pointOnSphere = new Vector3(0, 0, 0);
        this.targetPos     = manager.transform.position + (Vector3.forward * manager.maxSpeed);

        this.maxUp = 0.0f;

        this.sphere      = new GameObject();
        this.sphere.name = "AvoidLockOnSphere";
    }
예제 #34
0
    protected override void OnStart()
    {
        base.OnStart();
        if (FollowTarget != null)
        {
            followTargetController = FollowTarget.GetHostGameObject().GetComponent <SceneObjController>();
        }
        m_MoveSpeed_Max  = 0.1f;
        m_ForceSteer_Max = 1f;

        m_StopRadius    = 0.5f;
        m_SlowingRadius = 1f;

        m_CurrentVelocity = Vector2.zero;
        m_TempMass        = 1;
        m_Steering        = new SteeringManager(this);
        m_Position        = new Vector2(transform.position.x, transform.position.y);

        InitAnimComponent();
    }
    public AvoidLockOnBehaviour( SteeringManager manager )
        : base(manager)
    {
        this.tag = "AvoidLockOn";
        this.firstTime = true;

        this.timePassed = 0.0f;
        this.timeMax = 10.0f;

        this.radius = 100;
        this.dist = 200;
        this.range = 300;
        this.FOV = 60.0f;
        this.pointOnSphere = new Vector3 (0, 0, 0);
        this.targetPos = manager.transform.position + (Vector3.forward * manager.maxSpeed);

        this.maxUp = 0.0f;

        this.sphere = new GameObject ();
        this.sphere.name = "AvoidLockOnSphere";
    }
예제 #36
0
        public static SteeringManager GetInstance(SharedObjects shared)
        {
            string key = shared.Vessel.id.ToString();

            if (AllInstances.Keys.Contains(key))
            {
                SteeringManager instance = AllInstances[key];
                if (!instance.SubscribedParts.Contains(shared.KSPPart.flightID))
                {
                    AllInstances[key].SubscribedParts.Add(shared.KSPPart.flightID);
                }
                return(AllInstances[key]);
            }

            SteeringManager sm = new SteeringManager(shared);

            sm.SubscribedParts.Add(shared.KSPPart.flightID);

            AllInstances.Add(key, sm);
            return(sm);
        }
예제 #37
0
        /// <summary>
        /// Update the behavior.
        /// </summary>
        /// <param name="manager">The steering manager.</param>
        /// <param name="actor">The actor being updated.</param>
        /// <param name="dt">The time since the last update, in seconds.
        /// </param>
        /// <returns>The steering object.</returns>
        public override Steering Update(SteeringManager manager, Actor actor,
                                        float dt)
        {
            Vector3 accum = Vector3.zero;
            int     count = 0;

            foreach (Actor f in Flock.Members)
            {
                if (base.IsAffecting(actor, f))
                {
                    Vector3 vel = f.Velocity;
                    vel.Normalize();
                    accum += vel;
                    count++;
                }
            }

            accum /= count > 0 ? count : 1.0f;
            return(new Steering(SteerToward(manager, actor,
                                            actor.Position + accum, dt), Vector3.zero));
        }
예제 #38
0
        /// <summary>
        /// Update the behavior.
        /// </summary>
        /// <param name="manager">The steering manager.</param>
        /// <param name="actor">The actor being updated.</param>
        /// <param name="dt">The time since the last update, in seconds.
        /// </param>
        /// <returns>The steering object.</returns>
        public override Steering Update(SteeringManager manager, Actor actor,
                                        float dt)
        {
            float   smallestHitTime = float.PositiveInfinity;
            Vector3 tgt             = Vector3.zero;
            bool    hit             = false;

            foreach (Actor other in Flock.Members)
            {
                if (!base.IsAffecting(actor, other))
                {
                    continue;
                }

                Vector3 a = actor.Position - other.Position;
                Vector3 b = actor.Velocity - other.Velocity;

                // Calculate future hit time
                float hTime = -(Vector3.Dot(a, b)) / b.sqrMagnitude;

                // We want the smallest hit time but it must be greater
                // than zero. Zero and smaller means no collision
                if (hTime < smallestHitTime && hTime > 0)
                {
                    smallestHitTime = hTime;
                    // If we have the smallest hit time, compute where that
                    // actor will be at that time and set it to the target
                    hit = true;
                    tgt = smallestHitTime * other.Velocity + other.Position;
                }
            }
            //Flee from the target
            if (hit)
            {
                target.Point = tgt;
                return(flee.Update(manager, actor, dt));
            }

            return(Steering.zero);
        }
예제 #39
0
    void Update()
    {
        if (!SteeringManager.IsValid(SteeringManager.ToVector2(myTransform.position)) && !steering.ignoreWalls)
        {
            myTransform.position = lastGoodPosition;
        }
        else
        {
            lastGoodPosition = myTransform.position;
        }
        DoBoundaryBehavior();
        if (!isAvoiding)
        {
            DoBehavior();
        }

        if (model != null)
        {
            model.rotation = Quaternion.Euler(0, -steering.facing * Mathf.Rad2Deg, 0);
        }
        steering.UpdateSteering();
    }
예제 #40
0
        public static SteeringManager SwapInstance(SharedObjects shared, SteeringManager oldInstance)
        {
            if (shared.Vessel == oldInstance.Vessel)
            {
                return(oldInstance);
            }
            if (oldInstance.SubscribedParts.Contains(shared.KSPPart.flightID))
            {
                oldInstance.SubscribedParts.Remove(shared.KSPPart.flightID);
            }
            SteeringManager instance = SteeringManager.DeepCopy(oldInstance, shared);

            if (oldInstance.Enabled)
            {
                if (oldInstance.PartId == shared.KSPPart.flightID)
                {
                    oldInstance.DisableControl();
                    instance.EnableControl(shared);
                    instance.Value = oldInstance.Value;
                }
            }
            return(instance);
        }
예제 #41
0
 public FollowBehaviour( SteeringManager manager )
     : base(manager)
 {
     this.tag = "Follow";
     seek = new SeekBehaviour (manager);
 }
 public SteeringBehaviour( SteeringManager manager )
 {
     this.manager = manager;
     this.isEnabled = false;
     this.steeringWeight = 1.0f;
 }
예제 #43
0
 public FleeBehaviour( SteeringManager manager )
     : base(manager)
 {
     this.tag = "Flee";
     this.panicDist = 500.0f;
 }
 public OffsetPursueBehaviour( SteeringManager manager )
     : base(manager)
 {
     this.tag = "OffsetPursue";
     this.arrive = new ArriveBehaviour (manager);
 }
    public AvoidLockOnRightLeftBehaviour( SteeringManager manager )
        : base(manager)
    {
        this.tag = "AvoidLockOnRightLeft";
        this.left = false;

        this.timeMax = 4.0f;

        this.radius = 200;
        this.dist = 400;

        this.pointOnSphere = Vector3.zero;

        this.sphere = new GameObject ();
        this.sphere.name = "AvoidLockOnSphere";

        seek = new SeekBehaviour (manager);
    }
예제 #46
0
 public ArriveBehaviour( SteeringManager manager )
     : base(manager)
 {
     this.tag = "Arrive";
     this.slowingDist = 10.0f;
 }
예제 #47
0
    public TurnRight( SteeringManager manager )
        : base(manager)
    {
        this.tag = "TurnRight";
        this.left = false;

        this.timePassed = 20.0f;
        this.timeMax = 3.0f;

        this.radius = 200;
        this.dist = 600;

        this.pointOnSphere = Vector3.zero;
        pointOnSphere.x = 0.8f;
        pointOnSphere *= radius;

        this.sphere = new GameObject ();
        this.sphere.name = "AvoidLockOnSphere";

        seek = new SeekBehaviour (manager);
    }
예제 #48
0
 public EvadeBehaviour( SteeringManager manager )
     : base(manager)
 {
     this.tag = "Evade";
     flee = new FleeBehaviour (manager);
 }
예제 #49
0
 protected abstract Steering FlockingUpdate(SteeringManager manager, Actor actor, float dt);
예제 #50
0
 public FleeBehaviour(SteeringManager manager) : base(manager)
 {
     this.tag       = "Flee";
     this.panicDist = 500.0f;
 }
예제 #51
0
 public SeekBehaviour( SteeringManager manager )
     : base(manager)
 {
     this.tag = "Seek";
 }
예제 #52
0
    public static void CalculateNavigationMeshPath(Vector3 startPosition, Vector3 goalPosition, int passableMask)
    {
        ClearNavigationMeshPath ();

        switch (navigationMeshChoice)
        {

        default:
        case NavigationMeshChoice.USE_UNITY :

            NavMeshPath unityPath = new NavMeshPath();
            NavMesh.CalculatePath(startPosition,goalPosition, passableMask,unityPath);

            pathStatus = unityPath.status;

            if (pathStatus == NavMeshPathStatus.PathInvalid)
            {
                numberOfNodes = 0;
            }
            else
            {
                if ( unityPath.corners.Length >= maxNumberOfNodes)
                {
                    Debug.LogWarning("Navigation mesh path greater than maximum number of nodes");
                    numberOfNodes = maxNumberOfNodes;
                    pathStatus = NavMeshPathStatus.PathPartial;
                }
                else
                {
                    numberOfNodes = unityPath.corners.Length;
                }

                for(int i =0; i < numberOfNodes; i++)
                {
                    // MAKING SURE LAST WAYPOINT IS THE GOAL
                    if ( i == numberOfNodes - 1)
                        path[i] = goalPosition;
                    else
                    path[i] = unityPath.corners[i];

                    // computing path cost
                    if (i==0)
                        pathCost[i] = 0.0f;
                    else
                    {
                        // assuming that all off mesh links will override cost
                        if (CentralizedManager.IsOffMeshLink(path[i]))
                            pathCost[i] = CentralizedManager.GetOffMeshLinkInformation(path[i]).offMeshLink.costOverride;
                        else
                            pathCost[i] = Vector3.Distance(path[i],path[i-1]);
                    }

                    totalPathCost += pathCost[i];

                }
            }

            break;

        case NavigationMeshChoice.USE_RECAST:

            if (recastSteeringManager == null)
                recastSteeringManager = GameObject.Find("ADAPTPrefab").GetComponentInChildren<SteeringManager>();

            numberOfNodes = recastSteeringManager.FindPath(startPosition,goalPosition,path,maxNumberOfNodes);

            if( numberOfNodes > 0)
                path[numberOfNodes-1] = goalPosition;

            // computing path cost
            for (int i=1; i < numberOfNodes; i++)
            {
                // TODO : incorporate number of obstacles from centralized manager here
                pathCost[i] = Vector3.Distance(path[i],path[i-1]);
                totalPathCost += pathCost[i];
            }

            if (numberOfNodes == 0)
                pathStatus = NavMeshPathStatus.PathInvalid;
            else if ( numberOfNodes == maxNumberOfNodes)
                pathStatus = NavMeshPathStatus.PathPartial;
            else
                pathStatus = NavMeshPathStatus.PathComplete;

            break;

        }
    }
예제 #53
0
 public PursueBehaviour( SteeringManager manager )
     : base(manager)
 {
     this.tag = "Pursue";
     seek = new SeekBehaviour (manager);
 }