第一人稱探索互動指令碼解析
阿新 • • 發佈:2018-12-29
這篇總結原來是自己寫在GAD平臺上同時參加了GAD的徵文大賽,最後拿了三等獎,給了300塊獎金,還算不錯,畢竟同臺都是有經驗的大佬,比如我的偶像嘉棟哥(《unity3d指令碼程式設計》推薦看看,涵蓋很廣)。這個是大二時候的第一筆入正,搬過來,紀念紀念。
下列原文
大二時參加同校一院一個團隊專案,做了個第一人稱密室解謎的遊戲,瞭解使用歸納了一些外掛又添加了些東西,就想把探索互動類的指令碼做個整理。
這個指令碼塊的主體是由一個管理類指令碼和一個基類指令碼構成,再由基類指令碼拓展各個行為類指令碼,最後由行為類指令碼拓展各個具體指令碼。
先看幾張圖片,理解一下效果是啥樣的
基類指令碼
- 宣告一個公共的列舉型別,如STATIC, PICKUP, ACTIVATE, JOURNAL, INVENTORY等,這裡只以這些為例,設定預設型別為STATIC
- 定義一個布林變數CanInteractWithWhileHoldingObject,判斷玩家在拿起物體時是否可與之互動
- 定義一個布林變數HighlightOnMouseOver,可以勾選是否有物體高亮顯示,並賦予物件材質
- 設定一個可互動的最大直線距離
- 設定通用的視線滑過時的提示語
- 在基類指令碼中我們要有兩個基礎方法 設定高亮材質和移除高亮材質,以及一些輔助方法如 獲取互動型別、獲得CanInteractWithWhileHoldingObject值,也可新增額外的方法,使得某些子類由此功能如discoverObject
管理類指令碼
- 定義的變數主要有幾個部分
- 檢查物體旋轉相關變數,包括旋轉速度和起始旋轉要求
- 游標提示,包括啟用和未啟用游標的圖片及相關布林變數
- 設定層級,包括可互動物體層級和放回層級
- 相機焦距、滑鼠靈敏度,包括相機焦距改變的數值和當物體高亮時滑鼠靈敏度的設定
- 滑鼠提示UI,包括一個用於判斷顯隱的布林變數、文字設定,如撿起、放回、丟棄、啟用等
- 射線,包括距離
- 互動設定,包括三個狀態拿著的物體及物體的位置(撿起,檢查,放回/丟棄)和當前是否在檢查物體的布林值
- 子類相關變數,包括日記的按鈕設定、音訊及文字的設定
2. 因為使用射線法,所以主要程式碼集中在Update中,有多個判斷,比較醜陋。
- 判斷射線是否碰撞可互動物體
若非可互動物體,與之前操作相同,清除設定。
- 判斷拿著物體時的行為
- E或滑鼠左鍵與物體的各種互動 非檢查狀態
若處在檢查等狀態,則根據物品型別分情況處理,如啟用型別,呼叫其程式碼的Active函式;可撿起型別,設定位置、層級、碰撞器、鏡頭等狀態。
- 按下/擡起 左Shift或右鍵檢查/停止檢查物體 當前拿著物品
- 根據右鍵按下 擡起,相機變焦
- 游標顯隱,滑鼠提示顯隱,滑鼠靈敏度,可移動禁止移動等等
行為類指令碼(可自行新增)
1. 可拾取型別指令碼InteractablePickupScript
- 繼承基類,重寫Awake,設定InteractionType型別
- 重寫Update,處理音效
- 可繼承函式DoPickupPutdown,處理拾取和放回邏輯,可拓展一些特殊事件
- 私有函式GeneratePutBackPlace,建立放回碰撞器
2. 啟用型別指令碼InteractableActivateScript
- 繼承基類,重寫Awake,設定InteractionType型別
- 可繼承函式activate,所有子類物體都必須重寫此方法,拓展事件
具體指令碼舉例
GameCabinetInteractionScript繼承自InteractableActivateScript,控制櫃子的互動
GameIdolPickupScript繼承自InteractablePickupScript,拓展了撿起物體觸發事件的功能
比如這裡,在拿起物體時柵欄升起困住主角,放回物體改變提示
第一次寫這些東西,怕自己講的有誤導,還是放程式碼,程式碼自己覺得還可以優化。
連結:http://pan.baidu.com/s/1cyHI2M 密碼:s6ak