using UnityEngine; using System.Collections; public class CharacterController : MonoBehaviour { public int CharacterId { get; set; } public bool IsMoving { get; private set; } public bool IsAnimationComplete { get; private set; } [SerializeField] public int blockSubroutine { get; set; } private float _moveSpeed = 200f; private Vector3 _originalPosition; void Start() { _originalPosition = transform.position; } public void MoveToGameCoordinates(uint gameX, uint gameZ, uint endAction, uint speed) { IsMoving = true; IsAnimationComplete = false; // Конвертируем игровые координаты в мировые float x = ResourceManager.ConvertGameCoordinate(gameX); float z = ResourceManager.ConvertGameCoordinate(gameZ); float y = transform.position.y; Vector3 targetPosition = new Vector3(x, y, z); float speedMultiplier = speed == 1 ? 2f : 1f; StartCoroutine(MoveCoroutine(targetPosition, speedMultiplier, endAction)); } private IEnumerator MoveCoroutine(Vector3 targetPosition, float speedMultiplier, uint endAction) { float currentSpeed = _moveSpeed * speedMultiplier; float journeyLength = Vector3.Distance(transform.position, targetPosition); float startTime = Time.time; Vector3 startPosition = transform.position; while (Vector3.Distance(transform.position, targetPosition) > 0.1f) { float distCovered = (Time.time - startTime) * currentSpeed; float fractionOfJourney = distCovered / journeyLength; transform.position = Vector3.Lerp(startPosition, targetPosition, fractionOfJourney); yield return null; } transform.position = targetPosition; // Применяем конечный поворот ApplyEndAction(endAction); IsMoving = false; IsAnimationComplete = true; } private void ApplyEndAction(uint endAction) { switch (endAction) { case 1: // Поворот на 90° transform.rotation = Quaternion.Euler(0, 90f, 0); break; case 2: // Поворот на 180° transform.rotation = Quaternion.Euler(0, 180f, 0); break; case 3: // Поворот на 270° transform.rotation = Quaternion.Euler(0, 270f, 0); break; } } public void PlayAnimation(int animationId, int repeatCount) { IsAnimationComplete = false; StartCoroutine(AnimationCoroutine(animationId, repeatCount)); } private IEnumerator AnimationCoroutine(int animationId, int repeatCount) { Vector3 startPosition = transform.position; for (int i = 0; i < Mathf.Max(1, repeatCount); i++) { // Простая анимация - поднимаем и опускаем объект transform.position = startPosition + Vector3.up * 50f; yield return new WaitForSeconds(0.1f); transform.position += Vector3.down * 50f; yield return new WaitForSeconds(0.1f); } IsAnimationComplete = true; } public void StopAllActions() { StopAllCoroutines(); IsMoving = false; IsAnimationComplete = true; } }