⊰ Unity ⊱
眾所皆知的免費遊戲引擎[個人版 (Personal)]
想一圓遊戲製作夢的人來說,是個很棒的工具
學習的時候,常常會遇到…
「欸?這功能我剛剛做過,可是忘記怎麼寫了」
「奇怪?明明剛才有搜尋到不錯的腳本…到底在哪裡?」
有鑑於此,所以把一些常用的或是容易忘記的記錄在本頁面裡。
————————◄◀◁◈▷▶►————————
◈最近的更新
◈Look_at_target 可以讓物件一直面朝某個對象!
很便利的腳本,目前改成了能靠【Tag】來判斷對象的版本… 當初找到時只能普通的塞入一定的對象,但如果用在預置物件上[例如給生成新的怪物用] 就會找不到呢~因為場景的物件是沒辦法直接給預置物件讀取的樣子。 使用時建議不要有兩個相同【Tag】的物件在場景上,會隨機抓一個嗎?或者直接抓最後一個呢? |
記錄時間2019.04.21
|
Target_Tag | 這裡直接填入目標的【Tag】,就能抓到場景內的對象。然後直勾勾的盯著對方看囉~ | ||
其它部分 |
因為寫得不夠嚴謹,另外兩個參數變成參考用的呢~ 「FindPlayer」,會在一開始先帶入【Tag】目標,然後就讓「target」帶入這個目標的軸~ 雖然說只要寫【Tag】就能自動追場景上的目標,但是如果要做額外用塗就會不太方便呢。 |
◈
▲
◈取得&修改「特定」場景物件的變量參數[C#Script]
例如我現在有個額外的UI系統,想要抓取玩家和BOSS的血量來顯示,就可以用到這功能… |
記錄時間2018.12.06
|
如果要抓取UI介面的物件,像是Text之類的東西,就必須在最上面加上這個…不然會變成紅色,找不到目標的樣子。 | |
準備了三個空格,一個是抓場景物件[GameObject]位置代號[Player] 一個是儲存用的參數格[float]代號[m_life],這個好像可以不用特地準備的樣子…之後要測試看看 一個是抓場景UI介面[Text]文字介面的物件,代號[LivesText] |
|
在void Update 底下使用這些程式腳本。讓他可以隨時更新目前的生命值 「if (Player != null) 」判斷這格子內有沒有放物件。沒有就不執行底下的東西,這很重要!因為如果找不到物件就執行,後台會一直~跑錯誤!雖然暫時不會怎樣(?) 重點來了! 參數格[m_life]代入[Player]抓到的物件,物件上的腳本[PlayerControler3]裡面的參數[m_life] 「else 」,就是沒抓到任何物件時,參數格[m_life]帶入0。感覺有點多餘…因為預設就是0。之後要測試看看 「if(LivesText != null)」同「if (Player != null) 」,不解釋。 「LivesText.text = "能量:" + m_life;」,代號[LivesText]介面[Text]的內容設定為[能量:<生命值參數>] 參數不需要加「"」框起來,單純顯示文字就要 | |
將上方腳本「m_life = Player.GetComponent 就不僅是截取變量而已,而是直接改[Player]物件身上變量,變成一種鎖血的功能。 測試關卡通關效果時很好用,鎖血直接不會死可以到處亂撞呢~ |
▲
◈全域變數,靜止變數,從所有地方呼叫修改的變數[C#Script]
例如玩家的生命值與得分,可以使用這個種類,這樣就可以對應各種情況來給予變化 特點是不需要抓取特定物件,可以在任何腳本直接改! |
記錄時間2018.12.13
|
首先要像這樣宣告變量…主要是多了個[static]在前面,這個變數就可以在任何腳本直接調用 | |
然後要把[變量名稱A]+100,只要這樣寫就可以了。 在任意腳本直接寫,不需要做宣告,因為[變量名稱A]是[static]屬性 但是要記得指定哪個腳本的[變量名稱A] |
▲
◈儲存變數、字串[C#Script]
接關用,可以把一些數據儲存起來,換場景後呼叫出來使用~ 或是改天遊玩時自動讀取之前的數據 |
記錄時間2018.12.13
|
通用的開頭 | 儲存屬性 | 儲存的值 |
PlayerPrefs. | SetInt SetFloat SetString |
("整數變數", 10); ("浮點數", 10.5f); ("字串", "我是字串"); |
解說 | ||
儲存的值不同,就要用不同的屬性 前為儲存值的名稱,記得「"」框起來,後方為數值 如果是字串也要框起來,是變數就不用。 例如:「PlayerPrefs.SetInt("生命值", player_hp);」 | ||
通用的開頭 | 讀取屬性 | 讀取的值 |
PlayerPrefs. | GetInt GetFloat GetString |
("整數變數"); ("浮點數"); ("字串"); |
解說 | ||
既然是讀取,就不能光是寫出上面的組合,要把讀取來的資料放在該放的位置上啊! 通常讀取的部分,會寫在[void Start ()]底下,一開始就讀取,只會讀取一次 例如:「player_hp = PlayerPrefs.GetInt("生命值");」 這條程式也能直接當作變量來判斷用。 例如:「if( PlayerPrefs.GetInt("生命值") == 100)」 | ||
刪除所有記錄 刪除特定記錄 立刻存檔 判斷是否已經有記錄 |
PlayerPrefs.DeleteAll(); PlayerPrefs.DeleteKey("生命值"); PlayerPrefs.Save(); if( PlayerPrefs.HasKey("生命值")) |
|
註:「PlayerPrefs.Save();」用於強化存檔效果,有些時候似乎會…沒存好? |
▲
◈UI GIF圖 輪播控制[C#Script]
UI圖片只能一張?要用動圖只能掛插件? 其實可以用更好的選擇...寫個C#腳本! |
記錄時間2018.12.29
|
▲
◈UI圖片控制[C#Script]
學會了在Unity裡面做動圖...總不會想要讓動圖老是在同一個位置吧? 接下來如何做才能移動圖片的位置或放大縮小呢? |
記錄時間2018.12.29
|
當掛上腳本的[Image]物件有這條程式時,就會移動到對應的(PosX,PosY,PosZ)去 | |
嫌PosZ有點多餘,也可以改用這樣來移動… | |
掛上腳本的[Image]物件有這條程式時,就會改變成設定好的寬和高 | |
在void Start () 上增加這行宣告,用來抓取[Image]物件 | 也可以應用之前所學的抓取功能,直接抓特定圖片來改他的位置…[+= new Vector3(5,5,0)]這寫法會讓圖片一直往右上方飄去 |
▲
◈各種實用GetComponent 獲取特定組件[C#Script]
這兩天刻苦鑽研Unity,發現這個GetComponent真的是很常~用的功能… 也沒少被這個問題搞到上網搜尋,於是我決定把它記錄下來。 |
記錄時間2018.12.31
|
圖片的動態修改。 似乎會抓取叫做[HPbar_1]的物件,但是使用時我把它改掉了。 |
||
讓特定功能關閉。 [gameObject]就是指目前掛上這腳本的物件,這串程式會把自己的[SphereCollider]給關掉 |
||
抓某腳本的參數來改。 [gameObject]就是目前掛上這腳本的物件,這串程式會抓自己身上的另一個腳本[item_mode],然後把裡面的參數[m_liveTime]給[減1 ] |
||
抓UI座標來改。 似乎是之前介紹過的功能了,反正這裡就再來一次介紹吧~[RectTransform]就是抓到座標組件,然後設定裡面的座標… 欸?我居然寫成Vector3?只有兩個座標還寫成Vector3,搞不好有警告訊息但是我沒注意到… |
||
呼叫某個物件上,腳本[Code_mission]裡面的function類別… 就是那些前面帶有[void]字樣的傢伙們,但是也不能直接叫出來用,只能呼叫[public void]的。 這個是是呼叫[Code_mission]的[public void Mission_Code01 () ] |
||
特殊應用 | ||
抓取 父類 的 父類 的腳本來改參數。 這是用在負責碰撞觸發的腳本物件,埋在另一個物件的內層時使用的 例如手拿箱子的主角,箱子內的裡襯負責抓物品的判定,這時要把抓到的物品數據回傳到主角身上,就這樣一層層傳上去… 中間還夾了兩次[Debug.Log]來判斷是否準確傳達,目前已經註解掉了 |
||
抓取人稱控制器。 被搞得很煩,這東西真正的名稱像是藏在腳本內!? 他組件內的名稱叫做[FirstPersonController]第一人稱控制器,但是你這樣抓她會報錯,字也會變成紅色,點開這腳本來看發現裡面有一行… [RequireComponent(typeof (CharacterController))] 所以改用[CharacterController]來抓時,居然可以正常運作了~~ |
▲
◈if 判斷式
常常用到的if判斷式,但是不知不覺只用了最簡單的方式…畢竟每次寫的腳本都很短嘛… 但是突然發現一些慢慢變長的判斷式…突然驚覺這樣不行的!所以就去蒐集了各種用法來。 |
記錄時間2019.01.08
|
if() else if() |
上面應該是全部的寫法,視情況還可以增加各種[else if()],雖然常常用不到這麼多… 而且[if()]和[else if()]的用法實在太像了,所以常常只用[if()]就能解決大部分的問題 偶爾會用上一點…[else]… |
當[A]等於[B]時,會運作底下的事情 | |
當[A]大於&等於[B]時,會運作底下的事情 | |
當[A]小於&等於[B]時,會運作底下的事情 | |
當[A]不等於[B]時,會運作底下的事情 | |
當[A]大於等於[B],而且![A]不等於[C]時,會運作底下的事情 | |
當[A]大於等於[B],或者![A]等於[0]時,會運作底下的事情 | |
特殊應用 | |
當對象物件上有[Target_Tag]這個【Tag】時,會運作底下的事情,可以宣告一個字串[Target_Tag],之後就能用在不同情況下不同的物件了呢。 當要用在特定對象上時,[Target_Tag]因為是字串,所以必須用【"】框起來,否則就會被當作是宣告的變量囉。 |
|
當對象物件上有[A]這個組件時,會運作底下的事情,可以直接輸入腳本的名稱,來判斷是否帶著某腳本。 |
◈一些自己編寫的[C#Script]
▲
◈Look_at_target 可以讓物件一直面朝某個對象!
很便利的腳本,目前改成了能靠【Tag】來判斷對象的版本… 當初找到時只能普通的塞入一定的對象,但如果用在預置物件上[例如給生成新的怪物用] 就會找不到呢~因為場景的物件是沒辦法直接給預置物件讀取的樣子。 使用時建議不要有兩個相同【Tag】的物件在場景上,會隨機抓一個嗎?或者直接抓最後一個呢? |
記錄時間2019.04.21
|
Target_Tag | 這裡直接填入目標的【Tag】,就能抓到場景內的對象。然後直勾勾的盯著對方看囉~ | ||
其它部分 |
因為寫得不夠嚴謹,另外兩個參數變成參考用的呢~ 「FindPlayer」,會在一開始先帶入【Tag】目標,然後就讓「target」帶入這個目標的軸~ 雖然說只要寫【Tag】就能自動追場景上的目標,但是如果要做額外用塗就會不太方便呢。 |
▲
◈Active_time 一段時間後啟動某物件
或許一些需要計算遊玩時間的遊戲可以用上 例如音樂遊戲,開場就放音樂,然後在音樂激昂的部分,加分的掉落物開始瘋狂生成這樣~ 上週瘋狂的研究時,寫出來的小腳本,稍微修改一下,就能變成一段時間後,就關掉某個物件的功能吧~ |
記錄時間2019.01.05
|
ActiveTarget |
這裡請放入之後要啟動的場景物件,然後把場景物件名稱旁邊的勾勾取消,這樣這個場景物件在一開始就不會出現了。只能等讀秒結束後才會被啟動。 注意,物件本身要啟動狀態才能運行腳本,所以請不要在同一個物件上這麼做。 |
||
ActiveTime | 這裡填入秒數,這樣時間經過後,那個被放入的物件就會被啟動了。 |
▲
◈
記錄時間2019.99.99
|
◈簡易功能區
▲
請點擊旁邊的標籤 |
◈解決切換場景鼠標遺失、滑鼠游標消失[C#Script]
上網查詢後,據說是因為原版的人稱控制器會導致鼠標消失,而且轉換場景就不還你了。 但是實在是不會改原版的控制器…主要就是找不到控制鼠標的在哪啊~ 最後發現了這,簡單好用又有效果的方法! |
記錄時間2019.01.01
|
加在void Start()底下,然後把這腳本隨便掛在某個物件上。 切換場景到那個地方時,鼠標就不會再遺失囉~ |
◈延伸的陣列運用 隨機物品[C#Script]
上方的GIF圖腳本中,可以發現陣列效果的簡便之處! 只需要宣告一次~就能把同性質的物件全部塞進去!並且自動給予對應編號 如此一來要叫出特定物件,或隨機挑一個出來也會簡單很多吧! 只要宣告參數[編號],就能把那個參數內的特定[編號]叫出來了。 簡單來說,三年甲班27號請上台領獎~ |
記錄時間2019.01.02
|
去宣告吧! |
一個延伸運用,如果宣告圖片檔[Sprite],變成宣告陣列圖片檔是加上 [] 的話… 那麼只要給宣告預置物件變成宣告預置物件[],是否也會變成陣列呢? 答案是肯定的! |
|||||
讓它隨機變化 |
這是建立預置物件的程式碼,發現變長~了很多?我們把它變回來看看… 這是原本的樣子,不是陣列的時候,一串程式碼,只能叫出一個固定的預置物件 後面還有一大串,別緊張,不是什麼困難的東西…我來一條條解釋~ this.transform.position 這物件.變型[通常是物件的第一個屬性].XYZ座標 this.transform.rotation 這物件.變型.XYZ軸旋轉角度 變成陣列後改了什麼? 對,多了 [] 而本來應該是數字編號,用來呼叫陣列內第幾個物件出來 [Random.Range(0,Gift_Items.Length)] [隨機.範圍(0,Gift_Items.的範圍)] 簡單翻譯一下就是這麼回事,是否有點羨慕英文語系國家的人,看程式碼的時候都很白話,很是輕鬆愉快了呢? 陣列的第一個物件固定是0號,這段程式會幫你隨機從0號到最後一號,挑一個號碼出來~然後召喚那個物件,在和掛上這腳本的物件,同個座標,同個旋轉角度的地方 這就簡單達成隨機召喚的功能了!不用寫一堆if判斷式,還隨機產生一個數字來判斷目前是哪個數字… PS。之前的作品召喚補藥就是這麼寫的,因為很麻煩就懶得弄更多東西了 |
◈模型對齊[按鍵滑鼠控制]
該怎麼說呢...明明是很實用也很簡單的技巧,太久沒用突然忘記怎麼對齊啦! |
記錄時間2019.01.05
|
➢選擇要移動的模型[A],選擇移動模式。 ➢按住鍵盤[V鍵] ➢在模型[A]上找出適合的頂點,滑鼠左鍵按住抓穩~ ➢開始拉~朝目標模型[B]拉過去 被拽住的頂點會自動和模型[B]的頂點對齊 ➢對齊好之後,就能放開[V鍵]和滑鼠了 或者持續按住[V鍵],放開滑鼠,重新選擇模型[A]的頂點。 PS。個人習慣先放開滑鼠,再放開[V鍵](σ´∀`)σ |
◈解除所有碰撞[C#Script]
為了消除碰撞,讓物品沉入場景外,所以特地寫了一堆判斷式想偵測物件目前是哪種造型的 但是根本沒有這種用法~~判斷失敗!上網找找後發現…就這一行,一行解決所有 |
記錄時間2019.01.08
|
這樣就會把自身的碰撞箱,通通消除掉啦~不管是方塊的、圓的、膠囊的、還是Mesh的 |
◈[C#Script]
☀ |
記錄時間2099.99.99
|
☀ |
◈祝大家製作順利~如果有什麼新發現也會持續更新
留言
張貼留言