《上古卷軸5:無界天際》Papyrus腳本語言入門指南

《上古卷軸5:無界天際》的自由性極高,並且還能通過MOD等方式來進行玩法的拓展。而Papyrus是B社的腳本工具,玩家要是掌握了Papyrus腳本語言,就能讓本作的趣味性大大加強。以下為《上古卷軸5:無界天際》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

・基本概念

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上了。

・函數

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

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

例如:

int function count(int counter)

int count=0

counter=count+1

return counter

endFunction

・事件

事件是驅動遊戲進度的程序,在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

・狀態

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

定義方式

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)都將不會運行並有警告提示

・繼承

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

繼承的方法

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

例如 scriptName HelloWorld extend ObjectReference

繼承有什麼用?

函數和事件

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

狀態

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

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

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

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

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

屬性

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

變量

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

來源:遊星空