2022年东京电玩展

鬼灭之刃第二季讯息

《上古卷轴5》Papyrus脚本语言入门指南

2018-05-29 12:41:23   来源:游民星空

  《上古卷轴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:天际专区

基本概念

  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:天际专区

函数

  papyrus中的函数与其他高级语言的函数概念并无多大差别,都是一段用于完成特定功能的程序段。

  定义方式也与其他脚本语言类似

  例如:

  int function count(int counter)

  int count=0

  counter=count+1

  return counter

  endFunction

更多相关内容请关注:上古卷轴5:天际专区

事件

  事件是驱动游戏进度的程序,在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:天际专区

状态

  游戏运行在不断变化的环境下,而脚本运行只能有一个状态,代码的运行方式,运行结果跟特定的状态有关系。例如,当玩家举盾防御时,敌人蓄力攻击会触发一个短暂的时缓效果。这就是在“玩家举盾防御”,“敌人蓄力攻击”的状态下,触发函数造成“短暂的时缓效果”

定义方式

  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:天际专区

继承

  papyrus中,继承的概念跟其他高级语言类似,以某个已经存在的脚本为基础,对该脚本进行功能拓展从而得到新的脚本。

继承的方法

  跟高级语言类似,papyrus的继承方法也是用extend关键字

  例如 scriptName HelloWorld extend ObjectReference

  继承有什么用?

函数和事件

  子脚本可以使用父脚本的全套函数和事件,而当子脚本调用自身与父脚本同类的函数时,子脚本函数拥有优先权。

状态

  父类有状态,子类没有:此状态的父函数将会被使用。

  子类有状态,父类没有:此状态的子函数将会被使用。

  父类的函数有状态,子类的没有:父版本将会被使用。

  子类的函数有状态,父类的没有:子版本将会被使用。

  所有函数有相同状态:子版本将会被使用。

属性

  子脚本可以使用父脚本的属性,但是不能有超出该父脚本属性定义的操作

变量

  变量是私有的(相当于默认加上了private关键字),父脚本和子脚本使用各自的变量。

更多相关内容请关注:上古卷轴5:天际专区

新浪声明:新浪网登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
精彩推荐
相关新闻
CGWR

中国游戏排行榜(China Game Weight Rank)是由新浪游戏推出的国内最全面、最专业、最公正、最客观的多平台游戏评测排行榜,包含了目前市场上所有的手游、端游、主机游戏、VR游戏、智能电视游戏及H5游戏,力图为中国玩家打造最值得信赖的游戏推荐平台。

评天下游戏、测产品深浅—新浪中国游戏排行榜CGWR!http://top.sina.com.cn

新浪游戏APP
新浪游戏APP为广大玩家提供最及时、最个性化的聚合订阅游戏资讯,以及业内最丰富、最具价值的游戏礼包资源,首测资格、稀有道具,成为高玩就这么简单。新浪游戏APP论坛力求打造一个属于所有玩家的超大朋友圈,为玩家的生活增资添彩。新浪游戏秉承为玩家提供优质服务为宗旨,不断优化创新,让我们一起创造快乐!
新浪游戏
全民手游攻略
全民手游攻略”是新浪游戏为全球手游玩家量身打造的一款手游攻略大全及专业游戏问答社区APP。“全民手游攻略”涵盖Apple Store游戏畅销榜前150名手游,网罗最新手游通关秘,帮助玩家畅玩手游;打造最全手游攻略资料站,帮你用最省钱方式吊打土豪。最火爆专业的游戏问答,让众多大神带你开启不同手游人生,寻找志同道合小伙伴一起并肩作战。
全民攻略
0条评论|0人参与我有话说
分享到微博
发布
最热评论 刷新
广告
更多 + 精彩专题
更多 + 热门新闻
更多 + 萌妹趣图
更多 + 搞笑视频
广告

新浪简介 About Sina | 网站地图 | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996-2025 SINA Corporation, All Rights Reserved

新浪公司 版权所有

用微信扫描二维码
分享至微信朋友圈
新浪首页我要评论分享文章回到顶部
关闭评论
0条评论|0人参与我有话说
分享到微博
发布