Jiahonzheng's Blog

Unity 模拟太阳系

字数统计: 461阅读时长: 1 min
2019/09/19 Share

写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。

本篇博客,旨在使用 Unity3D 模拟太阳系星体的公转、自转运动。

项目地址github.com/Jiahonzheng/Unity-3D-Learning

在线演示demo.jiahonzheng.cn/Solar-System

演示视频Unity 模拟太阳系

GameObject

为实现一个完整的太阳系的模拟,我们需要 Sphere 模拟太阳系中的各个星体:SunMercuryVenusEarthMarsJupiterSaturnUranusNeptune。注意到,Moon 是归属于 Earth 的子对象。

为了使得星体更为逼真,我们基于 Surface 中的图片制作了各星体的 Material

公转

Revolution 是星体公转的脚本代码,其中的 center 指明公转运动的中心,即指明绕谁公转。我们在 Start 函数中,随机设置公转速度,以及公转法平面 (x, y, 0) 。在 Update 函数中,使用 RotateAround 函数进行公转的模拟。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Revolution : MonoBehaviour
{
public Transform center;
private float speed;
private float x;
private float y;

// Start is called before the first frame update
void Start()
{
speed = Random.Range(9, 12);
x = Random.Range(-50, 50);
y = Random.Range(-50, 50);
}

// Update is called once per frame
void Update()
{
var axis = new Vector3(0, x, y);
transform.RotateAround(center.position, axis, speed * Time.deltaTime);
}
}

自转

Rotation 是星体自转运动的脚本代码。我们在 Update 函数中,使用 RotateAround 使得星体绕着星体所在位置的 Vector3.up 进行旋转,来模拟星体的自转运动。

1
2
3
4
5
6
7
8
public class Rotation : MonoBehaviour
{
// Update is called once per frame
void Update()
{
transform.RotateAround(transform.position, Vector3.up, Random.Range(1, 3));
}
}

演示

在线演示demo.jiahonzheng.cn/Solar-System

演示视频Unity 模拟太阳系

为了记录星体运动轨迹,我们为各个星体添加了 Trail Renderer 组件。

注意:Trail Renderer 需要设置 Material 才可显示所设置的颜色。

CATALOG
  1. 1. GameObject
  2. 2. 公转
  3. 3. 自转
  4. 4. 演示