Unity3d入門作——做一個簡單的太陽系(一)
簡介
這篇部落格主要介紹了怎麼簡單的使用Unity3d來搭建一個簡單的太陽系,以及做一個學習記錄,分享一下學習Unity3d的心得。
使用工具:Unity3d 5.5
實現
1.材料的管理
先是介面的選擇吧,這裡我選的是“2 by 3”的介面,我覺得這個介面的好處就是,能儘可能的把所有的工作視窗顯示出來吧。(其實是被同學安利的= =),至於怎麼調,下圖已說明:
由於行星大多數都是屬於球體,所以我們要新建一個球,新建的方法如下:
新建完成之後,就可以在Scene介面跟Game介面見到這個球了。改名什麼的也比較容易,在這就不說了。
然後就是將貼圖貼在球上,讓它看起來更加的真實。這裡我選了地球來做例子(誰叫我是地球人呢(笑))
在這個圖片裡,有幾個屬性是需要我們去了解的,先是Inspector,只要你點選了球的物件,那麼Inspector就會有它的屬性顯示出來,這裡就能改變它的屬性,比如說Transform屬性下的Position(位置),Rotation(轉向),Scale(放大倍數)。至於其它屬性,在此篇部落格上沒有用到,至於以後用到的時候,會說的。然後就是最右邊用來表示該工程的檔案的Assets資料夾,上課聽了老師說,檔案的存放最好是按照類別來存放,這樣才不會使得檔案型別變得混亂。一般就是Materials,Resources,Scripts三個資料夾,然後Materials是用來存放物件的材料的,而Resources就是用來存放資源,例如:Prefabs(預設)之類的東西,然後剩下的Scripts就是用來放置遊戲指令碼的。至於太陽系的Materials,在部落格的最後面我會給出。
然後,你只需要把Materials裡面的地球貼圖拖到你要的球體上,你就得到一個地球(模型)啦。
然後,在這裡要做一件重要的事情就是,你需要把你的地球模型,拖到Prefabs上,這是因為,當你的遊戲做大之後,你會有許多的物件,假如你的物件都在Hierarchy上的話,這會使得物件十分的混亂,為了整潔,將其拖到Prefabs上是個很好的解決方法,Hierarchy視窗只留下一些比較重要的物件就行了。至於剩下的星球,重複前面的工作,就可以製作出所有的球體啦。
然後我們再建立一個空的物件,並把他命名為Main,用來搭載我們的遊戲模型,以及指令碼,而遊戲物件的預製則由指令碼生成,這樣的管理方便我們的物件。然後把物件清除,保留預製就行了。
介面是十分的簡潔的,只有攝像機,燈光和控制遊戲的指令碼。
然後,我們就要編輯指令碼了。
2.指令碼的編輯
先在Scripts資料夾建立兩個指令碼檔案,Controller跟Director,其實Unity的指令碼可以用兩種語言來寫,分別是JavaScript跟C#,因為上課用的是C#,這裡也就用C#來寫了。
Director.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Director : System.Object {
//singlton instance
private static Director _instance;
public ISceneController currentSceneController { get; set; }
// get instance anytime anywhere!
public static Director getInstance() {
if (_instance == null) {
_instance = new Director ();
}
return _instance;
}
public int getFPS() {
return Application.targetFrameRate;
}
public void setFPS(int fps) {
Application.targetFrameRate = fps;
}
public interface ISceneController {
void LoadResources();
void Pause();
void Resume();
}
}
Controller.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Controller : MonoBehaviour, Director.ISceneController {
// the first scripts
void Awake() {
Director director = Director.getInstance ();
director.setFPS (60);
director.currentSceneController = this;
director.currentSceneController.LoadResources ();
}
Transform Sun;
Transform Mercury;
Transform Venus;
Transform Earth;
Transform Mars;
Transform Jupiter;
Transform Saturn;
Transform Uranus;
Transform Neptune;
// Loading resources for first scence
public void LoadResources() {
Sun = Instantiate<Transform> (
Resources.Load<Transform> ("prefabs/Sun"),
Vector3.zero, Quaternion.identity);
Mercury = Instantiate<Transform> (
Resources.Load<Transform> ("prefabs/Mercury"),
new Vector3 (2, 0, 0), Quaternion.identity);
Venus = Instantiate<Transform> (
Resources.Load<Transform> ("prefabs/Venus"),
new Vector3 (4, 0, 0), Quaternion.identity);
Earth = Instantiate<Transform> (
Resources.Load<Transform> ("prefabs/Earth"),
new Vector3 (6, 0, 0), Quaternion.identity);
Mars = Instantiate<Transform> (
Resources.Load<Transform> ("prefabs/Mars"),
new Vector3 (8, 0, 0), Quaternion.identity);
Jupiter = Instantiate<Transform> (
Resources.Load<Transform> ("prefabs/Jupiter"),
new Vector3 (10, 0, 0), Quaternion.identity);
Saturn = Instantiate<Transform> (
Resources.Load<Transform> ("prefabs/Saturn"),
new Vector3 (12, 0, 0), Quaternion.identity);
Uranus = Instantiate<Transform> (
Resources.Load<Transform> ("prefabs/Uranus"),
new Vector3 (14, 0, 0), Quaternion.identity);
Neptune = Instantiate<Transform> (
Resources.Load<Transform> ("prefabs/Neptune"),
new Vector3 (16, 0, 0), Quaternion.identity);
//named the sphere
Sun.name = "Sun";
Mercury.name = "Mercury";
Mercury.transform.parent = Sun.transform;
Venus.name = "Venus";
Venus.transform.parent = Sun.transform;
Earth.name = "Earth";
Earth.transform.parent = Sun.transform;
Mars.name = "Mars";
Mars.transform.parent = Sun.transform;
Jupiter.name = "Jupiter";
Jupiter.transform.parent = Sun.transform;
Saturn.name = "Saturn";
Saturn.transform.parent = Sun.transform;
Uranus.name = "Uranus";
Uranus.transform.parent = Sun.transform;
Neptune.name = "Neptune";
Neptune.transform.parent = Sun.transform;
}
// Use this for initialization
void Start() {
//give advice first
}
void Update() {
Mercury.RotateAround (Sun.position, new Vector3 (0, 1, 1), 1 * Time.deltaTime);
Mercury.Rotate (Vector3.up * 30 * Time.deltaTime);
Venus.RotateAround (Sun.position, new Vector3 (0, 2, 1), 2 * Time.deltaTime);
Venus.Rotate (Vector3.up * 30 * Time.deltaTime);
Earth.RotateAround (Sun.position, new Vector3 (0, 1, 2), 10 * Time.deltaTime);
Earth.Rotate (Vector3.up * 30 * Time.deltaTime);
Mars.RotateAround (Sun.position, new Vector3 (0, 1, 3), 4 * Time.deltaTime);
Mars.Rotate (Vector3.up * 30 * Time.deltaTime);
Jupiter.RotateAround (Sun.position, new Vector3 (0, 3, 1), 5 * Time.deltaTime);
Jupiter.Rotate (Vector3.up * 30 * Time.deltaTime);
Saturn.RotateAround (Sun.position, new Vector3 (0, 2, 3), 6 * Time.deltaTime);
Saturn.Rotate (Vector3.up * 30 * Time.deltaTime);
Uranus.RotateAround (Sun.position, new Vector3 (0, 3, 2), 7 * Time.deltaTime);
Uranus.Rotate (Vector3.up * 30 * Time.deltaTime);
Neptune.RotateAround (Sun.position, new Vector3 (0, 1, 5), 8 * Time.deltaTime);
Neptune.Rotate (Vector3.up * 30 * Time.deltaTime);
}
}
(這裡我用的是Unity自帶的MonoDevelop程式碼編輯器,比VS輕量,挺好用的,推薦編輯指令碼的時候可以使用這個。)
乍一看,程式碼貌似有點長,但其實是挺好理解的,Director指令碼負責單例項模型,而Controller指令碼則負責控制介面,裡面LoadResources負責載入資源,Instantiate函式表示從什麼地方生成一個怎樣的東西。然後就給生成的球體命名。而Update函式就負責遊戲的每一幀更新每一星球的位置(Update函式每一幀都會執行一次的),至於裡面的Rotate跟RotateAround需要去看官方文件去學習怎麼使用了。其實無非就是自身旋轉跟繞某個物件旋轉。裡面的方向跟速度什麼的都是我自己亂設的,沒有什麼含義,本篇部落格只是先做出一個簡單的太陽系,至於大小什麼的,還需要調整。儲存完之後,就可以在遊戲編輯頁面將指令碼拖到我們的Main物件啦。
調整調整燈光位置和照相機的位置,然後點執行,我們的太陽系就跑起來啦。
總結
我們搭的一個簡單的太陽系終於成功的跑起來啦,雖然真的是挺簡單的,很多功能都沒有實現,比如說,所有的星球都一樣大,太陽不會發光,背景不好看等問題,但是總的來說,這個太陽系的雛形已經體現出來了,至於怎麼把這個太陽系做得更加像我們的現實的太陽系,在我以後的部落格裡面,我會繼續更新的(正經臉)。
補充
由於擔心有些小夥伴看不懂英語,我在這裡補充八大行星的中英文對照表(捂臉),以下的排名部分先後(笑)。
中文 | 英文 |
---|---|
太陽 | Sun |
水星 | Mercury |
金星 | Venus |
地球 | Earth |
火星 | Mars |
木星 | Jupiter |
土星 | Saturn |
天王星 | Uranus |
海王星 | Neptune |