我如何使被彼此吸引的对象在Unity3D中不弹回而遗忘?

问题描述 投票:1回答:1

因此,我正在尝试制作一个程序,以使像这样的领域中的小行星相互吸引:https://www.youtube.com/watch?v=iAWZwTWJmhM

我有两个程序可以做到这一点,一个程序随机生成小行星,另一个程序对每个物体施加重力。问题在于,小行星越靠近它们就会越快,直到它们达到子弹速度,并且所施加的力导致它们相互射击并消失。有没有办法让他们消除接触力量。我尝试了Rigidbody.isKinematic,但是这使小行星保持静止,而不是像在太空中那样旋转。请在下面发布代码,但这是我正在使用的代码的两个项目。https://www.youtube.com/watch?v=Ouu3D_VHx9ohttps://www.youtube.com/watch?v=6rTfZ2ox2_g

小行星生成器的代码。我添加了随机比例尺生成器。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AsteroidFieldGenerator : MonoBehaviour
{
public Transform AsteroidPrefab;
public int fieldRadius = 50;
public int asteroidCount = 60;
public float SizeMinPercent = 1;
public float SizeMaxPercent = 100;
// Start is called before the first frame update
void Start()
{
    for (int loop = 0; loop < asteroidCount; loop++)
    {
        Instantiate(AsteroidPrefab, Random.insideUnitSphere * fieldRadius, Quaternion.identity);
        AsteroidPrefab.transform.localScale = Vector3.one * (Random.Range(SizeMinPercent, SizeMaxPercent) / 100);
    }

}

// Update is called once per frame
void Update()
{

}
}

应用重力程序:

'''

    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);

}

}

'''

所以我正在尝试制作一个程序,以使像这样的领域中的小行星相互吸引:https://www.youtube.com/watch?v=iAWZwTWJmhM我有两个程序可以做到这一点,一个随机...

unity3d game-physics hololens mesh-collider
1个回答
0
投票

您必须施加阻尼(阻力)力,类似于说大气阻力(空气阻力)。然后,系统的总能量将减少,这使粒子更有可能聚集在一起。因此,基本上,运动方程应该类似于

© www.soinside.com 2019 - 2024. All rights reserved.