每日最新頭條.有趣資訊

《上古卷軸5》Papyrus腳本語言入門指南

第1頁:程式框架

展開

  《上古卷軸5》的自由性極高,並且還能通過MOD等方式來進行玩法的拓展。而Papyrus是B社的腳本工具,玩家要是掌握了Papyrus腳本語言,就能讓本作的趣味性大大加強。下面就為大家帶來了《上古卷軸5》Papyrus腳本語言入門指南,希望大家能夠喜歡。

遊民星空

程式框架

  papyrus作為一種腳本語言,跟市面上其他的腳本語言類似,語法規則比較簡單,程式結構跟高級語言也沒有什麽太大的差別。如果有朋友擁有一定程度的編程基礎的話會很容易上手。

  在此,我舉個例子,介紹一下papyrus的程式框架。

  scriptName FirstScript extend ObjectReference //作為腳本開頭必須有的一句,意思是定義繼承自 //ObjectReference類的FirstScript腳本。

  {Sample Script} //大括號的內容是在ck檢查的時候工具框的內容,類似注釋。

  Message property box1 auto //定義Message類型的屬性box1,並自動賦值。

  {first box} //property,auto都是關鍵字

  Message property box2 auto

  {second box}

  int count ;counter //定義整數型變量count。papyrus中,分號的作用類似

  //高級語言的“//”,分號後面的內容是代碼注釋

  Event OnActive(ObjectReference akAcitonRef) //主程式,類似c語言裡的int main()

  count=count+1

  GetMessage(count).show()

  endEvent //程式段結尾必須要加個end語句,如endEvent,endFunction

  //區分大小寫

  Message function GetMessage(int counter) //函數定義,與高級語言基本類似

  Message box

  if (counter==1)

  box==box1

  else

  box==box2

  endif

  Return box

  endFunction

更多相關內容請關注:上古卷軸5:天際專區

責任編輯:夏目貴志

第2頁:基本概念

展開

基本概念

  papyrus的基本概念包括變量,屬性,函數,事件,狀態,繼承,多線程,持久化等。下面我們詳細講解各個概念,爭取能通俗地讓大家理解。

1、變量

  (1)papyrus中變量跟其他語言相比沒有太大的不同,都是開辟一塊記憶體存儲特定類型(包括基本數據類型和類類型)的數據。聲明方式也跟其他語言類似

  聲明:int counter Message box

  papyrus會用默認值自動為這些聲明的變量初始化,這也是我們開頭的程式中count不必手動初始化即可保證初始值是0的原因。當然,用戶手動初始化也是可以的,具體初始化方式跟其他高級語言相同。

  (2)衍生內容:語句

  papyrus的語句跟其他語言類似,也有循環語句和條件語句。用法也大同小異,只是需要注意語句結束時需要用專門的關鍵字結尾。

  例如:(根據counter值的不同,決定用哪一個值來初始化chosenbox)

  if (counter==1)

  chosenbox=box1

  else

  chosenbox=box2

  endIf

  例如:(將object陣列重新初始化)

  while (currentElement < object.Length)

  object[currentElement].Disable()

  currentElement+=1

  endWhile

  (3)衍生內容:陣列

  在papyrus中,陣列也是一種特殊的變量,本質上是開辟出一塊記憶體存儲一系列相同類型的數據。因為在papyrus中不存在指針,所以其聲明方式跟c語言中陣列的聲明會有所區別。(貌似跟java非常類似,不過樓主好久不接觸java有些忘記……慚愧……)

  聲明:int[] object(創建一個名為object的整數型陣列,陣列的長度為0,且初始值為空)

  創建:int[] object = new int[10] (創建一個名為object的整數型陣列,陣列長度為10,並初始化)

  陣列在腳本中可以作為參數和函數返回值

  例如:int Function arrayObject(int[] array)

  或:

  int[] Function arrayObject()

  int[] array = new int[10]

  Return array

  endFunction

  陣列的賦值可以用while語句進行,與其他語言的陣列賦值並無區別。長度則可以使用“陣列名.Length”來計算。

  此外,陣列還可以像其他變量一樣為其他的陣列進行賦值或初始化。(在這裡有必要提醒一下,papyrus中陣列的本質依舊是指向記憶體單元的指針,用陣列進行賦值之後,會讓被賦值的陣列指向原陣列的記憶體地址,此時當用戶處理原陣列的數據後,被賦值的陣列相關數據也會發生變化)

2、屬性

  概念:

  屬性是papyrus獨有的一種變量類型。其作用是將mod製作者製作或者遊戲本身的物品對象(裝備,武器,雜物甚至是隨從等等)與腳本進行關聯,從而可以通過腳本來控制這些物品對象(如武器發光,劍氣,破法者的法術護盾,隨從奧妮安會在玩家血量不足的時候釋放恢復系法術等等,這些行為都要通過腳本控制)。

  聲明方法:

  屬性的聲明使用property關鍵字

  例如:Message property box1 auto(聲明一個Message類型的屬性box1,並自動賦值)

  使用方法:

  首先要在ck中制定好相關物品,然後在ck中將屬性跟具體對象連接,之後就可以編寫腳本了。

  例如:

  我在ck中創建了一把武器,名為blood_blade。

  然後在腳本中定義屬性:Weapon property blade auto

  在ck中將blood_blade連接到blade上,這樣一來,我們的blade變量就指向了blood_blade的記憶體地址

  之後我們在腳本中編寫武器發光,劍氣之類的內容,就可以直接作用到blood_blade上了。

