1. 程式人生 > >Unity3D學習筆記(3)—— 製作簡單的太陽系

Unity3D學習筆記(3)—— 製作簡單的太陽系

        這次要實現一個簡單的太陽系,太陽本身自帶光源,其他星球圍繞太陽的轉速不一樣(越遠的公轉越慢),且不在一個法平面上。

        首先,在場景中建立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):

最終執行結果