, поэтому я пытаюсь создать программу, которая позволяет астероидам в поле притягиваться друг к другу, например: https://www.youtube.com/watch?v=iAWZwTWJmhM
У меня есть две программы для этого, один случайным образом генерирует астероиды, другой прикладывает гравитационную силу к каждому объекту. проблема в том, что астероиды будут становиться быстрее по мере приближения, пока они не наберут скорость пули, а приложенные силы заставят их отстреливаться друг от друга и исчезать. Есть ли способ заставить их отрицать свои силы при контакте. Я попробовал Rigidbody.isKinemati c, но это делает астероиды все еще вместо того, чтобы вращаться, как в космосе. Я опубликую код ниже, но вот два проекта, из которых я использую код. https://www.youtube.com/watch?v=Ouu3D_VHx9o https://www.youtube.com/watch?v=6rTfZ2ox2_g
Код для астероида. Я добавил в генератор случайных масштабов.: * 10101
Программа для применения гравитации:
'' '
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Attractor : MonoBehaviour
{
const float G = 667.4f;
public static List<Attractor> Attractors;
public Rigidbody rb;
void FixedUpdate()
{
foreach (Attractor attractor in Attractors)
{
if (attractor != this)
Attract(attractor);
}
}
void OnEnable()
{
if (Attractors == null)
Attractors = new List<Attractor>();
Attractors.Add(this);
}
void OnDisable()
{
Attractors.Remove(this);
}
void Attract(Attractor objToAttract)
{
Rigidbody rbToAttract = objToAttract.rb;
Vector3 direction = rb.position - rbToAttract.position;
float distance = direction.magnitude;
if (distance == 0f)
return;
float forceMagnitude = G * (rb.mass * rbToAttract.mass) / Mathf.Pow(distance, 2);
Vector3 force = direction.normalized * forceMagnitude;
if (distance == 0)
force = force * 0;
rbToAttract.AddForce(force);
}
}
' ''