zhuertie888 发表于 2024-3-5 17:40

上古卷轴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

zhuertie888 发表于 2024-3-5 17:41

基本概念

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

zhuertie888 发表于 2024-3-5 17:42

函数

  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 17:42

本帖最后由 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关键字),父脚本和子脚本使用各自的变量。


无敌大吊 发表于 2024-8-22 02:03

1

本帖最后由 无敌大吊 于 2024-8-22 02:09 编辑

111111111111
页: [1]
查看完整版本: 上古卷轴5 Papyrus脚本语言入门指南