using UnityEngine; public class SatelliteOrbit : MonoBehaviour { [Tooltip("Точка, навколо якої обертається супутник")] public Transform center; [Tooltip("Радіус орбіти")] public float radius = 5f; [Tooltip("Швидкість зміни кута в градусах за секунду")] public float angularSpeed = 50f; [Tooltip("Чи дивитись супутнику на центр під час руху")] public bool lookAtCenter = false; private float angleTheta; // горизонтальний кут (навколо Y) private float anglePhi; // вертикальний кут (від 0 до 180) void Start() { radius = Random.Range(300, 600); angularSpeed = Random.Range(5, 25); lookAtCenter = true; if (center == null) { GameObject go = new GameObject("OrbitCenter"); go.transform.position = Vector3.zero; center = go.transform; } // Випадкові початкові кути для різних напрямків руху angleTheta = Random.Range(0f, 360f); anglePhi = Random.Range(0f, 180f); UpdatePosition(); } void Update() { // Змінюємо кути для створення сферичної орбіти angleTheta += angularSpeed * Time.deltaTime; // обертання навколо Y anglePhi += angularSpeed * 0.5f * Time.deltaTime; // нахил вгору/вниз if (angleTheta > 360f) angleTheta -= 360f; if (anglePhi > 360f) anglePhi -= 360f; UpdatePosition(); if (lookAtCenter) transform.LookAt(center.position); } private void UpdatePosition() { float thetaRad = angleTheta * Mathf.Deg2Rad; float phiRad = anglePhi * Mathf.Deg2Rad; // Сферичні координати → декартові float x = radius * Mathf.Sin(phiRad) * Mathf.Cos(thetaRad); float y = radius * Mathf.Cos(phiRad); float z = radius * Mathf.Sin(phiRad) * Mathf.Sin(thetaRad); transform.position = center.position + new Vector3(x, y, z); } }