第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:天際專區
責任編輯:夏目貴志