上古卷轴5 Papyrus脚本语言入门指南
本帖最后由 zhuertie888 于 2024-3-9 07:27 编辑转贴留下自用备份参考,希望对你也有所帮助
apyrus脚本语言入门指南
程序框架
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.Disable()
currentElement+=1
endWhile
(3)衍生内容:数组
在papyrus中,数组也是一种特殊的变量,本质上是开辟出一块内存存储一系列相同类型的数据。因为在papyrus中不存在指针,所以其声明方式跟c语言中数组的声明会有所区别。(貌似跟java非常类似,不过楼主好久不接触java有些忘记……惭愧……)
声明:int[] object(创建一个名为object的整数型数组,数组的长度为0,且初始值为空)
创建:int[] object = new int (创建一个名为object的整数型数组,数组长度为10,并初始化)
数组在脚本中可以作为参数和函数返回值
例如:int Function arrayObject(int[] array)
或:
int[] Function arrayObject()
int[] array = new int
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 本帖最后由 zhuertie888 于 2024-3-5 19:28 编辑
事件
事件是驱动游戏进度的程序,在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
继承
papyrus中,继承的概念跟其他高级语言类似,以某个已经存在的脚本为基础,对该脚本进行功能拓展从而得到新的脚本。
继承的方法
跟高级语言类似,papyrus的继承方法也是用extend关键字
例如 scriptName HelloWorld extend ObjectReference
继承有什么用?
函数和事件
子脚本可以使用父脚本的全套函数和事件,而当子脚本调用自身与父脚本同类的函数时,子脚本函数拥有优先权。
状态
父类有状态,子类没有:此状态的父函数将会被使用。
子类有状态,父类没有:此状态的子函数将会被使用。
父类的函数有状态,子类的没有:父版本将会被使用。
子类的函数有状态,父类的没有:子版本将会被使用。
所有函数有相同状态:子版本将会被使用。
属性
子脚本可以使用父脚本的属性,但是不能有超出该父脚本属性定义的操作
变量
变量是私有的(相当于默认加上了private关键字),父脚本和子脚本使用各自的变量。
1
本帖最后由 无敌大吊 于 2024-8-22 02:09 编辑111111111111
页:
[1]