Unity 开发人员的城堡游戏引擎概述
2. Unity相当于什么GameObject
?
GameObject
Unity 中的东西(简化)存在于你的世界中,并且可能是可见的,并且可能有受转换影响的子元素。
对于游戏对象(不是用户界面), Castle Game EngineGameObject
中最接近的等价物是类。的实例可以按层次结构排列,其中每个元素都会变换(移动、旋转、缩放)子元素。CGE 最重要的类是,它是实际上可以渲染/动画/碰撞模型的后代。只需设置为在那里加载您的模型(如 glTF 文件)即可。TCastleTransform
TCastleTransform
TCastleScene
TCastleTransform
TCastleScene.Url
<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#f7f7f8"><span style="color:#333333"><code>MyScene.Url := <span style="color:#dd2200"><span style="color:#dd1144">'</span><span style="color:#dd1144">castle-data:/my_model.gltf</span><span style="color:#dd1144">'</span></span>;
MyScene.Translation := Vector3(<span style="color:#009999">1</span>, <span style="color:#009999">2</span>, <span style="color:#009999">3</span>);
MyScene.PlayAnimation(<span style="color:#dd2200"><span style="color:#dd1144">'</span><span style="color:#dd1144">run</span><span style="color:#dd1144">'</span></span>, true);</code></span></span></span></span>
层次结构TCastleTransform
放置在 a 中TCastleViewport
,它是 2D 用户界面元素( 的后代TCastleUserInterface
)。
对于作为用户界面元素的对象,最重要的基类是TCastleUserInterface
。它有很多后代,比如
-
明显的用户界面控件:TCastleButton
、TCastleLabel
、TCastleRectangleControl
、TCastleImageControl
...
-
布局:TCastleVerticalGroup
, TCastleHorizontalGroup
,
-
最后TCastleViewport
是一个关键的 UI 组件,它是实际渲染TCastleTransform
.
3. 如何设计一个由多种资产、生物等组成的关卡?
在最简单的情况下,您为每个 3D 模型创建一个TCastleScene
实例。您可以使用CGE 编辑器直观地执行此操作,也可以通过代码执行此操作。
要将多个TCastleScene
实例分组(并转换为一个组),您可以使用其他TCastleTransform
实例。它TCastleScene
也是一个TCastleTransform
后代,所以它也可以有孩子。
遵循模板“3D FPS Game”(通过运行我们的编辑器创建它,选择“New Project”,然后选择“3D FPS Game”作为起点)。data/gameviewplay.castle-user-interface
在生成的项目中,在编辑器中打开设计,以实际了解我的意思(在这个和之前的答案中)。
我们使用CGE 编辑器的目标是提供与 Unity 和其他游戏引擎编辑器类似的体验。因此,您可以将 3D 模型拖放到设计中,然后拖动它们来设计关卡。
4. 在哪里放置特定角色的代码(例如生物、物品)?Unity 中“向 GameObject 添加 MonoBehaviour”相当于什么?
-
定义一个来自的类TCastleBehavior
(请参阅behaviors),并将其实例添加到TCastleTransform
。喜欢
<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#f7f7f8"><span style="color:#333333"><code> <span style="color:#000000"><strong>type</strong></span>
TMyBehaviorClass = <span style="color:#000000"><strong>class</strong></span>(TCastleBehavior)
<strong>public</strong>
<span style="color:#000000"><strong>procedure</strong></span> Update(<span style="color:#000000"><strong>const</strong></span> SecondsPassed: Single; <span style="color:#000000"><strong>var</strong></span> RemoveMe: TRemoveType); <strong>override</strong>;
<span style="color:#000000"><strong>end</strong></span>;</code></span></span></span></span>
<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#f7f7f8"><span style="color:#333333"><code> <span style="color:#000000"><strong>var</strong></span>
MyBehavior: TMyBehaviorClass;
<span style="color:#000000"><strong>begin</strong></span>
MyBehavior := TMyBehaviorClass.Create(SomOwner);
MyBehavior.Xxx := ...; <span style="color:#999988"><em>// configure necessary parameters</em></span>
MyTransform.AddBehavior(MyBehavior);
<span style="color:#000000"><strong>end</strong></span>;</code></span></span></span></span>
请参阅我们的模板“3D FPS Game”(通过运行我们的编辑器创建它,选择“New Project”,然后选择“3D FPS Game”作为起点),它准确地展示了这种方法。它定义了一个简单的TEnemy
类,该类定义了敌人的逻辑,并且是TCastleBehavior
后代。它控制着敌人的行动。它还允许通过检查来检查(例如,当射击射线时)“我是否击中了敌人” SomeTransform.FindBehavior(TEnemy) <> nil
。
虽然上面的示例显示了使用代码附加行为,但您也可以TEnemy
在编辑器中添加。有关如何在编辑器中注册类的信息,请参阅编辑器和自定义组件TEnemy
文档。这需要使用菜单选项“Project -> Restart Editor (With Custom Components)”重新启动项目内的编辑器。这是一个额外的步骤,但对于复杂的行为来说是有意义的,可以更轻松地在编辑器中配置这些行为。
-
您可以从视图中控制事物(请参阅视图)。像这样的视图TViewPlay
(参见上面提到的模板“3D FPS Game”)有自己的方法来Update
处理输入。视图可以保留对您世界中所有事物的引用,并且可以控制它们。
例如,您可以像这样处理视图方法中的所有生物TViewPlay.Update
。我们关于使用代码控制视口的手册显示了移动多辆车的示例。
-
您还可以分配事件,例如OnClick
. 大多数 UI 控件都会公开明显的事件,例如TCastleButton.OnClick
. 您可以自由地在一个中心位置处理这些事件(例如 LCLTForm
后代(仅当您使用TCastleControl
)或 CGETCastleView
后代)或分散处理(例如,创建您自己的类的不同实例来处理每个不同生物、不同项目的事件) 。
使用事件的方法类似于在 Lazarus LCL 或 Delphi VCL 中使用 UI。
当您想要在一个类(视图)中处理与某些 UI 相关的所有事件(例如单击游戏选项中可见的所有按钮)时,此方法是最佳选择。
-
在 CGE 中控制事物的另一种方法是从现有类创建类后代。在 CGE 中,您可以从几乎所有类(包括 importantTCastleTransform
和TCastleUserInterface
)创建后代,并在那里重写虚拟方法。例如,您可以重写TCastleTransform.Update
以每帧执行某些操作。
因此,您可以定义一个类似从or派生的类TMyCreature
。这个类将控制它自己的变换(例如,它会改变它自己的变换以移动生物),并且它可能会加载一些子项(更多和实例)来显示生物并为其设置动画。TCastleTransform
TCastleScene
Translation
TCastleTransform
TCastleScene
这是一种经典的 OOP 方法。这就像虚幻引擎一样,允许您定义自己的角色类来覆盖基类。
5.Unity子目录相当于什么Assets
?
子目录中的所有内容都data
可以在运行时加载。Assets/Resources/
从这个意义上说,如果你关心细节的话,它实际上类似于Unity的子目录。
my_project/ <- 项目根目录
CastleEngineManifest.xml <- 此清单文件由 CGE 构建工具和 CGE 编辑器使用
data/ <- 游戏数据存放在这里;由你决定如何组织这个
CastleSettings.xml <- 定义 UI 缩放、默认字体
示例_图像.png
示例_模型.gltf
gameviewmainmenu.castle-用户界面
...
code/ <- Pascal 游戏代码位于此处;由你决定如何组织这个
游戏初始化.pas
gameviewmainmenu.pas <- 帕斯卡单位(按照惯例)对应于 gameviewmainmenu.castle-user-interface
...
... <- 还有其他子目录和文件吗?由你决定。考虑 docs/ 和 README.md。
请参阅支持的模型格式。简而言之:glTF 是最好的:) 此文档页面还链接到各种创作工具“如何导出数据”的说明。
不,我们可能永远不会这样做(除非间接通过一些通用转换库)。FBX 是 Autodesk 的专有模型格式。请不要使用 FBX,它是专有的(Autodesk FBX 规范故意“保密”,并且 Autodesk 只通过其付费 SDK 批准使用 FBX),而且也不是那么好。使用 glTF。
8. 我应该使用 TCastleWindow 还是 TCastleControl?
答案的简短摘要:使用 TCastleWindow。如果您想要的只是一款跨平台游戏,其中所有内容均使用 Castle Game Engine 渲染。如果您来到这里并且想要“只是使用 CGE 制作游戏”,请使用TCastleWindow
.
-
TCastleControl 意味着引擎渲染在 Lazarus 形式内。也就是说,TCastleControl 是一个常规的 Lazarus 控件,可以放置在更大的窗体上。您可以使用Lazarus设计器来放置LCL控件,并且可以使用CGE编辑器来设计CGE控件(在TCastleControl内)。
-
TCastleWindow 意味着引擎渲染是一个单独的窗口,并且我们没有使用 LCL。您可以使用CGE编辑器来设计控件。因此,您无法访问 LCL 控件,但作为交换,您可以获得完美的跨平台代码(Android、iOS、Switch 仅适用于 TCastleWindow)。
在这两种情况下,您都可以使用 Lazarus 作为 IDE — 来编写代码、调试等。在这两种情况下,您都可以使用 CGE 编辑器来设计 CGE 控件(位于 TCastleControl 或 TCastleWindow 内部)。
9. 在哪里Time.timeScale
?
等效的方法是设置MyViewport.Items.TimeScale
.
它特定于给定的世界,这是TCastleAbstractRootTransform
可用的实例MyViewport.Items
。简单的游戏只有一个视口,一个TCastleViewport
实例。的多个实例TCastleViewport
是可能的,然后可以共享同一个世界,或显示不同的世界(只需在Items
之间分配)。
可以通过额外的时间缩放TCastleScene.TimePlayingSpeed
。这在给定TCastleScene
实例中是本地的。
10. 在哪里Time.deltaTime
?
在Container.Fps.SecondsPassed
. 请参阅查看事件以获取最简单的用法示例。
11. 使组件处于非活动状态
TCastleTransform
和都TCastleUserInterface
具有布尔Exists
属性:TCastleTransform.Exists
, TCastleUserInterface.Exists
。默认情况下这是true
. 只需将其设置为false
即可使所有组件的行为就好像该组件不属于层次结构一样。不存在的组件不可见、不碰撞、不处理任何输入、不引发任何事件等。因此 UnityGameObject.SetActive(xxx)
翻译为 CGE MyTransform.Exists := xxx
。
12. 用户界面缩放
我们有 UI 缩放功能,可以智能地适应任何屏幕尺寸,其工作原理类似于 Unity 画布缩放。它允许假设特定的窗口大小进行设计,只要设置合理的锚点,设计在各种屏幕分辨率(即使具有不同的宽高比)下看起来都是合理的。它只是缩放坐标 - 实际渲染是针对最终分辨率完成的,因此它看起来总是“清晰”。
13.统一服务
“服务”是指“在构建阶段添加的二进制或源代码形式的项目的一部分”。
-
Android 服务可能包含 Java 代码、Android 预编译库、Gragle 配置等。
-
iOS 服务可能包含 Objective-C 代码、iOS 预编译库、CocoaPods配置等。
-
在其他平台上,到目前为止我们不需要类似的概念。例如,通过公开 FMOD 或 Steam API 等的普通 Pascal 单元,始终可以将 CGE 与桌面上的第三方服务集成。也就是说,有一天我们可能会为其他平台添加“服务”。
14. 着色器
我们有合成着色器,类似于 Unity3d“表面着色器”,但增强了:)我对此感到非常自豪,它确实允许轻松编写一段着色器代码并将其添加到某些形状中,并且(与 Unity3d“表面着色器”相比)着色器”)它有一些很酷的新功能,例如组合多种效果的能力(因此您可以编写一个着色器效果,也许添加另一种着色器效果),或者更改灯光或纹理的着色或制作程序生成(在 GPU 上)纹理。
15. 视口
在 Unity 中,典型的世界是 3D 的层次结构GameObject
。
-
在这个世界的某个地方,您有一个Camera
组件,它确定相机参数(如投影)和视口大小。关联的变换GameObject
决定了相机的位置和旋转。
-
您可以Camera
在不同的游戏对象上拥有多个组件以拥有多个视口。
-
在这个世界的某个地方,您有一个画布,可以充当按钮和图像等 2D 控件的位置。
在 CGE 中,情况有点不同。Viewport( TCastleViewport
)是一个2D控件,它可以在里面渲染3D世界。
-
您设计组件的层次结构TCastleUserInterface
。它们都具有相同的属性来控制位置和大小,使用锚点,使用FullSize
(填充父级等)。
-
有许多TCastleUserInterface
后代,例如按钮、图像和视口。
-
在视口 ( TCastleViewport
) 实例中,您可以放置 3D 世界(在 中Viewport.Items
)。
-
视口始终与 中的一台摄像机连接Viewport.Camera
。该摄像机确定投影设置以及观看者的位置和旋转。
上面描述了编辑器模板中的典型设计。要查看其实际效果,请使用“3D FPS Game”等模板在编辑器中创建一个“新项目” ,然后在编辑器中打开设计。data/gameviewplay.castle-user-interface
简而言之,在 Unity 中,“视口”、“相机”和“UI”只是 3D 世界中的东西。在 CGE 中,“视口”(以及相应的“相机”)包含您的 3D 世界,而“视口”是您 UI 的一部分。
-
在 CGE 中,“视口”可以像任何其他 2D 控件一样定位/调整大小。有关显示 4 个视口的示例,请参阅Examples/viewport_and_scenes/multiple_viewports 。
-
CGE 中视口的 Z 顺序(前面/后面)很简单,它的工作方式就像所有其他 2D 控件一样。您可以轻松地将其他 2D 控件放置在视口的前面或后面(如果视口有背景,后者很有用Transparent
)。
-
在 CGE 中,每个“视口”可能显示一个完全不同的、不相关的 3D 世界。视口还可以共享世界(从不同的相机显示相同的世界),只需将它们设置为相同的Viewport.Items
值即可。
16. 预制件
预制件是一种在文件中存储游戏对象层次结构并附加 Unity 组件的方法。
CGE 中通常的等效方法是创建一个xxx.castle-transform
文件,您可以在其中创建根为TCastleTransform
或 的设计TCastleScene
。这允许您构建TCastleTransform
/TCastleScene
实例的转换层次结构。然后,您可以将其xxx.castle-transform
作为单个内容多次加载。请参阅Examples/advanced_editor,该文件data/soldier_with_cape.castle-transform
中有此方法的最简单示例。
Unity UI 元素的预制件相当于 UI 设计文件,xxx.castle-user-interface
上面已经提到过。
Owner
18. CGE和CGE有什么区别Parent
?
因此Parent
和Owner
是不同的概念,甚至在不同的类中声明。
有时,如果在特定情况下合适,则可以将两者设置为同一实例,但一般来说,这两件事只执行两个单独的功能Parent
。Owner
例如,在 CGE 编辑器中,设计中所有内容的所有者始终是一个中心DesignOwner
组件。当您自己加载设计时,您Owner
显式提供实例(作为UserInterfaceLoad
, TransformLoad
, 的参数ComponentLoad
),然后您自己指定父级,但将设计添加到层次结构中(例如MyParentUi.InsertFront(MyLoadedUi)
)。
19.UnityWebRequest(WWW)在哪里?
20.物理力API
这是各种物理力方法(请参阅物理)从 Unity 映射到 CGE 的方式:
上述映射适用于默认 Unity 使用情况ForceMode.Force
。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)