【Unity3D】RTS Engine-放置建筑-笔记七

目录

6.1 配置建筑预制件(Configure Building Prefab)

6.1.1 建筑结构类型

6.1.2 建筑放置者组件(Building Placer Component)

6.1.3 建筑工人管理器(Building Worker Manager)

6.2 构建单位(Builder Unit)

6.2.1 General

6.2.2 目标搜索/选择器(Target Search/Picker)

6.2.3 设置目标(Setting Target Tab)

6.2.4 处理进展(Handling Progress)

6.2.5 布置任务(Placement Tasks)

6.3 建筑放置管理器(Building Placement Manager)

6.3.1 所有派系建筑布局(All Factions Building Placement)

6.3.2 本地玩家阵营建筑放置(Local Player Faction Building Placement)

6.3.2.1 General Properties

6.3.2.2 Rotation Properties

 6.3.2.3 保持和刷出属性(Hold And Spawn Properties)

6.3.3 测试

6.4 设置边界(Setup Border)

6.4.1 配置领地(Configuring Border)

6.4.2 测试


6.1 配置建筑预制件(Configure Building Prefab)

6.1.1 建筑结构类型

找到 Building Manager 

  • Health: 建筑是由建造者建造和修复的,每个活跃的建造者定期为建筑增加生命值,直到达到最大生命值
  • Time: 建筑是由建造者在一定时间内积极建造并修复,直到达到最大生命值。活跃的并发构建器越多,构建构建所花费的时间就越少

6.1.2 建筑放置者组件(Building Placer Component)

选择 building_extension 子对象。这包括以下组件,使建筑有可能被放置在地图上。

  • Placable Terrain Areas: 可放置地形区域。定义建筑物可以放置的地形区域类型。当将此字段保留为空时,可以使用任何区域类型来放置地形。
  • Can Place Outside Border: 可以放置在外部边界。如果你按照这个初学者教程的顺序,我们还没有开始讨论边界组件。但是我们希望启用这个字段,否则建筑必须包含在其派系的领土内,使用我们尚未使用的边界来定义。
  • Can Place In Enemy Border: 当这个字段被启用时,建筑可以放置在敌方阵营的领土内,该领土是由我们尚未使用的边界定义的。
  • Ignore Layer Mask:放置建筑时忽略遇到的指定类型障碍
  • Place Audio: 当本地玩家(local player)放置此建筑时播放的音频。
  • Debug: 启用此选项可以在控制台上打印调试语句,每当本地玩家放置的建筑被移动到一个新的放置位置时,该语句就会被记录下来
    • Border: 边界。当边界要求被满足时为true,比如当建筑可以放置在边界外或当它正确地位于派系边界内时。
    • Map Terrain: 地图地形:当建筑物被放置在正确的地图地形区域时为真
    • Overlapped Colliders: 如果没有障碍物与建筑物碰撞,则没有任何内容;如果有碰撞器,则没有任何名称
    • Conditions: 条件。当满足所有建筑物放置条件时。

Building Placer组件需要附加到同一对象的两个附加组件(默认情况下应该已经附加):

  • Collider组件与Is触发器启用,使其他建筑物不能被放置在这个建筑物的碰撞。
  • 刚体组件,Use Gravity禁用,Is Kinematic启用。

6.1.3 建筑工人管理器(Building Worker Manager)

该组件负责允许建筑商单位在建筑物放置后进行建造,并在建筑物损坏时进行修复。

  • Code: 唯一代码标识
  • Worker Positions: 这个数组的大小表示可以同时建造建筑物的最大建造单位数量。当你让这个数组的元素为空时,工人单位将根据他们的位置和建筑物的位置选择最近的位置来建造建筑物。当使用transform赋值时,数组的元素将表示单元需要到达的静态位置,以便开始构建建筑物。
  • Forced Terrain Areas: 强制地形区域。当你有静态工人位置时(上面数组中的元素被分配),那么你可以定义地形区域类型,以确保在放置建筑物时静态工人位置位于特定的地形区域(具体来说,工人位置的高度被调整为地形区域的高度)。由于我们不使用静态构建器位置,那么我们也可以不分配此字段。
  • Define Max Amount / Max Worker Amount: 允许设置独立于“Worker Positions”字段的工人的最大数量。此字段的数量必须小于“Worker Positions”数组的大小。

