所以我正在尝试制作一个程序,允许一个领域中的小行星像这样相互吸引: https ://www.youtube.com/watch?v=iAWZwTWJmhM
我有两个程序可以做到这一点,一个随机生成小行星,另一个对每个物体施加引力。问题是小行星会随着它们越来越近而变得更快,直到它们达到子弹速度,并且施加的力使它们彼此远离并消失。有没有办法让他们在接触时抵消他们的力量。我尝试了 Rigidbody.isKinematic 但这使得小行星静止而不是像在太空中那样旋转。生病发布下面的代码,但这是我使用代码的两个项目。 https://www.youtube.com/watch?v=Ouu3D_VHx9o https://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);
}
}
'''