[教學]一起來開發遊戲吧 - Unity C# 基礎


在公開了準備入門教學的這星期開始,發現大部份完成 Unity 課程或自學 Unity 的新人們,最困難的地方還是程序方面,所以最初的內容更改成 Unity C# 基礎。

程式語言其實很單純,語言文法也很單調,來來去去就只有幾種,Unity 架構還比較複雜麻煩一點。
大多數新人都會神化了程序,除了忽略對 Unity 的認知須要,還會主觀或被引導向無意義地脫離 Unity 基本功能,因而嚴重缺乏對 Unity 本身的了解。

在正式開始教學 Project 前,先來了解 Unity 的基本運作流程,Editor 上和 C# 程序上如何作基本的簡單連動。

本教學中的圖不用另存起來,文末會有 PPT 和 Project 的下載連結。

本教學的目的和對象:<前言
本教學的目錄:<目錄

為方便看大圖,如使用 Chrome 的話,請安裝 <Hover Zoom+>。

程序並不是什麼困難的事情,學程序最重要還是要有一個目標,所以接著也是以一個簡單的 Project,實際去做一些小功能,從中理解這是怎麼做到。
雖說目標是很重要,但也不要一開始就去做天大的遊戲,應先以一些小型遊戲為目標,了解 Unity 的基本架構和運作,加深自己的程序編寫能力,以及累積自己編寫解決方案的經驗。


<Unity Editor 介面排版>


Unity 已經宣佈過,未來會以 Unity Hub 作更新,所以請轉用 Unity Hub。
如果對 Unity Editor 的架構和運作不熟悉,可以把 Layout 轉到下圖的排列。



<Editor 中的 GameObject>

遊戲世界只是一個什麼都沒有的空間,製作遊戲就是在這個空間中創建 GameObjects,也就是說 GameObject 是最重要的元素,所以先了解 GameObject 是什麼吧。




<創建一個 Script 劇本>

創建新的劇本,就是在 Assets 中新增一個劇本物件,預設已經可以成為 Component。
這裡為 Main Camera 追加一個劇本,以增加這個 Game Object 的功能。



<為什麼這個劇本可以成為一個 Component?>

這部份是一個劇本的基本架構。
Editor 是一個有使用者介面的 App,背後也只是一堆這樣的劇本組成。



<Unity 中程序的運作流程>

程序是很單純的,只會依照設計好的流程運作,絕不背叛!
所以先好好看懂流程圖是很重要,在編寫程序前能先做個流程圖的話,會更加有效率。



編寫程序>

編寫程序切勿心急一次把所有東西編寫,應把功能逐一編寫。
這裡先編寫 Initialization 初始化的部份。

接著寫第二個功能,這裡動用了 Coroutine,這是必須學習的東西,先從這個簡單的例子,請對照上面的兩個流程圖來消化其運作的程序。

以上程序請在理解後自行輸入至自己的 Project 中,不要依賴本人提供的 Project。
很快你就會發現做了不少東西,但寫出來的 C# 文法都是千篇一律。



<設定 GameObject

在播放實測前,先確定場境中的 GameObject 都設定好。

測試結果並不滿意,所以進入優化過程。


<程序優化

先試試理解圖中黃色部份為什麼是錯誤(提示:震動不自然和過劇的主因)。
程序基本就是數值的修正,數值連動到 GameObject,最後產生想要的效果;在處理後台程序時,我們必須有一定的聯想力,去思考眼前的程序會對 GameObject 產生什麼樣的影響。
所以,這裡就不說出答案了。



<優化後的 MainCamera.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraControl : MonoBehaviour
{
    [Header("Init")]
    public Vector3 startPosition = Vector3.zero;

    [Header("Shake Settings")]
    public float shakeTime = 0.15f;
    public float shakeMag = 0.05f;
    public float shakeInterval = 1.5f;

    // Local Use
    private Coroutine corouShake;

    private void Awake()
    {
        transform.position = startPosition;
    }

    private void Update()
    {
        if (corouShake == null)
            corouShake = StartCoroutine(Shake());
    }

    private IEnumerator Shake()
    {
        float timer = 0f;

        while (timer < shakeTime)
        {
            transform.position = new Vector3(
                startPosition.x + Random.Range(-shakeMag, shakeMag),
                startPosition.y + Random.Range(-shakeMag, shakeMag),
                startPosition.z
                );
            timer += Time.deltaTime;
            yield return null;
        }

        transform.position = startPosition;
        yield return new WaitForSeconds(shakeInterval);

        corouShake = null;
    }
}


<儲存 Runtime 時調整的 Component Value

這個很重要,每個新手和老手都會重複犯的錯誤!



<測試影片




<提示:runtime 修改 Component 的最後防線

Unity > Edit > Preference... 可以打開 Preference 窗格,把 Playmode tint 的顏色改了就可以提醒自己正在 runtime 中。



<下載


<下章預告
正式進入以製作迷你遊戲 Project 作範例的章節。
C# 的說明會有更詳細和整理好的說明。
第一個 Project 會先以創作所需的準備功夫為主,也就是在開始動 Unity 前的準備功夫。
因為是第一個 Project,所以這部份會特別重點詳說。

留言

此網誌的熱門文章

[瀬戸のテーマ] HTC Desire 最強體驗(S)預告