3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 2710|回复: 5
打印 上一主题 下一主题

[工具插件] 上古卷轴5 Papyrus脚本语言入门指南

[复制链接]

72

主题

2710

帖子

6093

积分

游戏精英

Rank: 8Rank: 8

贡献度
380
金元
45728
积分
6093
精华
0
注册时间
2006-3-7
跳转到指定楼层
主题
发表于 2024-3-5 17:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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
回复

使用道具 举报

72

主题

2710

帖子

6093

积分

游戏精英

Rank: 8Rank: 8

贡献度
380
金元
45728
积分
6093
精华
0
注册时间
2006-3-7
舒服的沙发
 楼主| 发表于 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[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上了。

回复 支持 反对

使用道具 举报

72

主题

2710

帖子

6093

积分

游戏精英

Rank: 8Rank: 8

贡献度
380
金元
45728
积分
6093
精华
0
注册时间
2006-3-7
硬硬的板凳
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

72

主题

2710

帖子

6093

积分

游戏精英

Rank: 8Rank: 8

贡献度
380
金元
45728
积分
6093
精华
0
注册时间
2006-3-7
冰凉的地板
 楼主| 发表于 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关键字),父脚本和子脚本使用各自的变量。


回复 支持 反对

使用道具 举报

0

主题

17

帖子

102

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1020
积分
102
精华
0
注册时间
2016-1-12
5#
发表于 2024-8-22 02:03 | 只看该作者

1

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

111111111111
回复 支持 反对

使用道具 举报

13

主题

110

帖子

1235

积分

膝盖中箭MOD组

Rank: 12Rank: 12Rank: 12

贡献度
215
金元
3549
积分
1235
精华
2
注册时间
2020-5-26
6#
发表于 2026-2-22 21:53 | 只看该作者
好帖子,期待更新
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-3-30 13:09 , Processed in 0.030010 second(s), 16 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表