using System.Collections.Generic; using UnityEngine; public class MoveAction : MonoBehaviour { private const float moveSpeed = 4f; private const float rotationSpeed = 10f; private const float stoppingDistance = 0.1f; private static readonly int isWalking = Animator.StringToHash("IsWalking"); [SerializeField] private Animator UnitAnimator; [SerializeField] private int MaxMoveDistance = 4; private Unit unit; public Vector3 TargetPosition { get; set; } private void Awake() { unit = GetComponent(); TargetPosition = transform.position; } private void Update() { if (Vector3.Distance(TargetPosition, transform.position) > stoppingDistance) { Vector3 moveDirection = (TargetPosition - transform.position).normalized; transform.position += moveSpeed * Time.deltaTime * moveDirection; transform.forward = Vector3.Lerp(transform.forward, moveDirection, rotationSpeed * Time.deltaTime); UnitAnimator.SetBool(isWalking, true); } else { UnitAnimator.SetBool(isWalking, false); } } public bool IsValidActionGridPosition(GridPosition gridPosition) => GetValidActionGridPositionList().Contains(gridPosition); private List GetValidActionGridPositionList() { List validGridPositionList = new(); GridPosition unitGridPosition = unit.GridPosition; for (int x = -MaxMoveDistance; x <= MaxMoveDistance; x++) { for (int z = -MaxMoveDistance; z <= MaxMoveDistance; z++) { GridPosition offsetGridPosition = new(x, z); GridPosition testGridPosition = unitGridPosition + offsetGridPosition; if (!LevelGrid.Instance.IsValidGridPosition(testGridPosition)) continue; //Only return valid grid positions if (unitGridPosition == testGridPosition) continue; //Same grid position where the unit is already at if (LevelGrid.Instance.HasAnyUnitOnGridPosition(testGridPosition)) continue; //Grid position already accopied with anther unit validGridPositionList.Add(testGridPosition); } } return validGridPositionList; } public void Move(GridPosition gridPosition) => TargetPosition = LevelGrid.Instance.GetWorldPosition(gridPosition); }