6.2 构建单位(Builder Unit)

配置单位,来建造建筑物。给 tutorial_unit 添加 Builder 组件

Entity Component (Source: IUnit - Target: IBuilding)

该组件可附加到IUnit类型的实体(它引用单元实体使用的接口),并且它可以将IBuilding(用于构建实体的接口)作为其目标。

6.2.1 General

  • Code: 唯一代码标识
  • Is Active: 确保启用该功能
  • Priority: 优先级。具有最小值的活动组件将被考虑用于鼠标右键单击目标集
  • Require Idle Entity: 要求空闲实体。启用此字段强制单位在建造建筑物时必须处于空闲状态,并且没有任何其他具有活动目标的组件。

6.2.2 目标搜索/选择器(Target Search/Picker)

  • Target Finder Data: 允许建造者在特定范围内自动寻找建造或修复的建筑,而无需玩家命令他们这样做。(设置允许实体自动启动该组件的设置。关于Target Finder Data 查找了其源码)
    • Enabled:是否搜索到潜在目标?
    • Reload Time: 搜索多久启动一次?
    • Range:搜索的范围是多大?
    • IdleOnly:源实体处于空闲状态时才允许搜索目标器?

  • Can Construct: 可以建造。建造者可以建造和修理建筑物吗?当禁用时,建造者将只能放置建筑物,而不是实际的建筑物。

  • Construction Target Picker: 建筑目标选择器。定义了单位可以建造的建筑。

    • TargetUnits:Allow to target units?

    • TargetBuildings:Allow to target buildings?

6.2.3 设置目标(Setting Target Tab)

  • Set Target Task UI: 具有设置目标能力的实体组件允许玩家在实体被选中时通过右键点击目标或在实体被选中时通过出现在专用UI任务面板中的专用任务来设置目标。
  • Order Audio:玩家分配一个新的目标播放一个音频

6.2.4 处理进展(Handling Progress)

  • Progress Max Distance: 当建造者有一个目标建筑要建造时,他会在开始建造前在该建筑周围找到一个位置。以确保建造者靠近它所建造的建筑。
  • 取决于我们在前面的指南中配置建筑预制件之前在Building Manager组件中设置的Construction Type值
    • Construction Type set to Health: 

      Progress Duration:周期性地进行构建,并且对于每个周期,将在 Health Per Progress 字段中分配的健康值添加到正在构建的目标建筑物中。在本教程中,我们使用基于生命值的建筑,所以我们将进度持续时间设置为1秒,每个进度的生命值为10点。所以每一秒钟,建造者都会给目标建筑增加10点生命值。
    • Construction Type set to Time:

      Time Multiplier:建造者可以加快多少所需的建造时间。当一个建筑正在建造时,完成该建筑所需的时间等于最大建筑总建造时间(在建筑生命值中分配)除以(1 +所有活跃建造者的乘数总和)。
  • Progress Override Controller: 独特的建造动画。
  • Fetch Construction Audio Once: 启用时在整个建造过程中提取一个音频并循环播放。禁用时,每当建筑者向其正在建造的目标建筑添加声明时,便会获取并播放音频

    When enabled, only one audio clip from the 'Construction Audio' will be fetched and looped the entire time the builder is constructing the building. When disabled, an audio clip is fetched and played every time the builder adds health points to the target building it is constructing.

6.2.5 布置任务(Placement Tasks)

为了实现创建建筑的任务功能,我们需要创建一个UI来负责实现这个功能

Create -> RTS Engine -> Entity Component Task UI Asset,并将它命名为“tutorial_create_building_task”

设置如下并选择该实体组件任务

  •  Faction Entity Requirements:派系实体要求。定义一系列派系实体(单位或建筑物),派系槽必须在尝试创建与任务相关的建筑物之前创建。
  • Missing Requirement Data: 缺失需求数据。当玩家没有所需的资源或阵营实体要求来启动任务时,该字段会影响任务面板上任务的视觉方面。

建筑创建任务属性(Building Creation Task Properties)

  • Prefab Object:定义了将通过此建筑创建任务放置的实际建筑。

6.3 建筑放置管理器(Building Placement Manager)

GameManager -> Essential -> BuildingExtension

