Ejemplo n.º 1
0
Archivo: Movements.cs Proyecto: UDK/SoV
        public static void MoveByCircle(GameObject self, GameObject target, SpaceShipContainer container)
        {
            // get current magnitude
            var maxVelocity = container.MovementBehaviour.MaxVelocity;

            // get vector center <- obj
            var gravityVector = target.transform.position - self.transform.position;

            // check whether left or right of target
            var left = Vector2.SignedAngle(container.MovementBehaviour.Velocity, gravityVector) > 0;

            // get new vector which is 90° on gravityDirection
            // and world Z (since 2D game)
            // normalize so it has magnitude = 1
            var newDirection = Vector3.Cross(gravityVector, Vector3.forward).normalized;

            // invert the newDirection in case user is touching right of movement direction
            if (!left)
            {
                newDirection *= -1;
            }

            // set new direction but keep speed(previously stored magnitude)
            container.MovementBehaviour.SmoothlySetVelocity(newDirection * maxVelocity);
        }
Ejemplo n.º 2
0
 public UnitStrategyManager(
     GameObject self,
     SpaceShipContainer container)
 {
     _self      = self;
     _container = container;
 }
Ejemplo n.º 3
0
Archivo: Movements.cs Proyecto: UDK/SoV
        public static Action GoAfterTarget(
            GameObject self,
            SpaceShipContainer container) =>
        () =>
        {
            if (container.Target == null)
            {
                return;
            }

            var distance = Vector2.Distance(
                container.Target.transform.position,
                self.transform.position);
            var heading =
                container.Target.transform.position - self.transform.position;

            if (distance < container.AttackDistance)
            {
                container.StateMachine.Push(
                    ShipStates.Attacking);
            }
            else
            {
                container.MovementBehaviour.SmoothlySetVelocity(
                    heading.normalized * container.MovementBehaviour.MaxVelocity);
            }

            Rotations.RotateBySpeed(self, container);
        };
Ejemplo n.º 4
0
Archivo: Movements.cs Proyecto: UDK/SoV
        public static void HeadToTarget(GameObject self, GameObject target, SpaceShipContainer container)
        {
            var heading =
                target.transform.position - self.transform.position;

            container.MovementBehaviour.SmoothlySetVelocity(
                heading.normalized * container.MovementBehaviour.MaxVelocity);
        }
Ejemplo n.º 5
0
        public static void RotateToTarget(
            GameObject self,
            SpaceShipContainer container)
        {
            var   heading = container.Target.transform.position - self.transform.position;
            float angle   = Mathf.Atan2(heading.y, heading.x) * Mathf.Rad2Deg;

            self.transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
        }
Ejemplo n.º 6
0
        public static void RotateBySpeed(
            GameObject self,
            SpaceShipContainer container)
        {
            float angle = Mathf.Atan2(container.MovementBehaviour.Velocity.y,
                                      container.MovementBehaviour.Velocity.x) * Mathf.Rad2Deg;

            self.transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
        }
Ejemplo n.º 7
0
        private static Func <bool> TargetCheckMiddleware(SpaceShipContainer container) =>
        () =>
        {
            if (container.Target == null)
            {
                container.StateMachine.Push(ShipStates.SearchingOfTarget);
                return(false);
            }

            return(true);
        };
Ejemplo n.º 8
0
Archivo: Movements.cs Proyecto: UDK/SoV
        public static void CircleAroundTarget(GameObject self, GameObject target, SpaceShipContainer container)
        {
            var distance = Vector2.Distance(
                container.Homing.transform.position,
                self.transform.position);

            if (distance > container.SightDist)
            {
                Movements.HeadToTarget(self, container.Homing, container);
                return;
            }
            Movements.MoveByCircle(self, container.Homing, container);
        }
