Почему объекты раздвигаются, хотя они должны двигаться навстречу друг другу? - PullRequest
0 голосов
/ 04 апреля 2020

Я устал ... Я пытался сделать простой 2-й планетарный шутер и начал с создания моей собственной физики c с законом всемирного тяготения Ньютона (что-то подобное), но мой код не работает - тела движутся друг от друга, в то время как коллайдеры сталкиваются, и я не знаю почему. (даже по инерции). Итак, я попытался скопировать и вставить код из другого StackOverflow, но он тоже не работает. Просьба о помощи! https://imgur.com/qvnLxSk

using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(CircleCollider2D), typeof(CircleCollider2D))]
public class MassEffect : MonoBehaviour
{
    //public GameObject player;
    private float gRadius = 5f;
    public float rotSpeed = 0.5f;
    public float gravitation = 50f;




    private HashSet<Rigidbody2D> affectedBodies = new HashSet<Rigidbody2D>();
    private Rigidbody2D componentRigidbody;
    private CircleCollider2D gTrigger;

    private void Start()
    {
        componentRigidbody = GetComponent<Rigidbody2D>();
        gTrigger = GetComponents<CircleCollider2D>()[1];
        gTrigger.isTrigger = true;
        gTrigger.radius = gRadius / transform.localScale.x;
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        var rbInRadius = other.GetComponent<Rigidbody2D>();
        if (rbInRadius != null)
        {
            affectedBodies.Add(rbInRadius);
        }
    }

    private void OnTriggerExit2D(Collider2D other)
    {
        var rbInRadius = other.GetComponent<Rigidbody2D>();
        if (rbInRadius != null)
        {
            affectedBodies.Remove(rbInRadius);
        }
    }

    private void FixedUpdate()
    {    

        transform.Rotate(Vector3.forward * rotSpeed);

        foreach (var objectInVicinity in affectedBodies)
        {
            if (objectInVicinity == null)
            {
                affectedBodies.Remove(objectInVicinity);
                break;
            }

            float dist = Vector2.Distance(transform.position, objectInVicinity.transform.position);
            float gravitationFactor = 1 - dist / gRadius;
            Vector2 force = (transform.position - objectInVicinity.transform.position).normalized * gravitation * gravitationFactor;
            objectInVicinity.AddForce(force);
        }
    }
    void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, gRadius);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...