[教學]一起來開發遊戲吧 - 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 中。
<下載>
<PPT> <Unity Project>
<下章預告>
正式進入以製作迷你遊戲 Project 作範例的章節。
C# 的說明會有更詳細和整理好的說明。
C# 的說明會有更詳細和整理好的說明。
第一個 Project 會先以創作所需的準備功夫為主,也就是在開始動 Unity 前的準備功夫。
因為是第一個 Project,所以這部份會特別重點詳說。
留言