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); } }
/// <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)); }
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); }
/// <summary> /// Вращение героя за позицией мыши /// </summary> private void RotateHero() { var eyeDirection = currentCamera.ScreenToWorldPoint(Input.mousePosition) - transform.position; _rb.MoveRotation(RotationUtil.ToDirection(eyeDirection)); }
/// <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)); }
/// <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)); }
public void South_RotateRight_ExpectWest() { Direction d = RotationUtil.RotateRight(Direction.SOUTH); Assert.AreEqual(Direction.WEST, d); }
public void West_RotateRight_ExpectNorth() { Direction d = RotationUtil.RotateRight(Direction.WEST); Assert.AreEqual(Direction.NORTH, d); }
public void North_RotateRight_ExpectEast() { Direction d = RotationUtil.RotateRight(Direction.NORTH); Assert.AreEqual(Direction.EAST, d); }
public void East_RotateRight_ExpectSouth() { Direction d = RotationUtil.RotateRight(Direction.EAST); Assert.AreEqual(Direction.SOUTH, d); }
public void South_RotateLeft_ExpectEast() { Direction d = RotationUtil.RotateLeft(Direction.SOUTH); Assert.AreEqual(Direction.EAST, d); }
public void West_RotateLeft_ExpectSouth() { Direction d = RotationUtil.RotateLeft(Direction.WEST); Assert.AreEqual(Direction.SOUTH, d); }
public void North_RotateLeft_ExpectWest() { Direction d = RotationUtil.RotateLeft(Direction.NORTH); Assert.AreEqual(Direction.WEST, d); }
public void East_RotateLeft_ExpectNorth() { Direction d = RotationUtil.RotateLeft(Direction.EAST); Assert.AreEqual(Direction.NORTH, d); }
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); }