【Unity3D】RTS Engine-资源-笔记八

如何创建资源类型并在游戏中使用它们

Resources | Unity RTS Engine Documentation (gamedevspice.com)

7.1 创建资源类型(Create Resource Type)

Create → RTS Engine → Resource Type

  • Key: 唯一代码标识
  • Display Name: 在引用资源类型时将出现在UI元素上的名称
  • Description: 将鼠标悬停在资源图标上时,出现在UI工具提示上的描述性文本
  • Has Capacity / Capacity Type: 有容量/容量类型。这里不做过多介绍,等后面使用的时候再讲
    • Enable to make the resource type a capacity one where it will have a maximum amount (capacity) property in addition

    • If 'Has Capacity' is enabled, pick the type of the capacity resource in this field. 'Simple Limit' means that the resource amount will be capped/limited by a maximum capacity amount. 'Slot Based' means that the free amount (difference between the capacity and the current amount) is the value that is available to be filled/used, the 'Slot Based' capacity allows for having population slots as a resource type for example

  •  Amount: 每个阵营从资源中获得的初始数量。由于这不是 capacity 资源,因此我们可以将capacity字段保留为空。
  • Icon: 在UI元素中引用资产的精灵

 7.2 在Map中定义资源类型(Define Resource Type In Map)

7.2.1 Resource Manager

GameManager → Essential → ResourceExtension

  • Resources Parent: 资源父对象。建议将所有默认资源放置在一个公共父对象下,其子对象将迭代以查找资源实体。
Demo中的资源实体

  • Map Resource Types:映射中可以使用的所有资源类型。

7.2.2 配置资源UI(Configure Resources UI)

7.2.2.1 基本UI管理器组件(Essential UI Manager Components)

GameManager → Essential → UI

Game UI Manager 和 Game UI Text Display Manager,它们可以通过代码进行扩展。

7.2.2.2 资源面板UI处理程序(Resource Panel UI Handler)

负责在UI中表示资源及其计数。

  • Task UI Prefab: 克隆的UI任务对象。
    • Resource Task UI:负责在UI中处理资源类型表示的必需组件
      • Image: 显示资源的图标
      • Tooltip Display Type: 如何显示工具提示?“使用指针进入和退出”或“指针向上和向下”。第一个选项适合桌面,而第二个选项更适合移动平台。
      • Amount Text UI: 显示本地玩家阵营的资源数量和容量
      • Collectors Text UI: 显示本地玩家阵营的资源收集器计数,例如有两个农民在收集木头,那么这个位置就会显示为2
    • 后面介绍了button组件并且文档中 On Click 事件被拖拽了一个UIClick事件,但是我这个版本中并没有拖入任何事件,且文档中还有设置EventTrigger事件,我这个版本依然没有。
  • Data: 允许输您想要在UI中显示的资源。
  • Panel: 带有Grid Layout Group组件的UI对象。这是将要创建的所有资源任务的父对象。
  • Resource Description As Tooltip: 当启用此字段时,当本地玩家将鼠标悬停在UI中的资源上时,将显示在resource Type资产中分配的资源描述。
  • Max Capacity Color: 当容量资源(有上限的资源)达到最大容量时,其在UI中的图标将使用该字段中分配的颜色。

7.2.3 测试使用资源

可以看到该资源,下方提示是鼠标悬停后显示的

更改建筑的所需资源

更改完成后运行,就会显示建造该建筑将会使用100个木材,并且在拍下建筑后木材直接减少100

且当资源不够后将会显示为设置的“红色”

7.3 创建资源实体(Create Resource Entity)

资源实体是一种单位可以在游戏中收集的实体,用来换取奖励给该单位所属阵营的资源点数。

比如树→木材,树就是一个资源实体

7.3.1 创建资源预制体(Create Resource Prefab)

  • Name: 在选择资源时出现在UI元素上的名称
  • Code: 唯一代码标识
  • Category: 类别。为资源指定一个(或多个)类别,允许其属于其他实体的某些组(不能只包括资源类型,因为类别可以在不同的实体类型之间共享)。(',')分开,且无空格
  • Description: 描述
  • Icon: 资源图标
  • Resource Type:资源实体将用于的资源类型。