6.3.1 所有派系建筑布局(All Factions Building Placement)

  • Building Position Y Offset: 建筑位置Y偏移量。
  • Terrain Max Distance: 地形最大距离。要放置的建筑和它可以放置的地形之间的最大距离
  • Placable Terrain Areas:  可放置地形区域。当这个数组字段为空时,你将无法在地图上放置任何建筑。
  • Ignore Terrain Areas: 忽略地形区域。建筑放置实例将忽略与该数组字段中分配给地形区域的图层对象的碰撞。
  • PlaceBuildingAudio:当玩家放置建筑时播放的音频

6.3.2 本地玩家阵营建筑放置(Local Player Faction Building Placement)

6.3.2.1 General Properties

  • Reserve Placement Resources: 储备安置资源。储备将用于安置建筑的资源,以便玩家阵营在安置完成之前不会消耗它们。
6.3.2.2 Rotation Properties

放置建筑物时,可以旋转角度。

  • Can Rotate: 允许在放置建筑物时旋转建筑物。
  • Positive/Negative Rotation Key:  正/负旋转键。定义了玩家可以按住的键,以便在放置建筑时分别在正方向和负方向改变建筑的旋转。
  • 通过 create -> RTS Engine -> Control Type 来创建控制类型的“键”
    •  Key: 控件类型的唯一代码
    • Default Key Code:  默认键码。分配给控件类型的默认键码
    • Enable Type: 启用类型。使用Hold类型来启用旋转键。另一个选项是Toggle,它通过一次按压激活或停用键启用状态。默认情况下,正/负旋转键字段分别使用预先创建的控制类型和H/G默认键代码分配。
  • Rotation Speed: 旋转速度。当玩家按住正旋转键或负旋转键时,建筑的旋转速度
 6.3.2.3 保持和刷出属性(Hold And Spawn Properties)

当玩家放置建筑时,他们可以按住一个特定的键,让自己连续多次放置相同类型的建筑

  • Hold And Spawn Enabled:  启用保持和刷出。启用此功能允许多个连续的建筑放置。
  • Hold And Spawn Key: 保持和刷出键。一种控制类型,它定义了按下该键可以连续放置多个相同建筑类型。
  • Preserve Building Rotation: 保持建筑旋转。允许每个新放置的建筑实例与最后放置的实例在相同的保持和刷出链中具有相同的旋转。

6.3.3 测试

出现一些报错,将Building Placement 中的 Ignore Terrain Areas 数组数量置为0,建筑的 Faction Entity 中的 Material ID 改为0,

更改单位模型后解决报错

  • 又发现建筑建造的单位预制体给错了
  • 建筑与建筑之间会出现不可建造的情况(符合预期),但是建筑与单位建为可建造状态(不符合预期),与场景中不是自己的阵营单位的话是不可建造状态......最后也没找到相关设置......

利用建筑创建单位后,点击单位或框选相同的一群单位后可建造上文中配置的建筑并可以进行旋转,连续放置也是可以的。建造期间将建造者挪开后建筑停止增加血亮,再次挪回来并右键击中后将再次建造。

6.4 设置边界(Setup Border)

边界组件可以放置在建筑物上,以定义拥有该建筑物的派系所占领的领土。

6.4.1 配置领地(Configuring Border)

只将这个组件添加到tutorial_map场景中的tutorial_building的主实例中,这意味着我们不会将它添加到实际的预制件中。将Border组件添加到场景中tutorial_building实例的主对象中。边界的基本实现是围绕它所连接的建筑的圆形区域。

  • Size: 距离小于或等于此字段值的任何物体都属于边界所定义的领土。
  • Border Prefabs:边界预制件。找到 border_object 并配置。
  • Building Limits: 允许你在它所定义的领土内限制建筑的放置。例如,我们可以限制可以放置在边界内的tutorial_building实例的数量为3。
  • 还可以通过配置categories字段而不是代码来定义基于完整建筑类别的限制,或者使用两者的组合。通过在检查器中的代码数组中输入建筑物的不同代码,也可以将建筑物的放置限制应用于不同类型的建筑物。

为了测试领地需要将建筑上的 允许放置在领地外的选项勾掉

6.4.2 测试

仅可以在范围内放置该建筑,且最多放置3个

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值