Ejemplo n.º 9
0
        public static Action SearchTarget(
            GameObject self,
            SpaceShipContainer container) =>
        () =>
        {
            Ray enemyRay = new Ray(
                self.transform.position,
                self.transform.forward * container.SightDist);

            float halfAngle = container.VisionAngle / container.RayCount * (container.RayCount * 0.5f);
            for (int i = 0; i < container.RayCount; i++)
            {
                float   angle     = i * (container.VisionAngle / (container.RayCount - 1));
                Vector3 direction = Quaternion.AngleAxis(
                    self.transform.localRotation.eulerAngles.z + angle - halfAngle,
                    self.transform.forward) * Vector3.right;

                Debug.DrawRay(self.transform.position, direction * container.SightDist, Color.red, 0.1f);
                var filter = new ContactFilter2D();
                filter.NoFilter();
                RaycastHit2D[] raycastHits = new RaycastHit2D[10];
                var            rayHit      = Physics2D.Raycast(
                    self.transform.position,
                    direction,
                    filter,
                    raycastHits,
                    container.SightDist);

                container.Targets = raycastHits.Select(x => x.collider?.gameObject).ToArray();
                foreach (var t in container.Targets)
                {
                    var go = t?.GetComponent <IGameplayObject>();
                    if (go != null &&
                        go.AllianceGuid != container.AllianceGuid)
                    {
                        container.Target = t;
                        container.StateMachine.Push(
                            States.ShipStates.Attacking);
                        return;
                    }
                }
            }

            Movements.CircleAroundTarget(self, container.Homing, container);
            Rotations.RotateBySpeed(self, container);
        };
Ejemplo n.º 10
0
 private static void BombingAttackStrategy(
     GameObject self,
     SpaceShipContainer container)
 {
     container.StateMachine
     .Set(
         ShipStates.Moving,
         Middleware(
             TargetCheckMiddleware(container),
             Movements.GoAfterTarget(self, container)))
     .Set(
         ShipStates.SearchingOfTarget,
         TargetSearchings.SearchTarget(self, container))
     .Set(
         ShipStates.Attacking,
         Middleware(
             TargetCheckMiddleware(container),
             Attacks.Back(self, container)));
 }
Ejemplo n.º 11
0
Archivo: Attacks.cs Proyecto: UDK/SoV
        public static Action Back(
            GameObject self,
            SpaceShipContainer container) =>
        () =>
        {
            Vector3 toTarget = (container.Target.transform.position - self.transform.position).normalized;
            var     dot      = Vector3.Dot(
                self.transform.right,
                toTarget);

            foreach (var weapon in container.Weapons)
            {
                weapon.Attack(container.Target, container.AllianceGuid);
            }
            var distance = Vector2.Distance(
                container.Target.transform.position,
                self.transform.position);

            if (dot < -0.60 &&
                distance > container.AttackDistance * 2)
            {
                container.StateMachine.Push(
                    ShipStates.Moving);
            }
            else if (dot < 0)
            {
                if (dot < -0.5)
                {
                    Movements.MoveByCircle(self, container.Target, container);
                }
                container.MovementBehaviour.SmoothlySetVelocity(
                    container.MovementBehaviour.Velocity.normalized *
                    container.MovementBehaviour.MaxVelocity);
            }
            else
            {
                Movements.MoveByCircle(self, container.Target, container);
            }

            Rotations.RotateBySpeed(self, container);
        };
Ejemplo n.º 12
0
Archivo: Attacks.cs Proyecto: UDK/SoV
        public static Action CircleAround(
            GameObject self,
            SpaceShipContainer container) =>
        () =>
        {
            foreach (var weapon in container.Weapons)
            {
                weapon.Attack(container.Target, container.AllianceGuid);
            }

            var distance = Vector2.Distance(
                container.Target.transform.position,
                self.transform.position);
            if (distance > container.AttackDistance)
            {
                container.StateMachine.Push(
                    ShipStates.Moving);
                return;
            }

            Movements.MoveByCircle(self, container.Target, container);
            Rotations.RotateBySpeed(self, container);
        };
Ejemplo n.º 13
0
Archivo: Attacks.cs Proyecto: UDK/SoV
        public static Action Distance(
            GameObject self,
            SpaceShipContainer container) =>
        () =>
        {
            Rotations.RotateToTarget(self, container);

            foreach (var weapon in container.Weapons)
            {
                weapon.Attack(container.Target, container.AllianceGuid);
            }

            var distance = Vector2.Distance(
                container.Target.transform.position,
                self.transform.position);
            if (distance > container.AttackDistance)
            {
                container.StateMachine.Push(
                    ShipStates.Moving);
                return;
            }

            container.MovementBehaviour.SetVelocity(Vector3.zero);
        };