iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
自我挑戰組

老菜雞挑戰30天學爆Unity&C#會成功嗎?...系列 第 3

【Day3】老菜雞初嘗遊戲程式設計之開始打code囉!Unity的Game視窗簡介&C#控制物件(移動)

  • 分享至 

  • xImage
  •  

前言

昨天學了這麼多Unity基本介面的操作,但感覺還沒有用武之地,還沒有一個實際創作在遊戲上的東西,今天總算學到如何透過程式碼移動物件了!


Unity的Game視窗

  • Game視窗是真正玩遊戲時會出現的畫面,是出於Scene以Main Camera框起來的場景。
    https://ithelp.ithome.com.tw/upload/images/20220915/20152411YTKpCF2Sih.jpg
    https://ithelp.ithome.com.tw/upload/images/20220915/20152411Ex0yXRXFWA.jpg

  • 框取欲出現在Game的畫面(在Scene中移動Main Camera):點選Main Camera→點Move Tool→移動Scene中的Main Camera
    https://ithelp.ithome.com.tw/upload/images/20220915/20152411ruC73qZ6JG.jpg
    成果~~
    https://ithelp.ithome.com.tw/upload/images/20220915/20152411uNbxTq1wA5.jpg

  • Unity的欄位版面是可以做調整的。
    如下圖,Game視窗可以拉到旁邊,會更方便預覽實際的遊戲畫面。
    https://ithelp.ithome.com.tw/upload/images/20220915/20152411ALuIT92CMv.jpg

  • 調整遊戲的解析度=遊戲窗口的長寬比,在game欄位這邊看到,預設它的長寬比例寫的是Free Aspect 。

    Free Aspect 代表會根據Game欄位的比例來做調整,只要調整它的視窗大小,則Scene的 Main Camera的範圍也會跟著改變。
    如下圖,原本Game視窗及 Main Camera的範圍是這樣。
    https://ithelp.ithome.com.tw/upload/images/20220915/20152411JyhIJUao6c.jpg
    只要調整Game的視窗大小, Main Camera的範圍也會跟著改變。
    https://ithelp.ithome.com.tw/upload/images/20220915/20152411m7HeR81sjw.jpg

  • 如何固定遊戲的解析度?
    點選 Free Aspect 跑出下拉式選單來點選。
    https://ithelp.ithome.com.tw/upload/images/20220915/20152411Im9H3XUsIv.jpg
    如果這邊沒有想要的解析度,也可以按下面的+號→輸入Width&Height值 →按OK
    https://ithelp.ithome.com.tw/upload/images/20220915/20152411YTY024Ro9i.jpg
    https://ithelp.ithome.com.tw/upload/images/20220915/20152411vI2IjTFwaV.jpg
    固定解析度之後,不管再怎麼調整Game視窗大小,Main Camera的比例就是固定不變的。


遊戲核心概念-Game Loop

  • 遊戲其實是一直重複在執行,像在loop裡一樣不斷循環。會先初始化(一次),再進入迴圈,之後就會不斷更新遊戲,再將更新過的內容顯示在遊戲畫面上,直到遊戲結束
  • 電腦執行速度的不同,也會造成跑迴圈的速度也會不同。

Start()是遊戲初始化的地方,只有一開始會被執行一次。
Update()則會不斷地被重複執行,直到遊戲結束。
(下圖是預設的程式碼)
https://ithelp.ithome.com.tw/upload/images/20220915/20152411VUUo1wmUnq.jpg


結合C#來控制物件

新增程式碼掛載在物件上

新增檔案在Assets資料夾(下方Project欄位), 點滑鼠右鍵Create→選擇C# Script →命名。
https://ithelp.ithome.com.tw/upload/images/20220915/201524119W5xKsvv7G.jpg
只要點選這個檔案,右邊的Inspector會顯示出該檔案的內容(程式碼)。
https://ithelp.ithome.com.tw/upload/images/20220915/20152411fhMGKjtu8E.jpg
注意:檔案名稱一定要與class的名稱相同

