榨干单机任务的油水
杂志上的那篇文章
首先声明,制作前提是你拥有一定的修改水平,因为本文涉及到了众多修改。如果有什么不会的地方还是自己去找相关教程吧。 ^_^
单机任务的最主要表现形式就是任务。(某人:废话!)但实际上我们可以利用单机任务做一些其他的事情。
准备工作:
首先就是选好地图,之后在Level文件夹下用记事本打开sn**_.pst,把int Rule改成1,不要设定死亡后失败。之后我们在一个函数中设定PLAYER使用道具35(PlayerPerform("use", 35);),死了吧?等等,发现了什么?对,我们变成自由视角了,利用这个,我们可以做很多。
方案1:做电影
不得不说,做电影是涉及修改最多的地方。需要一点一点介绍。
A.让NPC走路
毕竟是单机任务,我们的主角配角全部都是NPC,因此只能通过函数来让NPC实现走路。
方法1:利用巡逻,ChangeBehavior(int id, "patrol", int waypoint1, int waypoint2..); 路点可以用editai查看(路点设定看注释)
方法2:利用ChangeBehavior(int id, "attacktarget", int idx, int a); (NPC不顾一切的跑到IDX的目标位置,若a为不存在则为跑到目标位置,a值大於0则到目标位置实施攻击. )这个的好处是不用设定太多的路点
方法3:利用follow,ChangeBehavior(int id, "follow", string name/ int id);
(注释:上述函数中,int id代表Get(Any)Char的函数值,例如c1=GetChar("夜子");,则让夜子走路就把int id改成c1。int waypoint1是路点数字。int idx和int id一样,只是为了区别开。string name是NPC名字,要用" "括住,不过建议还是用GetChar的好。)
B:让NPC攻击
攻击来说有些麻烦,我一点一点讲。
1、NPC PK的话就直接用ChangeBehavior(int id, "follow", string name/ int id);尽管可能有些不尽人意。
2、指定动作,这个比较复杂。我的方法是改POSE,把某武器的POSE全部都改成一个,然后利用Perform(int id, "attack");来做动作。不过也有别的方法,就是用AI同步,这样就增加了假死动作,暴气动作,挑衅三个,因为如果用同步的攻击就会转视角,所以AI同步并不能用同步攻击。
3、利用暗器击中别人,这个就十分十分十分十分的麻烦了……我为了避免就选用的飞轮,因为NPC指定他ATTACK时他很没有方向感……
基本上攻击也就这些了。
C:其他的一些杂七杂八的东西
1、利用Distance(SetTarget(0, "char", int id/player);下一个就是把0改成1,依此类推,然后在if条件内加入Distance(0, 1)2、利用一些地图道具,传送点可以做到出人意料的效果。这个就需要个人的想象力了。
3、拍摄不一定一次出来,可以不断修改不断拍摄。
拍出来就后期制作出来吧,尽管不如人来当演员,但真正的属于个人作品。而且可以避免网络、人员等问题。
为了方便学习,在这我放个实例教程。
假定我们在地图伏虎山,有两个NPC,一个名为夜子,一个名为无双,要求夜子走到无双旁边,蹲下,对话,无双攻击夜子。
首先就是打开伏虎山的任务,sn17_.pst,随意填写一下开头的内容。我是这样写得
int Rule = 1;任务模式,盟主
int RoundTime = 99;回合时间99分钟
int PlayerSpawn = 120;玩家出生点120
int PlayerSpawnDir = 340;出生面对角度340度
int PlayerWeapon = 14;主要武器,14
int PlayerWeapon2 = 27;次要武器27,在这说明一下,从出生点到这里可以随意,不过出生点要谨慎,不要影响拍摄。
int PlayerHP = 7500;玩家生命值,其实写成1都没问题……反正都要死
(下面就是设定函数)
int trg0 = 0;
OnStart()
{
AddNPC("npc17_01");
AddNPC("npc17_02");这个是NPC名称,具体要看你做的NPC的文件名字
}
OnUpdate()
{
int player = GetAnyChar("player");
if (player < 0)
{
return 0;
}这个地方随意,只是设定PLAYER代表玩家。不过必须有……
int c;
int c2; 此处设定下面的函数值(数?)可以随便改,数字字母都可以
if (trg0==0)
{
c = GetAnyChar("夜子"); 设定c为夜子
c2 = GetAnyChar("无双"); 设定c2为无双
if (c>=0) 当c>=0(代表着C在游戏内)执行
{
ChangeBehavior(c, "fllow", c2); 让夜子跟随无双
ChangeBehavior(c2, "idle"); 让无双站着不动
PlayerPerform("use", 35); 让玩家死亡
trg0 = 1; 让trg0=1
}
}
if (trg0==1) 当trg0=1时执行
{
c = GetAnyChar("夜子"); 设定c为夜子
c2 = GetAnyChar("无双"); 设定c2为无双
SetTarget(0, "char", c); 设定0为夜子
SetTarget(1, "char", c2); 设定1为无双
if (c>=0 && Distance(0, 1)<150) 当c>=0(代表着C在游戏内)并且0和1的横坐标差值的绝对值小于150时执行
{
Perform(c2, "crouch", 1); 让夜子蹲下
Perform(c2, "attack"); 无双攻击(此处可以改POSE,注意,NPC执行ATTACK时出的招式是随机的)
Perform(c2, "pause", 20); 停顿20秒,主要是为了空出对话时间
Perform(c2, "faceto", c); 无双转向夜子
trg0 = 2; 让trg0=2
}
}
}
这样一小段镜头就出来了。
方案2:做万剑决!
这个不得不说,的确很方便,万剑决本事就利用了NPC,只是他的拍摄方法上有些让人难以恭维……当然也有他的好处。不过还是需要他人来协助,其实我们自己就可以做。
首先就是透明POSE问题,其实简单的要命,把该POSE的所有skc文件删除即可(可能有未知的一些问题)。
之后就是设定好路点和POSE,特效方面需要你的想象力,利用LINK等等。
之后就是重要的部分。
1、定向,需要在你定向的方向上放一个透明的NPC,然后让需要转向那个方向的NPCPerform(int id, "faceto", int idx);,即可。
2、攻击,方法和上面的差不多,就是ATTACK或者同步。ATTACK就要把所有POSE改成一个,然后利用LINK连接。同步可以把假死、挑衅、暴气分别改了,利用同步按这些键即可。(如果需要同步可以找我要。)
3、其他的就是需要想象力了,利用一些其他的,地图、武器,其实这些东西和想象力分不开。
之后也可以后期制作。
说实话讲来讲去就这些东西,利用函数,利用同步,修改POSE等等。
具体还是去实践吧。如果不会单机任务设定可以看http://www.yfzz.net/bbs/a/a.asp?B=2200&ID=280216这张帖子。
注释:路点:
路点:
路点其实不光用来当作AI行走的路线,还是任务的出生点,所以做任务时的路点也十分重要。
首先选择你的地图(注意,选择的地图必须在LEVEL下有wp文件,没有可以自己建一个),然后加入一个AI(注意,不能是adddummy加入的,必须是\AI加入的),然后打命令\editai开启路点编辑。按键如下:
按1键:制造一个最小范围的路点
按2键:制造一个中等范围的路点
按3键:制造一个大范围的路点
按4键:制造一个超大范围的路点(路点的范围就是电脑的行动范围)
按m键:打开路点显示或关闭路点显示
按空格键:选择你要编辑的路点(把方框指到你要编辑的路点,按空格键就变成红色的,表示你可以编辑这个路点了)
按z键:要在路点变红色才能用,可以对路点位置改变,这个键只要按一下就可以用ASDW键控制左右前后.F键控制路点往上升,v键路点往下降。(提示:高级版本不好用哦)在按一次这键就关闭位置改变功能.
按删除(←)键:就是先让路点变成红色的了在按这个键就能把路点删除!
按p键:可以把整个地图的结构显示出来(在按一下就是关闭)。
保存路点命令是Shift+S键
Distence:
还是举例子好些。
if (trg0 == 1)
{
c = GetChar("夜子");
SetTarget(0, "char", c);
SetTarget(1, "char", player);
if (c>=0 && Distance(0, 1)<200)
{
这部分就略去……
}
}
这个函数的意思就是指定夜子为c,再指定c为0(也就是夜子为0),指定player为1,当1和0的横坐标差值的绝对值小于200,c同时大于0时发生该函数。
你也可以发挥一下,再加一个GetChar指定一个NPC,当两个NPC的距离小于一个数值时发生函数。具体还是实践……实践出真知……







