1. 程式人生 > >第一人稱探索互動指令碼解析

第一人稱探索互動指令碼解析

       這篇總結原來是自己寫在GAD平臺上同時參加了GAD的徵文大賽,最後拿了三等獎,給了300塊獎金,還算不錯,畢竟同臺都是有經驗的大佬,比如我的偶像嘉棟哥(《unity3d指令碼程式設計》推薦看看,涵蓋很廣)。這個是大二時候的第一筆入正,搬過來,紀念紀念。

下列原文

       大二時參加同校一院一個團隊專案,做了個第一人稱密室解謎的遊戲,瞭解使用歸納了一些外掛又添加了些東西,就想把探索互動類的指令碼做個整理。

        這個指令碼塊的主體是由一個管理類指令碼和一個基類指令碼構成,再由基類指令碼拓展各個行為類指令碼,最後由行為類指令碼拓展各個具體指令碼。

        先看幾張圖片,理解一下效果是啥樣的

基類指令碼 

  1. 宣告一個公共的列舉型別,如STATIC, PICKUP, ACTIVATE, JOURNAL, INVENTORY等,這裡只以這些為例,設定預設型別為STATIC
  2. 定義一個布林變數CanInteractWithWhileHoldingObject,判斷玩家在拿起物體時是否可與之互動
  3. 定義一個布林變數HighlightOnMouseOver,可以勾選是否有物體高亮顯示,並賦予物件材質
  4. 設定一個可互動的最大直線距離
  5. 設定通用的視線滑過時的提示語
  6. 在基類指令碼中我們要有兩個基礎方法 設定高亮材質和移除高亮材質,以及一些輔助方法如 獲取互動型別、獲得CanInteractWithWhileHoldingObject值,也可新增額外的方法,使得某些子類由此功能如discoverObject

管理類指令碼

  1.  定義的變數主要有幾個部分
                  • 檢查物體旋轉相關變數,包括旋轉速度和起始旋轉要求
                  • 游標提示,包括啟用和未啟用游標的圖片及相關布林變數
                  • 設定層級,包括可互動物體層級和放回層級
                  • 相機焦距、滑鼠靈敏度,包括相機焦距改變的數值和當物體高亮時滑鼠靈敏度的設定
                  • 滑鼠提示UI,包括一個用於判斷顯隱的布林變數、文字設定,如撿起、放回、丟棄、啟用等
                  • 射線,包括距離
                  • 互動設定,包括三個狀態拿著的物體及物體的位置(撿起,檢查,放回/丟棄)和當前是否在檢查物體的布林值
                  • 子類相關變數,包括日記的按鈕設定、音訊及文字的設定

   2.  因為使用射線法,所以主要程式碼集中在Update中,有多個判斷,比較醜陋。

  •  判斷射線是否碰撞可互動物體 
       若是,把當前互動物體設定為射線碰撞物體,再判斷如果我沒有持有東西,或者持有東西但射線碰撞物體允許在持有物體時進行互動,那麼呼叫基礎類中高亮顯示函式,並更新右下角滑鼠提示;不能互動,則清除設定。
       若非可互動物體,與之前操作相同,清除設定。
  • 判斷拿著物體時的行為
       若在檢查此物體,因為能拿起的物體都有InteractablePickupScript指令碼,根據指令碼內的旋轉型別進行設定並隱藏滑鼠提示
  • E或滑鼠左鍵與物體的各種互動 非檢查狀態
     若拿著物品,且物品為可放回物品,則把物品放回設定位置,並清空設定,還原資料,若物品為可互動物品且InteractionsAllowedWhenHoldingObjecttrue,則根據物品型別可設定不同方法,可拓展。其他情況,就是丟掉物品,清空設定,還原資料。
      若處在檢查等狀態,則根據物品型別分情況處理,如啟用型別,呼叫其程式碼的Active函式;可撿起型別,設定位置、層級、碰撞器、鏡頭等狀態。
  • 按下/擡起 左Shift或右鍵檢查/停止檢查物體 當前拿著物品
      停止/恢復 移動,改變物品提示設定旋轉資訊/還原設定
  • 根據右鍵按下 擡起,相機變焦
      變焦即改變攝像頭的fieldofview3.  各種輔助方法
  • 游標顯隱,滑鼠提示顯隱,滑鼠靈敏度,可移動禁止移動等等

行為類指令碼(可自行新增)

1. 可拾取型別指令碼InteractablePickupScript

  • 繼承基類,重寫Awake,設定InteractionType型別
  • 重寫Update,處理音效
  • 可繼承函式DoPickupPutdown,處理拾取和放回邏輯,可拓展一些特殊事件
  • 私有函式GeneratePutBackPlace,建立放回碰撞器

2. 啟用型別指令碼InteractableActivateScript

  • 繼承基類,重寫Awake,設定InteractionType型別
  • 可繼承函式activate,所有子類物體都必須重寫此方法,拓展事件

具體指令碼舉例

GameCabinetInteractionScript繼承自InteractableActivateScript,控制櫃子的互動

GameIdolPickupScript繼承自InteractablePickupScript,拓展了撿起物體觸發事件的功能

比如這裡,在拿起物體時柵欄升起困住主角,放回物體改變提示

第一次寫這些東西,怕自己講的有誤導,還是放程式碼,程式碼自己覺得還可以優化。

連結:http://pan.baidu.com/s/1cyHI2M 密碼:s6ak