1. 程式人生 > >Unity3d入門作——做一個簡單的太陽系(一)

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