这次要实现一个简单的太阳系,太阳本身自带光源,其他星球围绕太阳的转速不一样(越远的公转越慢),且不在一个法平面上。
首先,在场景中创建1个太阳和9大行星,然后将它们分别命名。9大行星的排列顺序是:水星、金星、地球、火星、木星、土星、天王星、海王星、冥王星?然后将它们延X轴依次排列开,这样做的目的是可以很容易知道行星的旋转法线是(0,Y,Z),因此要确保行星不在一个法平面上,只需确保Y/Z不相等即可。
我希望把太阳和其它行星区分开来,我决定给太阳以光明(我说要有光)。怎么办呢?Unity中并没有自发光组件,如果我们尝试在太阳上添加一个点光源,那么你肯定会发现奇怪的现象,太阳本身不发光,却会照亮他人...
所以我使用了Unity第三方插件Glow11,Unity载入插件的方法:menu->Assests->import package->custom package,注意路径不能有中文。Glow11的使用方法:在主摄像机上添加Glow11组件,创建一个Material材质球,选择Shader为Glow11的自发光shader,将材质球挂载到Sun对象上,调整材质球和点光源颜色即可。
接下来就是写脚本啦,脚本很简单,主要使用了Transform对象的RotateAround方法。该方法接受3个参数,第一个是围绕的旋转点,在这里即太阳的位置,第二个是旋转的法向量,在这里法向量在(0,Y,Z)平面上,第三个是旋转的速度。为了方便设置旋转中心和速度,我将它们设置成了公有变量。
public class rotate : MonoBehaviour {
public Transform origin;
public float speed = 20;
float ry, rz;
void Start() {
ry = Random.Range(1, 360);
rz = Random.Range(1, 360);
}
void Update () {
Vector3 axis = new Vector3(0, ry, rz);
this.transform.RotateAround(origin.position, axis, speed*Time.deltaTime);
}
}
随机Y和Z让行星尽量不在一个法平面上旋转。将脚本挂载到每一个行星上面,并设置好旋转中心(太阳)和旋转速度即可。
为了让行星运行的轨迹显现出来,可以给每个行星添加足迹组件(effects->trailer render):