initial commit
This commit is contained in:
80
Assets/Scripts/Lesson_1/SatelliteOrbit.cs
Normal file
80
Assets/Scripts/Lesson_1/SatelliteOrbit.cs
Normal file
@@ -0,0 +1,80 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user