设置完成后点击 Finalize Creation 

预制体路径在:Assets/Resources/ prefab。如果您希望将预制件移动到不同的路径中,请确保新路径始终以../Resources/Prefabs结尾。

打开这个预制体

7.3.2 资源组件(Resource Component)

Resource组件是资源实体的主要组件,它定义了资源类型及其一般配置。这个组件必须附加到资源预制件的父对象上。

7.3.2.1 Entity Tab

  • Model: 模型。将demo中的tree_resource_model拖拽到该物体下作为该物体的模型资源。
  • Radius: 资源实体在映射中应该占用的范围。
7.3.2.2 Resource Tab

  • Resource Type: 定义了资源实体将用于的资源类型。
  • Main Color: 资源颜色
  • Can Collect: 可收集的。确保启用此字段,以便收集资源。
  • Can Collect Outside Border: 可以收集外部边界。出于测试目的,请禁用此字段。由于tutorial_map已经为本地玩家阵营使用了边界,我们想要测试阵营领土内外的资源收集。
  • Auto Collect: 当启用时,资源收集者能够收集此资源并直接将资源点添加到他们的阵营中。当被禁用时,资源收集者必须收集这个资源,然后在一个投放点将资源添加到他们的阵营。现在,我们将启用自动资源收集,并将在稍后禁用它,以详细介绍资源丢失。所以要确保这个字段是启用的。

7.3.3 资源生命组件(Resource Health Component)

7.3.3.1 General Tab

  • Max/Initial Health:资源实体将生成1000点tutorial_resource_wood点,这些点可以由一个单位收集。
  • Can Increase/Decrease: 将保持启用这些选项,因为不希望通过增加或减少来锁定资源的运行状况更新。
7.3.3.2 Destruction Tab

  • Destroy Object/Delay: 破坏对象/延迟。
  • Destroy Award:资源将被授予其实体造成破坏的阵营。 没理解啥意思,是指掠夺吗?文档这个时候也没介绍

    Resources to be awarded to the faction whose entity deals the damage that destroys this.

7.3.3.3 Health States Tab

健康状态

对于资源,在第一次收集资源时触发一个特殊的“收集状态”。当单元开始收集资源时,我们将使用该字段将资源的模型更改为不同的模型。

7.3.4 其他的主要组件(Other Main Object Components)

  • Nav Mesh Obstacle: 导航网格障碍。为了使资源成为地形导航网格的一个整体,你需要将导航网格障碍组件添加到父资源的对象中,并在其上启用雕刻。

7.3.5 资源选择(Resource Selection)

7.3.5.1 Selection Component

资源选择允许定义使用什么碰撞器来检测玩家的鼠标点击,以便在游戏运行时选择资源

  • Is Active: 确保启用了此选项,以便可选择构建
  • Selection Colliders: 定义用来选择资源的碰撞器。每个碰撞器对象必须具有以下内容:
    • Collider component
    • Entity Selection Collider component
    • 确保参数可以覆盖模型
7.3.5.2 Selection Renderer

可视化的表示来指示何时选择资源。当资源被选中时,该组件是启用的,当资源没有被选中时,该组件是禁用的。就是下边那个方向选择框

  • Selection Renderer: 将Mesh Renderer组件拖放到这个字段中,分别在资源被选中或未被选中时启用或禁用。
  • Material ID: 选择渲染器使用资源所属的阵营颜色进行着色。这个字段定义了将在Mesh Renderer组件上着色的材质的索引。在tutorial_resource的选择渲染器的情况下,有一个材质,因此我们将此值设置为0。

7.3.6 资源扩展(Resource Extension)

目的是启用一个带有触发器的碰撞器,这样建筑物就不会被放置在资源对象的碰撞中。在这个tutorial_resource的例子中,一个(0,1.5,0)Center和一个(1.2,3,1.2)Size是合适的。

7.3.7 资源工作者管理(Resource Worker Manager)

