81 lines
2.2 KiB
C#
81 lines
2.2 KiB
C#
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);
|
||
}
|
||
}
|