很多人學程式,是為了要做遊戲,
如果你是要做遊戲,
其實有很多很方便的工具,可以幫助我們快速開發的
Unity、Unreal、Cocos2D.....
要跟大家介紹,最近很熱門的遊戲製作工具 - Unity
為什麼要選Unity呢?
1. 跨平台支援
iOS、Android、Web,寫好一個遊戲可以在各平台發表
2. 架構完善
物理系統、動畫系統,可以快速實現你的創意
3. 國內多數企業採用
很多知名遊戲都是用Unity製作的!
本篇會一步一步帶大家完成一個2D小遊戲
每個步驟都有圖片說明,看起來很多,實際操作大概只要20分鐘
這個教學會分成3~4篇發佈
這篇教學分4個小節:
1. 安裝程式
2. 帶入物件
3. 移動飛機
4. 限制飛機移動的牆壁
1. 安裝程式
首先,當然就是下載Unity了
選Individual,然後選Personal
選Start here
點了以後會下載Unity hub,安裝後開啟程式
先在右上角登入你的帳號,沒有帳號就申請一個
登入後,選ACTIVE NEW LICENSE
選Unity Personal
然後小選項選哪個都沒差
註冊完後
選Install,然後點ADD
選最新的Official Releases
我們之後會用到Android套件,所以Android Build Support打勾
其他的套件如果有需要,也可以之後再下載
按NEXT
同意條款,按DONE
等待下載
下載完後,選Project,點NEW
我們要做一個類似小蜜蜂的射擊遊戲
1. 選2D
2. 輸入專案名稱
3. 選擇存放位置
4. 按 Create
打開之後會看到這樣的畫面
可能會稍微有點不一樣,版面是可以自由移動的
主要幾個重要的版面,物件、場景、屬性、素材
實際使用過後就會了解其功用了
這邊需要設定一下程式的環境,請參考這篇 Visual Studio設定Unity環境
2. 帶入物件
遊戲的圖片,考量到不是每個人都有繪圖軟體
所以用小畫家來製作
1. 拉出一個600 X 800像素的空白區域
2. 選油漆桶,然後選黑色,點一下空白區域,把整個區域塗黑
3. 存成png格式
遊戲的背景就完成了!
然後我們把背景圖片,直接拖曳到素材(Asset)那個區域
然後再把素材裡的背景圖片拖曳到場景(Sense)
我們的遊戲場景就有背景了!
我們可以看到物件(Hierarchy)那邊多了背景的物件
點選背景物件,屬性(Inspector)那邊就會出現背景的屬性
把Position的XYZ都設0,背景就會在畫面中間了
在Sorting Layer這邊開一層新的Layer來放我們的背景
按Add Sorting Layer
1. 按[+]圖示
2. 設定Layer名稱,打Background
3. 把Background移到Default上面,如下圖順序。如果順序不對,你之後放的東西都會被背景蓋住
新增了之後,點一下background物件
選取剛剛新增的sorting layer
3. 移動物件
背景做好了之後,開始用小畫家畫戰鬥機(50X50像素)
用小畫家沒辦法產生透明的區域
所以只能做出方型的物件
這個遊戲裡,背景是全黑的,看不出這個問題
畫好之後,一樣存成PNG格式
拖曳到素材區
然後再拖到場景裡
戰鬥機的起始位置放在中間偏下,在Position的地方
X設0,Y設-3,Z設0
然後我們要給他一個可以碰撞(Collider)的屬性
這樣他才能被其他東西碰到,像是敵人或是敵人的子彈
Add Component的下拉選單,選Physics 2D
選Box Collider 2D
選完之後,我們可以看到碰撞的外框
大小可以自由調整
我們把他調小一點,從0.5調到0.45
讓他被擊中的判定不要那麼嚴格,可以看到畫面裡的方框變小了
接著我們加入他的剛體(rigidbody)性質
讓他可以移動
Physics 2D裡的Rigidbody 2D
我們用不到重力
所以Gravity Scale選0
飛機不旋轉
Constraintsv下拉式表單打開
Freeze Rotation Z 打勾
接著我們要寫程式來控制飛機
Add Component選 New Script
輸入檔案名稱
語言選C# (新版本不用選程式語言)
然後按下面的Create and Add
在素材那邊就會出現C#的檔案
雙點可開啟程式編輯器
新版的Unity是用微軟的Visual Studio,所以畫面會有點不一樣
程式的內容是一樣的
程是主要分三個部分
使用套件:程式會用到的套件
void Start()區塊是啟動時會執行
void Update()區塊是更新時會執行,會即時確認
我們要讓飛機,按右箭頭就往右移動
按左箭頭就往左移動
所以寫在Update底下
if(Input.Getkey(KeyCode.RightArrow))
{
gameObject.transform.position += new Vector3(0.1f, 0, 0);
}
if (Input.GetKey(KeyCode.RightArrow))
if 如果
Input.GetKey 輸入.取得按鍵
KeyCode.RightArrow 按鍵碼.右箭頭鍵
這句的意思就是:如果按下右箭頭鍵,就會執行大括號{}裡面的敘述
gameObject.transform.position += new Vector3(0.1f,0,0);
gameObject.transform.position 物件位置
+= 加上
new Vector3 新的3D向量
(0.1f,0,0) (X方向, Y方向, Z方向),X方向移動 0.1 個單位的意思
後面加 f 代表是小數 (floating point numbers),有用到小數點後面都要加 f,不然電腦會看不懂
這句的意思就是:物件的位置X方向增加0.1,也就是往右移動0.1的意思
Y方向, Z方向移動0個單位,代表這兩個方向不會有改變
寫完之後
回到Unity,畫面中間上方有一個三角型的Play鍵
按下去執行,看看按右鍵飛機會不會往右移動
注意!程式碼的大小寫要完全一樣
如果不能執行,看一下畫面最下方有沒有錯誤訊息
如果我把GetKey的K大寫打成小寫,就會出現上面的錯誤訊息
這個錯誤訊息是說:ShipControl.cs的程式有錯誤,Input這個類別裡找不到Getkey的定義
因為K打成小寫,所以電腦找不到
如果你不確定哪邊有打錯,你可以直接複製網誌裡的程式
輕按幾下右箭頭,飛機可以往右移動
代表程式正常運作
確認可以往右後,我們再回到Visual Studio
寫往左的部分
if (Input.GetKey(KeyCode.LeftArrow))
{
gameObject.transform.position += new Vector3(-0.1f, 0, 0);
}
基本上都跟右邊的一樣,用複製就好
然後再把RightArrow改成LeftArrow
0.1f 改成 -0.1f
然後我們再執行一次,確認可以左右移動
4. 限制飛機移動的牆壁
你在移動飛機的時候,可能會發現一個問題
飛機會跑到宇宙場景的外面!
所以我們要加個邊界
GameObject -> Create Empty 開啟一個空的物件
我們會在物件裡看到一個新的GameObject
點左鍵,選Rename 更改名稱
改成RightSide
然後我們給這個物件碰撞屬性Add Component -> Physics 2D -> Box Collider 2D
跟飛機的碰撞屬性一樣,忘記怎麼做的人可以拉上去看
場景中間出現框框就是我們的碰撞物體
更改他的位置和大小
Position的X改成3,剛好是畫面邊邊
碰撞體的Size的X改成0.5,Y改成8,變成一個長條型
我們的飛機有碰撞屬性,邊界也有碰撞屬性
飛機就會撞到邊界,而不會飛出我們的場景
按PLAY,測試功能是否正常
然後我們在左邊也加上一樣的邊界
OK,教學到這邊差不多要結束了
儲存檔案吧
File -> Save Scene
然後就會在素材那邊看到我們新儲存的場景
下一次,我們要講飛彈和敵人的產生
前往下一篇

