游戏开发论坛

 找回密码
 立即注册
搜索
查看: 11611|回复: 10

网游脚本浅谈

[复制链接]

36

主题

76

帖子

81

积分

注册会员

Rank: 2

积分
81
发表于 2008-9-5 12:36:00 | 显示全部楼层 |阅读模式

http://blog.csdn.net/blade2001/archive/2008/09/03/2875976.aspx

脚本起着驱动整个游戏进程的作用, 在单机RPG时代游戏的剧情发展和任务都是由客户端的脚本来驱动的。

目前现有的网游绝大部分也都拥有自己的脚本系统, 或者嵌入某种通用的脚本语言如python,lua, 或者自己设计一套游戏流程/逻辑描述规则也就是自定义的剧情描述语言,  和单机RPG所不同的是网

游的脚本通常运行在服务器端。

游戏中的脚本体系一般以事件为中心, 和宿主代码之间进行相互的交互。
1. 宿主代码会在某些事件发生或者满足一定条件下调用脚本, 这种调用是双方约定好的, 例如调用脚本的某一个函数
2. 脚本被调用后会执行剧情逻辑, 当然做具体的动作的时候还是要调用宿主代码暴露给脚本的接口。

脚本代码和宿主代码相比较, 最大的优势在于脚本更为简单易学, 有利于策划编写游戏逻辑, 而且不需要重新编译程序。
劣势是脚本通常是解释性的或者是类似于java有中间字节码的, 执行速度上远不及宿主二进制代码, 有的资料显示要慢10倍以上。


下面我们来看下剑侠情缘公测服务端1.2的脚本, 其用的是嵌入lua, 我们先找个它的简单来分析下是如何实现的:


巴陵县_长江码头船夫对话.lua
function main(sel)