该组件负责允许资源收集器单元从资源中进行收集。

  • Code: 唯一的代码
  • Worker Positions:可以同时工作以收集此资源的收集器单元的最大数量。
  • Forced Terrain Areas:强制地形地区。当你有静态工作者位置(上面数组中的元素被分配),那么你可以定义地形区域类型,以确保当资源被放置时,静态工作者位置是特定的地形区域。由于我们不使用静态工作人员位置,那么我们也可以不分配此字段。
  • Define Max Amount / Max Worker Amount:  定义最大数量/最大工人数量。启用Define Max Amount选项,允许设置独立于“Worker Positions”字段的工人的最大数量。启用后,字段Max Worker Amount将表示允许同时从资源实体收集的收集器的最大数量。此字段的数量必须小于“工作位置”数组的大小。

将该资源放置到场景中

7.4 向场景中添加实体(Add Resource Entity to Map)

向场景中创建一些实例,一部分放置在领地内,另一些放到领地外。确保所有资源实体实例都作为子对象添加到场景中的资源对象中。该对象在resource Manager组件中被指定为资源父对象。

启动场景,tutorial_resource实例现在在游戏中是可选择的。

7.5 配置资源收集单位

单元只有在附加了资源收集器组件的情况下才能从资源实体收集资源。

打开tutorial_unit预制并导航到它的unit_components子对象,然后将 Resource Collector 组件添加到其中。

Entity Component (Source: IUnit - Target: IResource)

这意味着该组件可附加到IUnit类型的实体(它引用单元实体使用的接口),并且它可以将IResource(资源实体使用的接口)作为其目标。

7.5.1 General Tab

  • Code: 唯一的代码标识
  • Is Active: 确保启用了该功能
  • Priority优先级。按照教程的说法是:由于该单位的移动目标的优先级是0,Builder的优先级为1,所以此字段设置为2。这意味着当玩家选择了单位并使用鼠标右键去设置目标时,移动将在建造者之前被考虑去设置目标
  • Require Idle Entity: 要求空闲实体。启用此字段强制单元在收集资源时必须处于空闲状态,并且没有任何其他具有活动目标的组件。

7.5.2 Target Search/Picker Tab

  • Target Finder Data: 允许资源收集器在没有玩家命令他们这样做的情况下自动从特定范围内寻找要收集的资源。启用后,需要设置以下属性
    代码中的解释是:设置允许实体自动启动该组件的设置

    Set the settings for allowing the entity to launch this component automatically

    • Reload Time: 单位在自动搜索其范围内的目标之前的一段时间(单位为秒)

      搜索多久启动一次

      How often does the search get initiated?

    • Range: 目标搜索范围的大小。

      搜索的范围有多大?

      How far does the search go?

    • Idle Only: 启用后,该组件执行的自动目标搜索仅在实体空闲时才会发生,这意味着附加到该实体的其他目标组件没有活动目标。

      源实体处于空闲状态时才允许搜索目标器?

      Only allow to search for a target if the source entity is in idle state?

上边几个属性还是看代码注释会好一些......

7.5.3 Setting Target Tab

  • Set Target Task UI: 具有设置目标能力的实体组件允许在实体被选中时通过右键点击目标或在实体被选中时通过出现在专用UI任务面板中的专用任务来设置目标。在  Add Movement Task  (向单位添加移动任务)中有做详细介绍。
  • On Target Resource Full Search: 在目标资源满搜索。当最后一个玩家分配的目标资源达到最大收集器容量时,定义下一个目标自动搜索的额外条件。此自动搜索中的搜索中心将是达到最大容量的目标资源的位置,其范围与常规收集器的范围相同。以下选项可用
    • None: 无附加条件
    • Prioritize Last Resource Type: 优先搜索最后一个资源类型
  • On Target Resource Depleted Search:  在目标资源耗尽搜索。为下一个目标自动搜索定义一个额外的条件,当最后一个玩家分配的目标资源耗尽(达到0生命值)。此自动搜索中的搜索中心将是已耗尽的目标资源的位置,其范围与常规收集器的范围相同。以下选项可用:
    • None: 无附加条件
    • Prioritize Last Resource Type: 优先搜索最后一个资源类型

