注意区域Region、实体Entities、区域实体Region entities是不一样的- -
8 ^4 r' e0 g% }* p) e3 h" \ ! |+ o8 T; x: |
[区域实体]8 U( K; h ?: ~! l& y
- |8 v" K7 P6 W1 f
$ h* N1 W5 ]6 _3 `3 n" M如果你测试游戏,会发现桌子和椅子是可以“互动的”,鼠标移动到它们上方时,光标会改变并显示标题(caption,在左下角信息栏设定)。这是因为桌子和椅子都已经是实体了并且勾选了Interactive属性(自由实体默认不勾选,可以在左下角信息栏修改)。但场景中还有柜子和门这些东西,如何使它们也可以互动?由于它们是背景图片的一部分,不用考虑与角色的遮挡问题,所以我们可以使用区域实体(Region entities),达到这个目的。区域实体相当于在背景划定一块区域(比如柜子),之后你就可以在游戏与之互动,为它编写脚本,却又不用像之前所用的实体一样需要准备单独的图像(希望我讲清楚了- -)。- d- u$ i3 z1 i" c) {
: p% {# g8 G. w2 p
" b! ^* I4 o6 j我们将添加门、柜子、窗户三个区域实体作为例子。
6 [" w* V: p% v! D
4 m# [/ X+ ]* M6 \+ D1 }在SceneEdit中打开MyScene.scene。
. \/ e4 z" n; d7 C0 R/ i$ t
+ D: y" r" Y* J8 b点击下图中的按钮添加区域实体。
% W1 f5 {% A! {4 H5 k+ [7 Q1 f
; b+ h" k8 i" h8 s( Y3 e& [9 l
% o" i7 ^9 g8 `# F
8 T3 p" v0 T% K2 i9 T$ d. k你可以在左下角信息栏修改名称和标题,之后要做的就是调整区域的形状和位置,如下图。
9 P0 ^$ c( S0 F7 d0 k& c3 D
7 E, V6 @5 q) M5 D7 S5 U: B
- z1 ]6 H, V% s& a& T8 \, N* A这样,你就有了三个可以互动的东西,而不只是背景图片的一部分。+ _- H. R' S2 v2 F6 }- R$ Q* x9 m
' k( S' \. J4 k- `
* W* Q6 j. m- K! C# W' r+ Z2 B" y
2 u+ B' ]" W3 U5 _0 ^3 N0 p5 p+ ?( K
! @% Q6 P" W$ B' v8 W注意node列表里实体和区域的顺序很重要!这决定了引擎绘制的顺序,会影响物体间的遮盖。. ^, C) N! s+ G6 ]: I: E# n; J5 }
在这个场景里实体间的顺序不太重要,因为它们之间不互相重叠,但平时的制作中你需要时刻注意这个问题。(测试了一下,区域实体不影响绘制,但是会与实体发生遮挡,比如你在椅子上划定一块区域实体,在游戏时鼠标移到重叠的部分,是与区域实体互动而不是椅子)% N2 v. I3 d* I: z2 F: R
; B. h) X# n/ o; U
. S, { r2 R0 a
# P9 {+ l; _# R2 s0 `; k
7 ~5 X" ~* n4 e现在测试一下,门、柜子、和窗户都是可“互动”的了。
% @& W, p o; e( H) A. X ; l3 c. k0 Z w" v
[光标]
: M! e! M y% t2 E1 _
( }; r/ H1 p5 ^你已经知道当鼠标移到可以互动的物体上时光标会改变,默认提供两种光标--标准(standard)和活跃(active),可以在PM左边的设置里改变光标图像。但我们还可以为一些物体指定特殊的光标(比如鼠标移到一本书上时,变成一个翻书的标志),现在以门作为例子,使鼠标移到门上时变成一个箭头。
' F' ?# k# \. a! X$ Q1 B h& x# K" ^1 d
返回SceneEdit并选择之前创建的区域实体door。
3 \& S$ v# W" r9 w, c i 0 t# L3 J% ~4 o$ T
提示:你可以直接在右边的预览的窗口双击一个东西,就会自动选择它。8 C' \* M7 \6 b# H, _: m
9 [7 n5 P1 ~# e- O3 A V在左下角的信息栏中有一个“Cursor”属性,点击后面的"..."按钮选择光标图像,你可以在demo文件夹下的“data\sprites\system”里找到arrow_left.sprite文件并载入(貌似光标图像可以是普通的图片,但sprite文件可以指定焦点,更合适)。
. k3 X3 b. E8 \0 r9 K
& M# ?0 B" I& f9 [" D4 g提示:如果你想删除之前指定的光标,点击“...”按钮后点击Cancel按钮,SceneEdit会询问你是否删除。1 E2 \. e, Z# Q( i) K; h; @
, `6 l& D# q6 o: D
5 m3 Z) B/ @9 d6 j! v* l% `1 |! x保存并测试,效果应该如下图。5 H Y! I" r* @# h
- H2 V" f- e: M) }8 \/ O
+ j0 m2 j; v: Y: O. y% W, t* W' ]% H' }7 d% F" h: v7 Z
) \: {% X6 @& c1 g
[脚本]% u: g$ p& I( }) E: K/ `9 l: Z6 t& W
. L2 s' z f/ c1 s& p" Q! h现在场景中有了一些可以互动的物体,但你点击它们后不会有什么事发生,你不能对话、开门、或者捡东西。我们需要写一些脚本实现这些效果,脚本就是一小段程序。在以后我们会对脚本进行深入讲解,在这一章只会粗略涉及。
/ d5 `; r: h/ c, n/ }4 O; y" d
0 `: L! I, m5 C, _7 {" L我们将为桌子添加一段脚本。首先返回到PM,右键单击MyScene文件夹下的scr文件夹(场景中的脚本储存在这个文件夹里)并选择Add script来添加脚本。5 a+ P' D6 K B# b" J3 E0 l* J& f
: ^1 f! X: C3 _ j" h' r; S" R+ y' ` [5 @; t
% ^$ _$ v& a4 y# K5 B; _在模版选择窗口选择"scene object"模版,并将名称改为desk,这样一个脚本文件就创建好了。
, @0 d6 e, h# [ O: J7 N5 V" S8 y( B0 R0 G) K; L! e
1 c( `) X/ y6 e- Z( l# i0 K ! s0 e+ X( E% A6 g1 H' c2 S! ? f
1 \# Y( b! ^, `
回到SceneEdit,选择desk实体,在左下角的信息栏中找到“Scripts...”按钮,首先弹出的是创建新脚本的窗口(你也可以在这里创建新脚本,而不是在PM里),关闭后弹出新的窗口,如下图 中,在这里可以为实体添加一个或多个脚本,下图使用的是老版本,新版本中六个图标功能从左到右依次是:下移、上移、创建新的脚本、打开已有的脚本、编辑脚本、删除脚本。打开之前创建的desk.script脚本。(添加脚本后可以保存并测试一下游戏,试着右键点击一下桌子看看效果)0 z8 i: @9 E' N3 ]
; n) Q" |. D( @. z1 X3 V
p, s n( c( Q6 H& S' K" M; L( m5 N5 n! L& c: e& F- j
之后点击编辑脚本按钮,或者双击列表中的脚本,SceneEdit会打开一个文本编辑器供你编辑。
* d* v. i3 J' H. C2 s8 V现在脚本应该是这样(事实上不是这样,新版本里还有另外两段内容,但这里以这两段为例):: P4 K9 Y2 n N
0 r2 |- e# e5 }5 c! N* X( u
* @" L' m) s7 T+ Q& ^) A8 \
#include "scripts\base.inc" |
[/table] | //////////////////////////////////////////////////////////////////////////////// |
actor.Talk("Blah"); |
//////////////////////////////////////////////////////////////////////////////// |
actor.Talk("Blah"); |
| 你可以在脚本中看到"on "xxx"{...}"这样的格式,这样的格式代表这样的意思,比如当玩家在游戏中选择要看一张桌子(在桌子上点击鼠标右键,并选择看“Look at”的命令),这时候就会触发脚本中的on "LookAt",执行后面大括号里的{actor.Talk("Blah"); | }两句命令。 | | 接下来看看"LookAt"所执行的内容: | | | | actor.Talk("Blah"); |
| | | 这两句代码的效果是: | actor.GoToObject(this);调用GotoObject方法,望文生义,也就是让角色走过去,wme提供了很多方法帮助你编辑脚本,至于走到哪,由后面括号里的(this)决定了,this在代码中代表这段代码归属的物体,比如这段代码是桌子的,那this就代表桌子,角色也就会走到桌子边。 | | actor.Talk("Blah");调用Talk方法,让角色说话,说的内容有后面括号里的("Blah")决定了,效果就是在角色的头上出现一个字幕Blah- - | (新版本中默认还有on"Take"、on"Leftclick"两个方法,代表选择”拿“和左键单击后执行的命令) | | 这样引擎就知道点击桌子后该做些什么,但有个问题,actor.GoToObject(this)命令让角色走到桌子边,但具体坐标不知道,我们需要自己指定。选择一个实体,你可以在左下角信息栏看到walk to栏,在这里决定执行GoToObject命令后角色具体要去的坐标。 | | | | | | 你可以自己填写,三个白框从左到右依次是x轴坐标、y轴坐标、角色方向。你也可以使用角色模型(使用方法见步骤六)来指定,将角色模型放在指定的位置并调整好方向,之后点击Walk to栏最右边的”<“按钮,就会自动填写,而下面”>“按钮则会把角色模型移动到上面指定的坐标。 | | | 如下图将角色模型放置好。 | | | | | 再点击”<“按钮就可以了(注意先选择desk实体)。 | | | 有时候也可以在代码里直接写上坐标,放置好角色模型后点击工具栏“Actor->Copy actor placement”或者按Ctrl+C就可以复制角色模型所在的坐标。 | | | | | | | 这样你就可以在脚本中直接指定坐标: | | | | actor.TurnTo(DI_UPRIGHT); |
| | 你也可以改变actor.Talk方法后面括号的内容来改变角色说的话,比如: | | | | actor.Talk("The desk is a bit too heavy for a poor little me..."); | [table=100%,#66ffcc]} |
, I6 |; R+ Z; [/ M1 a, O# J5 a ^
, `0 S, P$ a* C" O8 [因为你不可以与桌子对话,你可以把整个on "Take"命令删除掉,这样当角色试图与桌子对话时,引擎会会调用默认的Talk方法,显示无法对话。
# |! x0 x1 I/ c6 q X6 x6 K* p
) H9 B* H+ l1 T8 D/ z保存并测试一下。右键点击桌子后效果如下图(这个菜单是demo默认的,可以修改),可以点击按钮试试效果。
9 M8 O9 Y( p; m7 r% {8 t$ B
3 ?: x2 v( d. t& O3 f7 o- }# X& Y& u. R. q7 i; a' O& c
4 H2 F* U3 D# }! f
这一章结束了~
$ K7 b m% u6 l/ K S/ b L9 \
@) n9 ?$ N& I# t0 g5 X" l! D3 U/ r" g" j" m
帮助文档使用的是老版本,这一章与现有版本有许多出入,写得比较匆忙,如果有错的话留言提醒我修改下。
T; v' z n# U& s- d$ M关于脚本的内容,有编程基础的人很容易看懂,没有编程基础的人得好好理解一下,我尽量试着讲得浅显一些。
` W a4 O5 P9 ]& m( F步骤8、9内容比较少,下午发完~ |