更多相關內容請關注:上古卷軸5:天際專區

責任編輯:夏目貴志

第3頁:函數

展開

函數

  papyrus中的函數與其他高級語言的函數概念並無多大差別,都是一段用於完成特定功能的程式段。

  定義方式也與其他腳本語言類似

  例如:

  int function count(int counter)

  int count=0

  counter=count+1

  return counter

  endFunction

更多相關內容請關注:上古卷軸5:天際專區

責任編輯:夏目貴志

第4頁:事件

展開

事件

  事件是驅動遊戲進度的程式,在papyrus中,事件就類似於c語言中的主函數,即int main()。在遊戲中,幾乎所有的角色行為都可以用事件管理。舉個例子,盜賊公會任務中,玩家會跟隨墨瑟前往雪漫密室尋找卡萊雅的下落,當你踏入最後一道門的時候會被卡萊雅的箭射中,昏厥倒地。玩家踩中陷阱到昏厥倒地這個動作,就可以用事件來管理。

事件的流程

  玩家在進行遊戲中觸發了某一行為(腳步聲過響,踩中陷阱等),相關聯的對象(沉睡的屍鬼,毀滅系符文法術等)根據腳本做出相應的反應(甦醒,爆炸等),然後反饋到遊戲當中去。

  例子:

  下面通過一個例子來幫助大家對事件有個具體的印象

  scriptName DraugrResurrect extend Actor

  Spell property reanimateSpell Auto

  ObjectReference property trigger Auto

  Event OnActive(ObjectReference akActionRef)

  if (trigger==akActionRef)

  reanimateSpell . Cast(self,self)

  endIf

  endEvent

更多相關內容請關注:上古卷軸5:天際專區

責任編輯:夏目貴志

第5頁:狀態

展開

狀態

  遊戲運行在不斷變化的環境下,而腳本運行只能有一個狀態,代碼的運行方式,運行結果跟特定的狀態有關係。例如,當玩家舉盾防禦時,敵人蓄力攻擊會觸發一個短暫的時緩效果。這就是在“玩家舉盾防禦”,“敵人蓄力攻擊”的狀態下,觸發函數造成“短暫的時緩效果”

定義方式

  auto state XXX

  ;具體內容

  endState

  auto是關鍵字,可以讓腳本在特定狀態下起用

  空狀態:

  當一個函數不存在於任何狀態中的時候,稱這個函數為空狀態。(此時,這個函數的存在形式類似於高級語言中的全局函數)運用空狀態可以將某個函數或者事件禁用。

  想要在腳本中生效的函數或者事件,可以將該函數或事件先在空狀態下定義,然後再放置到狀態中生效。需要注意的是,放置到狀態中的函數或者事件,必須要跟在空狀態下定義的函數或者事件有相同的返回值和參數表

  例如:

  function A (int c)

  ;內容

  endFunction

  auto state XXX

  function A(int c)

  ;內容

  endFunction

  function B(int c)

  ;內容

  endFunction

  function A(int b)

  ;內容

  endFunction

  endState

  上面這個例子中,function B和function A(int b)都將不會運行並有警告提示

更多相關內容請關注:上古卷軸5:天際專區

責任編輯:夏目貴志

第6頁:繼承

展開

繼承

  papyrus中,繼承的概念跟其他高級語言類似,以某個已經存在的腳本為基礎,對該腳本進行功能拓展從而得到新的腳本。

繼承的方法

  跟高級語言類似,papyrus的繼承方法也是用extend關鍵字

  例如 scriptName HelloWorld extend ObjectReference

  繼承有什麽用?

函數和事件

  子腳本可以使用父腳本的全套函數和事件,而當子腳本調用自身與父腳本同類的函數時,子腳本函數擁有優先權。

狀態

  父類有狀態,子類沒有:此狀態的父函數將會被使用。

  子類有狀態,父類沒有:此狀態的子函數將會被使用。

  父類的函數有狀態,子類的沒有:父版本將會被使用。

  子類的函數有狀態,父類的沒有:子版本將會被使用。

  所有函數有相同狀態:子版本將會被使用。

屬性

  子腳本可以使用父腳本的屬性,但是不能有超出該父腳本屬性定義的操作

變量

  變量是私有的(相當於默認加上了private關鍵字),父腳本和子腳本使用各自的變量。

更多相關內容請關注:上古卷軸5:天際專區

責任編輯:夏目貴志

獲得更多的PTT最新消息
按讚加入粉絲團