Cosmic Strike
 
Cargando...
Buscando...
Nada coincide
ErraticMovement.cs
Ir a la documentación de este archivo.
1
8
9using UnityEngine;
10
16public class ErraticMovement : MonoBehaviour
17{
18 // ========== CONFIGURACIÓN DE MOVIMIENTO ==========
19
23 [Header("Movimiento Errático")]
24 [Tooltip("Velocidad de movimiento en unidades/segundo")]
25 public float speed = 2f;
26
30 [Tooltip("Tiempo en segundos entre cambios de dirección")]
31 public float changeInterval = 3f;
32
33 // ========== LÍMITES DE MOVIMIENTO EN COORDENADAS DE VIEWPORT ==========
34
35 [Header("Límites de Viewport (0–1)")]
36
40 [Tooltip("Margen horizontal mínimo (viewport x)")]
41 public float minX = 0.04f;
42
46 [Tooltip("Margen horizontal máximo (viewport x)")]
47 public float maxX = 0.96f;
48
53 [Tooltip("Margen superior máximo (viewport y)")]
54 public float maxY = 0.94f;
55
56 // ========== CONFIGURACIÓN DE ROTACIÓN SUAVIZADA ==========
57
58 [Header("Rotación Suavizada")]
59
64 [Tooltip("Velocidad angular (grados/seg) para rotación progresiva")]
65 public float rotationSpeed = 500f;
66
67 // ========== VARIABLES INTERNAS ==========
68
72 private Vector2 moveDirection;
73
77 private float timer;
78
82 private Transform myTransform;
83
87 private Camera myCamera;
88
92 void Start()
93 {
94 myTransform = transform; // Se guarda el transform local para eficiencia
95 myCamera = Camera.main; // Se accede a la cámara principal
96 PickNewDirection(); // Selecciona una dirección inicial aleatoria
97 timer = 0f; // Inicializa el temporizador
98 AlignRotation(moveDirection); // Ajusta rotación al inicio según dirección elegida
99 }
100
105 void Update()
106 {
107 // 1) Avanza el temporizador y cambia de dirección si ha pasado el intervalo definido
108 timer += Time.deltaTime;
109 if (timer >= changeInterval)
110 {
112 timer = 0f;
113 }
114
115 // 2) Aplica el movimiento en el mundo usando la dirección actual
116 myTransform.Translate(moveDirection * speed * Time.deltaTime, Space.World);
117
118 // 3) Convierte posición mundial a coordenadas del viewport para verificar los bordes
119 Vector3 vp = myCamera.WorldToViewportPoint(myTransform.position);
120 bool hitSide = vp.x <= minX || vp.x >= maxX; // ¿Tocó borde izquierdo o derecho?
121 bool hitTop = vp.y >= maxY; // ¿Tocó el borde superior?
122
123 if (hitSide || hitTop)
124 {
125 // Cambio inmediato de dirección si toca los bordes definidos
127
128 // Ajusta la posición para que no se salga visualmente del área permitida
129 vp.x = Mathf.Clamp(vp.x, minX, maxX);
130 if (vp.y > maxY) vp.y = maxY;
131 myTransform.position = myCamera.ViewportToWorldPoint(vp);
132 }
133
134 // 4) Gira suavemente el objeto hacia la dirección actual
136 }
137
142 private void PickNewDirection()
143 {
144 float angleRad = Random.Range(0f, 360f) * Mathf.Deg2Rad;
145 moveDirection = new Vector2(Mathf.Cos(angleRad), Mathf.Sin(angleRad)).normalized;
146 }
147
153 private void AlignRotation(Vector2 dir)
154 {
155 if (dir.sqrMagnitude < 0.001f) return; // Si la dirección es casi cero, no se rota
156
157 // Calcula el ángulo deseado en grados
158 float targetAngle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90f;
159 Quaternion targetRot = Quaternion.Euler(0f, 0f, targetAngle);
160
161 // Aplica rotación suavizada hacia el ángulo objetivo
162 myTransform.rotation = Quaternion.RotateTowards(
163 myTransform.rotation,
164 targetRot,
165 rotationSpeed * Time.deltaTime
166 );
167 }
168}
Componente que aplica movimiento errático con rotación suave a un objeto. Cambia de dirección al azar...
void AlignRotation(Vector2 dir)
Rota el objeto suavemente para que su eje "up" apunte en la dirección indicada. Usa Quaternion....
Transform myTransform
Referencia local al Transform del objeto (para optimizar acceso repetido).
float timer
Cronómetro interno que controla cuándo cambiar la dirección de movimiento.
float speed
Velocidad de desplazamiento del objeto, medida en unidades de Unity por segundo.
void Update()
Método que se ejecuta en cada frame. Controla el movimiento, cambio de dirección, detección de colisi...
Camera myCamera
Referencia a la cámara principal, usada para convertir entre mundo y viewport.
void Start()
Método de inicialización de Unity. Se ejecuta al comenzar la escena o activar el objeto.
float minX
Límite izquierdo en coordenadas normalizadas de pantalla (0 = borde izquierdo, 1 = borde derecho).
void PickNewDirection()
Selecciona una nueva dirección aleatoria en el plano XY. El ángulo se elige en un rango completo de 3...
float maxX
Límite derecho en coordenadas normalizadas de pantalla.
float maxY
Límite superior en coordenadas normalizadas (1 = parte superior de la pantalla). Si se supera,...
float changeInterval
Intervalo en segundos tras el cual el objeto elige una nueva dirección aleatoria.
Vector2 moveDirection
Dirección actual de movimiento del objeto, como vector normalizado.
float rotationSpeed
Velocidad máxima a la que puede girar el objeto para alinearse con su nueva dirección,...