如何靠程式碼使物件可以自動移動?

用unity裡面內建的transform.Translate(x軸上要移動的數值, y軸上要移動的數值, z軸上要移動的數值)

void Update() 

    { 

        transform.Translate(0.1f,0,0); 

    } 

注意:

  1. 輸入小數點時,數值後面要加f
  2. 儲存程式碼按ctrl+S
    https://ithelp.ithome.com.tw/upload/images/20220915/20152411j8sgJZF8Fx.jpg

為什麼同款遊戲在不同電腦上卻會產生不同結果?

  • 前面說過遊戲是不斷在跑迴圈,但由於每台電腦跑迴圈的速度不同,所以會造成同款遊戲在不同電腦上運作會有不一樣的結果。

舉例:以物件移動距離來看,某物件每執行一次Update就會在y軸往正的方向移動1格,
若電腦A在1秒鐘可執行update 100次,代表該物件1秒鐘可移動100格,
若電腦B在1秒鐘只能執行update 1次,代表該物件1秒鐘只能移動1格,
〉在相同時間同款遊戲下,兩台電腦移動物件的距離卻不同

  • 解決方法:在 Translate方法裡的數值乘上Time.deltaTime
void Update() 

    { 

        transform.Translate(0,1*Time.deltaTime,0); 

    } 
  • Time.deltaTime意思是跑一次迴圈花費多久。

Ex. 以物件移動距離來看,某物件每執行一次Update就會在y軸往正的方向移動1格,計算物件在一秒鐘內可移動幾格,就是 移動的格數* Time.deltaTime *一秒鐘可以執行幾次迴圈。

若電腦A在1秒鐘可執行update 100次, 代表Time.deltaTime=0.01則該物件1秒鐘可移動1*0.01 *100=1格。
若電腦B在1秒鐘只能執行update 1次,代表 Time.deltaTime =1則該物件1秒鐘可移動1*1*1=1格。
〉兩台電腦的執行結果是一樣的了!

如何在Unity介面中快速調整物件的移動速率?

在程式碼內宣告public變數speed

public class Player : MonoBehaviour 

{ 
    public float speed = 5f; 
    // Start is called before the first frame update 
    void Start() 
    { 

    } 
    // Update is called once per frame 
    void Update() 
    { 

        transform.Translate(0,speed*Time.deltaTime,0); 

    } 
} 
    

https://ithelp.ithome.com.tw/upload/images/20220915/201524119I7rLGM0sr.jpg
但如果想要 宣告private變數但又想可以出現在Unity介面做調整,
在變數前面加上[SerializeField]

public class Player : MonoBehaviour 

{ 
    [SerializeField] float speed = 5f; 
    // Start is called before the first frame update 
    void Start() 
    { 

    } 

    // Update is called once per frame 
    void Update() 
    { 

        transform.Translate(0,speed*Time.deltaTime,0); 

    } 
} 

心得

雖然今天只有學到控制物件的小小一環,但有學到一個對遊戲來說很重要的概念—Game Loop,這個觀念對遊戲的程設很重要,如果不懂這個概念就沒辦法開始了呢!

參考網址:https://www.youtube.com/watch?v=nPW6tKeapsM&ab_channel=GrandmaCan-%E6%88%91%E9%98%BF%E5%AC%A4%E9%83%BD%E6%9C%83


上一篇
【Day2】老菜雞邁入Unity新手村-Unity介面介紹+有關物件的操作(新增/移動/縮放...)
下一篇
【Day4】老菜雞學到物件下樓梯效果之Unity&C#取得使用者輸入去控制物件 &剛體物件、碰撞判斷 (Rigidbody、Collider)
系列文
老菜雞挑戰30天學爆Unity&C#會成功嗎?...30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
蘿蔔
iT邦新手 5 級 ‧ 2022-10-03 22:12:46

好讚喔!期待

我要留言

立即登入留言