Как сделать так, чтобы объекты, притягивающиеся друг к другу, не забывались в Unity3D? - PullRequest
1 голос
/ 04 мая 2020

, поэтому я пытаюсь создать программу, которая позволяет астероидам в поле притягиваться друг к другу, например: 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);

}

}

' ''

...