7.5.4 Handling Progress Tab

  • Progress Duration/Max Distance: 当资源收集器有目标资源收集实体时,它会在开始建造之前在该建筑周围分配一个移动位置。Max Distance 以确保收集器保持靠近它收集的资源。Progress Duration字段中分配周期,周期性地进行收集。

    当有一个活动的目标时,组件需要多长时间才能进展并影响目标?

    When having an active target, how long does it take for the component to progress and affect the target?

    派系实体与其目标之间允许的最大距离,以便进程保持活跃

    The maximum allowed distance between the faction entity and its target so that progress remains active

7.5.5 Resource Collector Tab

对于单元可以收集的每种资源类型,需要在Collectable Resources数组字段中为其定义一个元素。因为到目前为止我们只有tutorial_resource_wood类型,让我们在检查器中添加一个元素到数组中(Demo中有4种):

  • Type: 定义单位可以收集收集的资源类型
  • OrderAudio: 当本地玩家命令单位开始收集/丢弃上述类型的资源时,播放的音频剪辑
  • Amount: 每个进度Progress Duration (在[Handling Progress Tab]选项卡中指定)要收集的资源量或收集资源的最大容量。
  • Animator Override Controller: 允许为上述资源类型定制资源收集/丢弃动画
  • Enable Object: 当上述资源类型被主动收集/丢弃时被激活的收集器的子对象。列如收集石头显示锤子
  • Enable Audio: 当单位开始收集/丢弃资源时播放的音频剪辑
  • Source Effect / Target Effect: 在收集过程中出现在源(资源收集器单元)和目标(正在收集的资源实体)上的效果对象。demo中没有显示出来,可能与需要 IEffectObject 接口有关?
  • Progress Audio: 当单位主动收集/丢弃资源时,播放的音频剪辑
  • Loop Progress Audio: 启用此选项以允许进度音频在单元收集期间循环,并禁用每次收集器收集资源单元时播放音频剪辑

7.5.6 测试

启动场景,选择tutorial_unit实例并右键单击其中一个树资源实体。如果你启用了自动目标搜索,那么你将看到它们移动到最近的资源实体去收集木材资源。当资源收集进行时,你可以在UI元素的左上角看到你的阵营的资源数量在增加,且显示当前收集器的数量。领土外的树木资源将不可收集并且ui中会提示,当领土外的资源勾选 Resource 中的 Can Collect Outside Border 选项后,该资源变为可收集资源

7.6 启用资源丢弃功能(Enable Resource Drop Off)

7.6.1 配置资源预制件

在资源组件上的资源选项卡中禁用自动收集字段,使其成为一个要求有掉落点,以获得此资源添加到收集者的阵营

7.6.2 配置投递目标(建筑)

仍然用场景中的建筑,在它的building_components子对象下,添加Drop Off Target组件并做如下配置

  • Code: 将此实体组件与附加到同一建筑实体的其他实体组件区分开来的唯一代码
  • Allowed Resource Types: 允许的资源类型。定义收集器允许在这里丢弃的资源类型。
  • Require Drop Off Position: 要求投放位置。启用此字段,以便强制收集者在与阵营实体相关的固定位置投放资源。当被禁用时,收集者将被允许在他们进入阵营实体半径范围内时丢弃他们的资源。
  • Drop Off Position:掉落位置。当需要掉落位置被启用时,资源收集器单元必须移动到的位置,以便正确掉落其收集的资源。你可以使用已经可用的unit_spawn_position子对象,或者创建一个新的,比如这里使用的resource_dropff_position。
  • Forced Terrain Areas: 强制地形区域。可以让这个数组字段为空,允许所有地形类型包括掉落的目标位置,或者添加唯一使用的地形区域类型,这将是ground_terrain之一。

7.6.3 配置投递单元(采集器单位)

打开tutorial_unit预制并将Drop Off Source添加到它的unit_components子对象中