if (GetLevel() >= 10) then  --等级达到十级
Say("船夫:我有个外号叫做“浪里白条”,说起游水的功夫,全巴陵县我认了第二,就没人敢认第一!所以坐我的船你保管放心,你要去哪个码头呀?", 2, "坐船/WharfFun", "不

坐/OnCancel");
else  
Say("船夫:对不起,没到十级的新手不能坐船出村。", 0)
end

end;

---------------------------------------------------------------
function  OnCancel()
   Say("船夫:没银子可坐不了船!",0)
end;


在以上的脚本中描述了长江码头船夫和玩家之间的对话逻辑, 当玩家点击npc试图和其说话时, 服务器端就会调用该npc对应的脚本中的main函数来驱动游戏的剧情, 其中的GetLevel,Say等就是宿主

代码暴露给脚本的接口, 如果玩家在客户端选了"不坐", 客户端会发送"OnCancel"给服务器来促使其执行OnCancel函数。


下面看一个稍微复杂些的任务脚本, 每行的#后为添加的注释
--两湖区 巴陵县 路人4小渔对话
--巴陵县新手任务:小渔的爹爹
--suyu
-------------------------------------------
function main()

UTask_world18 = GetTask(46);  #从宿主代码得到保存的任务进度状态

if ((GetCamp() == 0) and (UTask_world18 <= 2)) then #如果任务还未完成
UTaskMain()
else
Default()
end;

end;

-------------------------------------------

function UTaskMain()  #该函数由main函数调用

if(UTask_world18 == 0) then
UTask_world18_0()
end;

if(UTask_world18 == 1) then
UTask_world18_1()
end;

if(UTask_world18 == 2) then
UTask_world18_2()
end;

end;

-------------------------------------------
function Default() #如果此任务已完成就执行这个函数

i = random(0,1)

if (i == 0) then
Say("小渔:我爹爹是洞庭湖的渔民,每天都要到湖上去撒网捕鱼,如果遇到了刮风下雨,有时会好几天都回不了家呢。",0)
return
end;

if (i == 1) then
Say("小渔:爹很疼我,可是他老说如果我是男孩子就好了,那样我就可以帮他捕鱼了。",0)
end;

end;

-------------------------------------------
function UTask_world18_0() #任务进度0:分配任务

Say("小渔:呜呜……我爹昨天打鱼遇上大风雨,被淋病了,现在还发烧呢。爹的病还没好,又不能打鱼,我们吃什么啊。你能帮我去求求吴神医么?吴神医是个大好人,他一定会帮我们

的。",2,"帮忙/yes","不帮/no")

end;

-------------------------------------------
function UTask_world18_1() #任务进度1:已接受任务

Say("小渔:吴神医的家就住在县南门边。",0)

end;

-------------------------------------------
function UTask_world18_2()

if(HaveItem("枇杷丸") == 1) then   #玩家身上有物品:枇杷丸
Say("小渔:啊!这就是枇杷丸?这下子爹爹的病很快就会好起来的。你真是个大好人,这双鞋是我娘做的,你一定要收下呀。",0)
DelItem("枇杷丸")  #从玩家包裹中移除该物品

if(GetSex() == 0) then #判断性别进行任务奖励
  AddItem(0, 5, 0, 1, 0, 0)
else
  AddItem(0, 5, 2, 1, 0, 0)
end

SetTask(46, 3) #设置任务状态为已完成
else
SetTask(46, 1)
Say("小渔:还没有找到枇杷丸么?爹爹的病可怎么办呀,呜呜呜……",0)
end

end;

-------------------------------------------
function yes()  #接UTask_world18_0, 回答yes接受任务后, 设置任务进度为1

Say("小渔:我记得以前听大夫说得要枇杷丸才可以治好高烧,可是我们穷人哪儿买得起啊。",0)
SetTask(46, 1)

end;

-------------------------------------------
function no()
Say("小渔:我要在这里继续等好心人。", 0)
end;

-------------------------------------------


看到这里, 游戏脚本的基本原理和实现机制就应该不再神秘了。


7

主题

38

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2008-9-5 14:26:00 | 显示全部楼层

Re:网游脚本浅谈

谢谢

3

主题

113

帖子

147

积分

注册会员

Rank: 2

积分
147
发表于 2008-9-6 19:03:00 | 显示全部楼层

Re:网游脚本浅谈

...客户端的对白居然在服务器保存,并进行发送.  有意思.

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2008-9-8 00:00:00 | 显示全部楼层

Re:网游脚本浅谈

对白应该保存在客户端,把要执行相关函数的消息发给服务端还差不多
想想封包,一句话多少个字节-.-

36

主题

76

帖子

81

积分

注册会员

Rank: 2

积分
81
 楼主| 发表于 2008-9-8 12:01:00 | 显示全部楼层

Re:网游脚本浅谈

是啊,  这种做法是有提高的空间,  应该是客户端把对白以资源的形式保存, 然后server端只要发对应的id给
client就好了

19

主题

85

帖子

86

积分

注册会员

Rank: 2

积分
86
发表于 2008-9-9 09:27:00 | 显示全部楼层

Re:网游脚本浅谈

每个任务都要单独写脚本哦?
能不能做成动态添加任务的?OR地图编辑器那样,组合起来就行了的

36

主题

76

帖子

81

积分

注册会员

Rank: 2

积分
81
 楼主| 发表于 2008-9-11 13:08:00 | 显示全部楼层

Re: Re:网游脚本浅谈


动态添加任务的?  具体指的是什么含义 ?

逃学书童: Re:网游脚本浅谈

每个任务都要单独写脚本哦?
能不能做成动态添加任务的?OR地图编辑器那样,组合起来就行了的

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-9-13 12:24:00 | 显示全部楼层

Re:网游脚本浅谈

太底层,现在策划被强迫写代码吗。。。作为程序员俺都不愿意写这样的代码了

4

主题

732

帖子

858

积分

高级会员

Rank: 4

积分
858
QQ
发表于 2008-9-23 21:19:00 | 显示全部楼层

Re:网游脚本浅谈

普通的任务让程序做个任务编辑器。逻辑应该很清晰。策划直接拷贝对话就成了。
复杂任务再写脚本。

否则,几百个任务,写脚本到猴年马月。
出点小bug,查死人。

12

主题

128

帖子

128

积分

注册会员

Rank: 2

积分
128
发表于 2008-9-24 10:08:00 | 显示全部楼层

Re:网游脚本浅谈

恩....
出了问题除了查程序的bug还要查策划的bug..
简直太恐怖了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 02:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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