Пример #1
0
        private IEnumerator VaultEnumerator(bool vaultOver)
        {
            AnimationCurve vaultCurve = vaultOver ? vaultOverCurve : vaultOnCurve;

            Vector3 vaultStartPosition  = transform.position;
            float   vaultStartRotationY = transform.eulerAngles.y;

            while (true)
            {
                float vaultProgress = (1 / vaultDuration) * vaultTime;

                if (vaultProgress >= 1f)
                {
                    vaultTime  = 0f;
                    isVaulting = false;
                    break;
                }

                float vaultDistance = ((maxVaultRange + maxRange) / vaultDuration) * vaultTime;
                float vaultHeight   = vaultCurve.Evaluate(vaultProgress);

                Vector3 vaultDistanceVector  = new Vector3(0, 0, vaultDistance);
                Vector3 currentVaultPosition = RotationUtil.GetVector(0, vaultStartRotationY, 0, vaultDistanceVector,
                                                                      vaultStartPosition, Vector3.one);
                currentVaultPosition.y += vaultHeight;

                rigidbody.velocity = Vector3.zero;
                rigidbody.position = currentVaultPosition;

                vaultTime += Time.deltaTime;
                yield return(null);
            }
        }
Пример #2
0
        /// <summary>
        /// Устанавливает направление движения и скорость для преследования цели
        /// </summary>
        private void FixedUpdate()
        {
            var distance = _enemyTarget.position - _rb.position;

            //остановить движение, если подошли вплотную к цели
            if (distance.magnitude <= 0.05)
            {
                _rb.velocity = Vector2.zero;
                return;
            }

            var direction = distance.normalized;

            _rb.velocity = direction * EnemyData.SpeedCoefficient;
            _rb.MoveRotation(RotationUtil.ToDirection(direction));
        }
Пример #3
0
        private void Update()
        {
            moveInput.x = Input.GetAxis("Horizontal");
            moveInput.z = Input.GetAxis("Vertical");

            Vector3 rightVector = RotationUtil.GetVector(0, transform.eulerAngles.y, 0, Vector3.right, transform.position, Vector3.one);
            Vector3 right       = rightVector - transform.position;

            Vector3 forwardVector = RotationUtil.GetVector(0, transform.eulerAngles.y, 0, Vector3.forward,
                                                           transform.position, Vector3.one);
            Vector3 forward = forwardVector - transform.position;

            moveDirection = right * moveInput.x + forward * moveInput.z;

            rigidbody.velocity += moveDirection;
            rigidbody.velocity  = Vector3.ClampMagnitude(rigidbody.velocity, maxMovementSpeed);
        }
Пример #4
0
        /// <summary>
        /// Вращение героя за позицией мыши
        /// </summary>
        private void RotateHero()
        {
            var eyeDirection = currentCamera.ScreenToWorldPoint(Input.mousePosition) - transform.position;

            _rb.MoveRotation(RotationUtil.ToDirection(eyeDirection));
        }
Пример #5
0
 /// <summary>
 /// Utilizes RotationUtil class - turn right
 /// </summary>
 /// <param name="d">The current direction</param>
 /// <returns>Return new direction</returns>
 protected Direction TurnRight(Direction d)
 {
     return(RotationUtil.RotateRight(d));
 }
Пример #6
0
 /// <summary>
 /// Utilizes RotationUtil class - turn left
 /// </summary>
 /// <param name="d">The current direction</param>
 /// <returns>Return new direction</returns>
 protected Direction TurnLeft(Direction d)
 {
     return(RotationUtil.RotateLeft(d));
 }
Пример #7
0
        public void South_RotateRight_ExpectWest()
        {
            Direction d = RotationUtil.RotateRight(Direction.SOUTH);

            Assert.AreEqual(Direction.WEST, d);
        }
Пример #8
0
        public void West_RotateRight_ExpectNorth()
        {
            Direction d = RotationUtil.RotateRight(Direction.WEST);

            Assert.AreEqual(Direction.NORTH, d);
        }
Пример #9
0
        public void North_RotateRight_ExpectEast()
        {
            Direction d = RotationUtil.RotateRight(Direction.NORTH);

            Assert.AreEqual(Direction.EAST, d);
        }
Пример #10
0
        public void East_RotateRight_ExpectSouth()
        {
            Direction d = RotationUtil.RotateRight(Direction.EAST);

            Assert.AreEqual(Direction.SOUTH, d);
        }
Пример #11
0
        public void South_RotateLeft_ExpectEast()
        {
            Direction d = RotationUtil.RotateLeft(Direction.SOUTH);

            Assert.AreEqual(Direction.EAST, d);
        }
Пример #12
0
        public void West_RotateLeft_ExpectSouth()
        {
            Direction d = RotationUtil.RotateLeft(Direction.WEST);

            Assert.AreEqual(Direction.SOUTH, d);
        }
Пример #13
0
        public void North_RotateLeft_ExpectWest()
        {
            Direction d = RotationUtil.RotateLeft(Direction.NORTH);

            Assert.AreEqual(Direction.WEST, d);
        }
Пример #14
0
        public void East_RotateLeft_ExpectNorth()
        {
            Direction d = RotationUtil.RotateLeft(Direction.EAST);

            Assert.AreEqual(Direction.NORTH, d);
        }
Пример #15
0
        private void Update()
        {
            if (isVaulting)
            {
                return;
            }

            Vector3 aroundPosition = RotationUtil.GetVector(0, transform.eulerAngles.y, 0f, Vector3.forward,
                                                            transform.position, Vector3.one);

            Vector3 directionVector = aroundPosition - transform.position;

            directionVector = directionVector.normalized;

            Vector3 castPosition = transform.position;

            castPosition.y += 0.2f;

            RaycastHit[] hits = Physics.RaycastAll(castPosition, directionVector, maxRange);

            Debug.DrawRay(castPosition, directionVector * maxRange, Color.magenta);

            GameObject vaultableObject      = null;
            Vector3    vaultableImpactPoint = Vector3.zero;

            for (int i = 0; i < hits.Length; i++)
            {
                RaycastHit hit = hits[i];

                if (hit.transform.gameObject.layer != 9)
                {
                    continue;
                }

                Debug.DrawRay(hit.point, Vector3.up * 2f, Color.green, vaultDuration);

                vaultableObject      = hit.transform.gameObject;
                vaultableImpactPoint = hit.point;

                break;
            }

            if (vaultableObject == null)
            {
                return;
            }

            bool willVaultOver = true;

            Vector3 vaultOverTargetPosition = vaultableImpactPoint + (directionVector * maxVaultRange);

            float castHeight = 2f;

            castPosition    = vaultOverTargetPosition;
            castPosition.y += castHeight;

            hits = Physics.RaycastAll(castPosition, Vector3.down, 2f);

            for (int i = 0; i < hits.Length; i++)
            {
                RaycastHit hit = hits[i];

                if (hit.transform.gameObject == vaultableObject)
                {
                    willVaultOver = false;
                }
            }

            Debug.DrawRay(castPosition, Vector3.down * castHeight, willVaultOver ? Color.green : Color.red,
                          vaultDuration, false);

            DoVault(willVaultOver);
        }