還會有PART2嗎 很想學unity
part2出囉! 不好意思拖了很久
期待PART2
感謝各位的期待!
謝謝大大~ 我有幾個問題想問... Oㄇ0~ 1.飛機碰左右邊框會沿著邊框飛走..........(似乎是因為我飛機的框框不是正方形?) 還有...還有....... rOˇ0 2.邊框如果用描邊的框框(Edge Collider)似乎沒有作用??
1. 飛機的Fixed Angle有打勾嗎? 2. Edge Collider因為太薄了,所以會穿過去 XDD
我就算照著您的邊界設計,飛機還是飛出邊界外面去了,請問是還有哪裡少步驟嗎
1. 確認飛機和邊界都有Box Collider 2. 飛機的Is Kinematic不能打勾 3. 飛機和牆壁的Is Trigger不能打勾 4. 牆壁Collider不能太薄,飛機Collider不能太小 5. 存檔後執行 6. 重開Unity,他有時候會怪怪的.
請問 我Rigidbody 2D裡沒有Fixed Angle可以選勾 我是不是少了什麼步驟??
Unity新版本改掉了,改在Rigidbody 2D最下面 constraints裡的Freeze Rotation Z 已修改內文,感謝你的回應 ^_^
同意樓上,沒有Fixed Angle可以選勾 但我把Fixed Angle看成Is Kinematic結果打勾了,現在已經取消勾選, 飛機不會再撞出去了,謝謝您! 再努力試下一個步驟!感恩!
很高興有幫助到你 ^_^ Fixed Angle換位置了,改在constraints裡的Freeze Rotation Z
不好意思我想請問邊界的問題 主角碰撞邊界後如果一直按住一樣的方向鍵 會不停的震動 請問這有辦法解決嗎@@
恩~~ 因為是物理碰撞,所以會彈回來 不然就是要改用其他方法 計算畫面邊界,超出邊界就回到原來的位置 要寫程式,有興趣可以自行研究 ^_^
不好意思我想請問coding的問題 我在跟著一個youtuber去弄一個叫2D catch game的遊戲(就是那個有個basket你就用mouse去控制那個basket left right去catch東西那種) 可是我看到有人在影片下面說youtuber那個是untity2的做法現在5的話是不行的 // Update is called once per frame void FixedUpdate () { Vector2 rawPosition = cam.ScreenToWorldPoint (Input.mousePosition); Vector2 targetPosition = new Vector2 (rawPosition.x, -1.3f); (rigidbody2D.MovePosition (targetPosition); 上面這個是本來的 // Update is called once per physics timestep void FixedUpdate () { Vector3 rawPosition = cam.ScreenToWorldPoint (Input.mousePosition); Vector3 targetPosition = new Vector3 (rawPosition.x, 0.0f, 0.0f); GetComponent().MovePosition (targetPosition);
}
我跟著其他人說的這樣去打可是那個besket還是動不了QWQ
請問這要怎麼解決嗎QWQ?
請問用手機可以玩嗎 移動需要改嗎
移動改成 void Update () { if(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved) { gameObject.transform.Translate(new Vector3(Input.touches[0].deltaPosition.x * Time.deltaTime, Input.touches[0].deltaPosition.y * Time.deltaTime, 0)); } }
我還找到一個小問題 如果物體速度過快 是可以直接穿透Box Collider的 所以建議移動速度不要太快 因為我自己試過很多次一直飛出去所以只好改慢了 疲勞TAT
速度越快,牆要越厚 XDD
有神快拜! 然後一直左右到底碰撞後會出現抖動的問題 我爬了文是改 Edit-->Project Settings-->Time 裡面的Fixed Timestep 從原本的0.02改小, 最低可以到0.0001 這樣就不會抖動了
高手喔!讚!
大師您好~ 請問如果改為手機版的話 射擊的程式碼該怎麼修改??
改成自動射擊,每隔0.15秒自動產生子彈
感謝大大 對你的景仰有如滔滔江水 黃河氾濫 一發不可收拾啊啊啊
不客氣 ^_^
不好意思 我想把它改成手機板 那我想問怎樣可以測試呢 按了開始鍵因為電腦沒有觸控所以無法測試 是要輸出APK測試或是可以開虛擬機測試嗎? 謝謝 感恩
是的
你好~ 請問一下我的程式碼都照著您的打,可是按滑鼠的左右鍵飛機還是都沒有反應耶, 可是若不加if的判斷式飛機是可以跑的
是鍵盤的左右鍵喔
問題已解決 謝謝版主:)
老師你好~ 請問一下能跟您要一下聯絡方式嗎>< 因為最近功課要用到unity,想請問您一些技巧可是不知道如何才能找到您:(
我會的東西全都寫在Blog裡了 :D
您好 最近剛開始學 卡在左右控制那 用debug後最後一行的}後 出現了必須是}的提示 請問這該如何解決?
是不是少一個 }
我照著步驟做...按了鍵盤的左右鍵還是沒有反應
會不會是英文字的大小寫打錯了?
請問一下,我打完程式後,案左右鍵沒有反應,我不知道哪裡出問題了。
有錯誤訊息嗎?
我的左右鍵也不會動ㄒㄒ
會不會是英文字的大小寫打錯呢? 有錯誤訊息嗎?
我是下載官網最新版的 介面跟您的不太一樣 到了 要執行左右測試的時候 畫面全黑出現display 1 no cameras rendering 是不是要先架設一台攝影機之類? 謝謝 全新手 只是自己做好玩的
請問大大 關於Sorting Layer跟Layer都要選Background有點不太懂這是為什麼可以請大大說明一下嗎?
Layer的名稱可以自取。Sorting Layer是物件的上下順序。
請問為甚麼我照著大大的方式做飛機還是會穿越出去,但我如果用牆去撞飛機就不會穿越,請問是甚麼問題,很緊急~~拜託大大教教我
請問為甚麼我的圖片不能抓上去當背景?
要PNG檔喔
請問我在打完程式碼後按unity上方play鍵進行測試但是只見到太空船放得很大,右鍵好像沒反應,這是哪裡有問題呢?
看下方有沒有錯誤訊息
請問發行後為何子彈無法顯示??(無錯誤訊息)
設置Rigidbody那裏他跟我說我已經有Box Collider所以不能設置......orz我少做了什麼嗎? 彈錯視窗原文: "Can't add...(略).....because it conflicts with the existing "BoxCollider2D"derived component"
請問鍵盤上的任何一個按鍵都可以設定成為控制鍵嗎?謝謝
請問鍵盤上的數字鍵和英文鍵可以設定成為控制鍵嗎?謝謝
當然,都可以設
RigidBody 的更動應該要放在 FixedUpdate() 而非 Update(), 改完後則不會造成 邊界 抖動的現象.
真的耶,讚喔!
能夠自己製作遊戲感覺好酷xD 希望有更多文章
謝謝! 有空會寫 ^_^
感謝大大 我們專題有希望拉!!
不客氣 ^_^
謝謝你,這篇教學讓我受益良多
很高興對你有幫助 ^_^
先謝謝老師分享,全部跑了一次看東西在動,不禁眼淚滴了下來. 再來想分享幾個小地方. Fixed Timestep改完感覺好像會頓,應該是檢查時間太短關係 用老師方式,在邊發射邊撞牆時,好像子彈也因為碰撞牆會飄出去, 所以我使用了兩次if判斷 public float floorWidth = 2f; void Update () { if (Input.GetKey(KeyCode.RightArrow)) { if (gameObject.transform.position.x < floorWidth) { gameObject.transform.position += new Vector3(0.1f, 0, 0); } } if (Input.GetKey(KeyCode.LeftArrow)) { if (gameObject.transform.position.x > -floorWidth) { gameObject.transform.position += new Vector3(-0.1f, 0, 0); } } 方法其實很基本,很多高手都會了,但在這邊野人獻曝一番, 分享我的做法
讚!厲害喔!
感謝~看到它動起來時,真的好開心~~ 更感謝一步步解說程式碼的用途, 對非程式出身的自學新手真的好需要,非常感謝~ 希望有更多的文章
很高興對你有幫助 ^_^ 如果有空會再寫的
版大,拜讀您的教學之後,我才深深體會到什麼是台上十分鐘,台下十年功,逛過一些國外網站還有視頻,結果發現還是您的教學最簡明迅速,讓我這個unity+c#幾天的超新手可以馬上入門。 真的非常感謝。希望版大也可以偶而繼續分享各種心得喔!
謝謝,讓初學者可以馬上做出能動的東西 是我寫這個教學的宗旨 希望初學者建立信心後 可以繼續挑戰更難的領域
請問建立的程式檔沒有辦法選語言,寫入的程式也顯示錯誤要如何解決? 版本:Unity 2018.2.8f1 (64-bit)
新版本不用選語言了。注意英文大小寫不能錯,或是複製BLOG的程式貼上也可以
本人初學者有問題想要請教一下版大。 我照著您的方式操作Unity但是不知道為何 當飛機發射的子彈卻全卡在正中央 當下真的不知該要修正哪裡它才不會出現這種Bug 不好意思..麻煩版大指點一下,感恩您 !!
應該是雷射的程式描述那邊有問題吧,我猜
背景素材無法直接拖入? 我是直接建立new sprite material 設定物件 unity2018.3.8版
想請問一下 我發現如果手機滑大力一點 飛機就會跑出螢幕外 碰撞會失效 這是甚麼原因呢?
有沒有更好的繪畫工具介紹? 能夠畫透明的部?
我個人是用clip studio paint。網路上應該也能找到一些免費軟體
我想繪畫人物動畫在遊戲中,類似左右移動,請問有冇教學?
我想繪畫人物動畫在遊戲中,類似左右移動,請問有冇教學?
新版2019Unity有bug 你查錯誤碼到unity 官網會有unity的技術人員出來說明
*****
*****
有錯誤訊息:Assets\controship.cs(2,26): error CS1001: Identifier expected
後來發現是多加了一個點
請問我如果是用新版的 會有Gravity Scale, Constraintsv, Freeze Rotation 等東西嗎 (因為我找半天找不到XD)
摁 解決了
請問為甚麼我照著方式做,飛機還是會穿越出去.
請問Rigidbody 2D在哪 (我是2020.3.10f1版)
表單往下拉試試 或是可以用放大鏡搜尋,這樣快一些
請問只要將飛船的圖片這樣放入後,加上rigibody,再打上程式碼就能動嗎,想請問這樣gameobject就能找到飛船?
是的,因為程式碼是建立在飛船這個物件底下。飛船的圖片拉入畫布時,就自動變成物件了