Entity Component (Source: IUnit - Target: IFactionEntity with IResourceDropOff)

这意味着该组件可附加到IUnit类型的实体(它指的是单元实体使用的接口),并且它可以使用IFactionEntity(在单元和建筑实体上使用的接口),并使用实现IResourceDropOff接口(如DropOff Target)的组件作为其目标。

7.6.3.1 General Tab
  • Code:唯一代码标识
  • Is Active:  确保启用
  • Priority: 优先级。因为还有另外三个组件可以拥有一个活动目标,它们在Priority字段中的值分别为0、1和2,所以将这个组件的优先级设为3,当本地玩家选中单位并右键单击目标实体或位置时,将其标记为优先级最低的组件。
7.6.3.2 Target Search/Picker

组件会主动监控派系的掉落点,并总是选择最接近该单位正在积极收集的资源。

  • Target Picker:  定义可以用作掉落点的派系实体。我们将要测试的掉落目标是tutorial_building,因此不需要对具有掉落目标组件的实体类型执行过滤。所以我们可以把这个交给所有人。
    • Target Units:允许去往目标单位?

      Allow to target units?

    • TargetBuildings:允许以建筑物为目标?

      Allow to target buildings?

  • MaxDropOffDistanceEnabled:只允许单位在距离资源一定距离内的点投放资源

    Only allow the unit to drop off resources at points within a certain distance from the resource?

7.6.3.3 Setting Target

  • Set Target Task UI: 跟上边提到的一样,为了添加任务。
  • Order Audio: 同上播放音频
 7.6.3.4 Dropoff Resources/Capacity

对于单元可以收集和丢弃的每种资源类型,需要在drop off Resources数组字段中为其定义一个元素。

  • Type: 定义tutorial_unit可以丢弃创建的木材资源
  • Amount: 单位可以从资源类型中收集的最大数量,直到它不得不放弃,否则它将无法收集和携带更多的资源。由于资源收集器,Resource Collector Tab,每个进度周期收集10个单位的木材资源,现将此字段设置为50,以便单位每5个收集进度周期必须丢弃其收集的资源。
  • Animator Override Controller: 主动分配的资源类型时播放的动画。
  • Enable Object: 单元的子对象可以在此字段中分配,当实体主动丢弃在上述字段中分配的类型的资源时,该子对象将被启用。
  • Enable Audio: 开始放弃上述分配类型的资源时播放这个音频。

“Total Max Capacity”字段定义了从“Drop Off Resources”中分配的所有类型收集的资源的总量。由于我们只有一个最大本地收集容量为50的字段,因此我们也可以将该字段设置为50或任何高于该值的值。最后,当字段Drop Off On Target Available被启用并且达到最大容量时,该单元处于空闲状态,该单元将在可用时自动前往落点。

7.6.4 测试

当其中一个收集器单元达到50个木材资源收集时,它将移动到默认的tutorial_building,我们将其定义为资源下降点。当收集单位到达掉落点时,资源就会被添加到阵营中。然后,这些单位可以回到树资源,继续收集,开始下一个收集-丢弃循环。同时测试单位的收集情况

ProgressDuration和ResourceCollector中的Amount与Drop Off Resources中的Amount间存在关系:

  • 每ProgressDuration时间收集ResourceCollector中的Amount个的资源
  • 当数量达到DropOffResources中的Amount个时丢掉资源

7.7 使用容量资源(Use Capacity Resource)

容量资源类型允许通过施加上限来限制每个阵营可以拥有的资源类型的数量,即容量。

这里将创建一个容量资源类型,用于计算和限制单位实体的人口插槽。

7.7.1 创建容量资源类型

