注意区域Region、实体Entities、区域实体Region entities是不一样的- -3 e% f2 C* j2 L2 k* P8 V( s) i9 H
* q! X9 O2 C. o& q[区域实体]
2 k' d, e8 ~* e+ F& _$ U, `8 a: `; [
% r- U$ P- Z! f2 W/ s$ k! O8 w
如果你测试游戏,会发现桌子和椅子是可以“互动的”,鼠标移动到它们上方时,光标会改变并显示标题(caption,在左下角信息栏设定)。这是因为桌子和椅子都已经是实体了并且勾选了Interactive属性(自由实体默认不勾选,可以在左下角信息栏修改)。但场景中还有柜子和门这些东西,如何使它们也可以互动?由于它们是背景图片的一部分,不用考虑与角色的遮挡问题,所以我们可以使用区域实体(Region entities),达到这个目的。区域实体相当于在背景划定一块区域(比如柜子),之后你就可以在游戏与之互动,为它编写脚本,却又不用像之前所用的实体一样需要准备单独的图像(希望我讲清楚了- -)。1 l+ W3 f. U1 n" N
( s5 T) z# ^# s G8 ^& F9 v9 `4 t( y5 j9 k3 z. Q) A3 M
我们将添加门、柜子、窗户三个区域实体作为例子。2 [1 g! |" x6 w2 _" F. O
{- p) F( l) `9 Q B& j4 Y
在SceneEdit中打开MyScene.scene。: | h9 p4 b& D) R5 A" i8 J
! K. f9 F1 D% Y( I& q, f" B点击下图中的按钮添加区域实体。8 i. T6 |+ F- M+ @* s% p; c
& M* F4 `' R% C! l( J' L
! R8 Q2 u, P8 S. a; K0 `8 H
K, b4 ?" A$ \! l) h你可以在左下角信息栏修改名称和标题,之后要做的就是调整区域的形状和位置,如下图。
2 }6 T+ x) `* v9 {( D0 v
& i2 ~' w( T/ q2 z2 x! t
0 ~6 A8 w- d* ^) ~5 |5 c! e这样,你就有了三个可以互动的东西,而不只是背景图片的一部分。/ {+ P* m$ k9 z3 | h) R' L
# M; E6 o4 f9 I+ V2 @
. R) w4 m8 K8 s; R a' W" z ![]() ![]() ![]()
5 r3 b9 a( ~' h3 f+ q. p8 G* C1 m
' R0 x- k, F/ `( Z' [" h5 G& V2 r注意node列表里实体和区域的顺序很重要!这决定了引擎绘制的顺序,会影响物体间的遮盖。$ U1 y( S. y1 l( F
在这个场景里实体间的顺序不太重要,因为它们之间不互相重叠,但平时的制作中你需要时刻注意这个问题。(测试了一下,区域实体不影响绘制,但是会与实体发生遮挡,比如你在椅子上划定一块区域实体,在游戏时鼠标移到重叠的部分,是与区域实体互动而不是椅子)2 S2 Z9 k2 a6 [- s+ _
7 B2 Z' d& z+ _! G
, N% I: h1 \9 }) C 2 l8 W v5 [& p, X
" Y4 |+ c0 ] _- K
现在测试一下,门、柜子、和窗户都是可“互动”的了。- i! h& F' s+ |' p( }
: ^' x$ p: J4 ?. T/ j' Z
[光标]
6 X' e$ M7 m6 ^1 x4 o- x/ N) \5 E/ ^5 o$ S
你已经知道当鼠标移到可以互动的物体上时光标会改变,默认提供两种光标--标准(standard)和活跃(active),可以在PM左边的设置里改变光标图像。但我们还可以为一些物体指定特殊的光标(比如鼠标移到一本书上时,变成一个翻书的标志),现在以门作为例子,使鼠标移到门上时变成一个箭头。; @4 M O7 g$ E% b4 h! R( i1 g
7 i: ~* K) G7 V+ q' m! O9 Y返回SceneEdit并选择之前创建的区域实体door。9 L9 z2 i% F" ~! k( v
7 i: }! |5 B( X) E r
提示:你可以直接在右边的预览的窗口双击一个东西,就会自动选择它。 I5 r6 I1 o6 G1 U
; h' ^, d) L' O( p1 V6 X) Z3 S在左下角的信息栏中有一个“Cursor”属性,点击后面的"..."按钮选择光标图像,你可以在demo文件夹下的“data\sprites\system”里找到arrow_left.sprite文件并载入(貌似光标图像可以是普通的图片,但sprite文件可以指定焦点,更合适)。
* O# o* G. y$ X" f, D
3 b& M* k% h1 ?6 G, W9 r g提示:如果你想删除之前指定的光标,点击“...”按钮后点击Cancel按钮,SceneEdit会询问你是否删除。' p; G5 v$ T7 g, \ K- P
; O# I# W/ V: f, b) Y g; M
1 i# n1 J; p; k% A0 ^: C# A
保存并测试,效果应该如下图。
4 ^# w( X8 H: N( }& g+ s' f! E8 D4 u( i' {1 H7 S9 h7 ?+ ]$ H' k
, F* J; i6 M3 b$ ? ! {, K+ Y8 I1 B& x9 v
$ L: E3 Z) x. y; g/ M7 a1 i[脚本]
: \2 \. K# q4 r8 i
; G) U( K4 V+ G- T2 o2 M! h: T现在场景中有了一些可以互动的物体,但你点击它们后不会有什么事发生,你不能对话、开门、或者捡东西。我们需要写一些脚本实现这些效果,脚本就是一小段程序。在以后我们会对脚本进行深入讲解,在这一章只会粗略涉及。
/ C3 u7 m8 G b9 [- t) C$ c
& z7 M; u2 r- G% d; R8 ~1 I$ y8 E& a我们将为桌子添加一段脚本。首先返回到PM,右键单击MyScene文件夹下的scr文件夹(场景中的脚本储存在这个文件夹里)并选择Add script来添加脚本。/ w+ s. n; \4 {# o9 C# T
7 n: p0 w0 s4 r' k. p7 Y8 E/ q' z
7 @" j8 _+ V6 t* T
$ `5 w2 S& t b- H3 y% [在模版选择窗口选择"scene object"模版,并将名称改为desk,这样一个脚本文件就创建好了。
" r4 D9 k" [ O! t
' n) P' u& v* c![]()
5 y0 M5 |- _0 ?( F' ?7 q2 ?" @ : }, ^$ {' I5 ~
1 S w9 A8 ~0 b& o# l/ ^( j( S8 i回到SceneEdit,选择desk实体,在左下角的信息栏中找到“Scripts...”按钮,首先弹出的是创建新脚本的窗口(你也可以在这里创建新脚本,而不是在PM里),关闭后弹出新的窗口,如下图 中,在这里可以为实体添加一个或多个脚本,下图使用的是老版本,新版本中六个图标功能从左到右依次是:下移、上移、创建新的脚本、打开已有的脚本、编辑脚本、删除脚本。打开之前创建的desk.script脚本。(添加脚本后可以保存并测试一下游戏,试着右键点击一下桌子看看效果)0 L' z }* ]5 }7 o" T, d! U
7 ~ R/ }% I9 l: x6 o! z4 |, n![]() ![]() 9 f. J5 c; o! Y% h0 l
9 f# D1 ^& r" A+ [& X d
之后点击编辑脚本按钮,或者双击列表中的脚本,SceneEdit会打开一个文本编辑器供你编辑。
* i9 [8 o/ a$ r' b I$ E现在脚本应该是这样(事实上不是这样,新版本里还有另外两段内容,但这里以这两段为例):% V% E, ?% ^5 X
. \6 ^. ]. ?9 y! O, n7 @+ ]$ K5 L+ R& A* e3 N6 K1 t$ b
#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]} |
5 e0 H4 W" y+ {$ M# n' N. d6 w$ W2 w1 Z* @5 e
因为你不可以与桌子对话,你可以把整个on "Take"命令删除掉,这样当角色试图与桌子对话时,引擎会会调用默认的Talk方法,显示无法对话。
/ g5 g$ O3 |7 Z
$ t) _! {4 ]) f2 _保存并测试一下。右键点击桌子后效果如下图(这个菜单是demo默认的,可以修改),可以点击按钮试试效果。
2 R- z# `* N- W1 n- }
3 X' H& y, d7 b- A$ P![]()
; e: Z5 B7 G/ Z& u: O
6 F% l) m. @7 G! p6 n这一章结束了~. s8 q2 R" r9 s- K2 `% F( ^9 N2 p
( X4 K) k5 K7 `2 _
/ X6 ]6 |# ?9 Q ]9 T帮助文档使用的是老版本,这一章与现有版本有许多出入,写得比较匆忙,如果有错的话留言提醒我修改下。0 S/ a$ X' X4 l& w; T
关于脚本的内容,有编程基础的人很容易看懂,没有编程基础的人得好好理解一下,我尽量试着讲得浅显一些。" R6 z/ @+ S0 v4 A1 ^- }
步骤8、9内容比较少,下午发完~ |