Create -> RTS Engine -> Resource Type,并将其命名为tutorial_resource_population,并做如下配置

  • Has Capacity: 有容量。确保该字段已启用
  • Capacity Type: 容量类型。定义资源如何处理其容量。
    • Simple Limit:资源数量将被最大容量限制。

      Simple Limit means that the resource amount will be capped/limited by a maximum capacity amount.

    • Slot Based:意味着空闲数量(容量与当前数量之间的差异)是可供填充/使用的值,例如,基于插槽的容量允许将人口插槽作为一种资源类型,因此,我们将在本例中使用该选项。

      Slot Based means that the free amount (difference between the capacity and the current amount) is the value that is available to be filled/used, the Slot Based capacity allows for having population slots as a resource type for example, therefore, we will use that option in this case.

  • Capacity: 单位实体人口槽的初始上限。以设置为10为例。
  • 图标就用演示文件中的villager_icon精灵。

7.7.2 配置单元预制件

在单位预制体上找到Unit组件并做如下配置

  • Init Resources: 添加一个元素,并将其类型分配给tutorial_resource_population资源类型,并将Amount设置为1。这意味着每当这种单位类型被启动时,派系的资源类型计数将增加1。
  • Disable Resources: 添加一个元素,并将其类型分配给tutorial_resource_population资源类型,并将Amount设置为-1。这意味着每当这种单位类型被摧毁/死亡时,派系的资源类型计数将减少-1。

7.7.3 配置单位创建者(Configure Unit Creator)

打开tutorial_building 预制件。

7.7.3.1 单元创建者所需资源(Unit Creator Required Resources)

找到建筑上的UnitCreator组件并添加 RequiredResources

在creation Tasks array字段的单元创建元素的Required Resources字段中,添加一个元素,并将其类型设置为tutorial_resource_population。

将Amount赋值为1并启用Non Consumable字段。这意味着在单位创建任务开始或完成之前,拥有该建筑的派系必须至少有一个指定资源的空闲插槽。

Non Consumable意味着任务完成后资源计数中不会添加任何内容。在我们的例子中,这是可取的,因为我们已经设置了tutorial_unit(通过这个任务创建的)来增加资源计数,因此我们考虑到已经预先放置在地图场景中的单位实例。

Non Consumable,源代码的解释是:启用此选项以禁止派系添加/删除给定的资源值

Enable this option to disallow the faction from adding/removing the given resource value.

7.7.3.2 增加容量(Increasing Capacity)

导航到建筑上的Building组件,并做如下更改

  • Init Resources: 添加一个元素,并将其类型分配给tutorial_resource_population资源类型,并将Capacity设置为5。这意味着每当这种单位类型被启动时,派系的资源类型的容量计数将增加5。这意味着建筑实体允许增加人口插槽容量,以允许创建5个以上的tutorial_unit实例。
  • Disable Resources: 添加一个元素,并将其类型分配给tutorial_resource_population资源类型,并将Capacity设置为-5。这意味着每当这种单位类型被摧毁/死亡时,该资源类型的派系容量计数将减少-5。

7.7.4 配置场景(Configure Scene)

7.7.4.1 定义场景中的资源类型

GameManager -> Essential -> Resource Extension。在“ResourceManager”组件的“MapResourceTypes”字段中,添加tutorial_resource_population类型。

7.7.4.2 定义资源类型UI (Define Resource Type UI)

GameManager -> Modules -> BasicUI。在ResourcePanelUIHandler的 Data字段中,为允许的UI派系类型定义tutorial_resource_population资源类型。这里还将禁用Display Collector Count字段。

7.7.5 测试

启动场景,选择tutorial_building实例,并创建tutorial_unit的两个实例。

当达到容量资源限制时:

  • 无法再启动单元创建任务。
  • 已经启动但仍然挂起的创建任务无法完成,现在处于冻结状态,等待取消限制。
  • 通过将人口资源图标涂成红色,更新左上角资源计数UI元素,以可视化显示已达到容量限制。

建造一个tutorial_building,将容量增加了5,这允许挂起的单元创建任务通过,允许生成单元实例,允许根据资源需求的可用性解锁创建任务。

存在的问题

  • 没搞明白为什么初始会是15人口上限,场景中仅有一个建筑应该只提供5人口上限。
  • 当我把场景中的物体全部删除后启动仍会显示有5人口上限
  • 树被砍时直接变成木块了,以后使用的话要再搞搞
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值