提交GAS 打算做一个帧同步的GAS

This commit is contained in:
DESKTOP-5RP3AKU\Jisol
2024-10-18 03:16:09 +08:00
parent b0a2e4a900
commit d9b0c78827
726 changed files with 76601 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
# EX-GAS Wiki -- Ability
> Ability是EX-GAS的核心类之一它是游戏中的所有能力基础。
>
> 同时Ability也是程序开发人员最常接触的类Ability的完整逻辑都是由程序开发人员实现的。
>
> 【EX-GAS目前没有能力的可视化编辑器后续计划会制作Ability的编辑器尝试实现自动化生成Ability脚本】
>
## 前言
在EX-GAS内Ability是游戏中可以触发的一切行为和技能。多个Ability可以在同一时刻激活, 例如移动和持盾防御。
Ability作为EX-GAS的核心类之一他起到了Do的功能。
Ability的业务逻辑取决于游戏类型和玩法。所以不存在一个通用的Ability模板当然可以针对游戏类型制作一些通用的ability。
Ability的逻辑并非自由如果胡乱的实现Ability逻辑可能会导致游戏逻辑混乱所以需要遵循一些规则。
---
Ability的具体实现需要策划和程序配合。
这并不是废话而是在EX-GAS的Ability制作流程中确确实实的把策划和程序的工作分开了
- 程序的工作编写AbilityAbilityAbilitySpec
- 策划的工作配置AbilityAsset
---
为了更好的理解首先我来介绍Ability的Runtime运行逻辑。
## Ability运行逻辑
## Ability子类的编写流程
这一部分是针对程序开发人员的,策划人员可以粗略一览这一部分。
## AbilityAsset的配置流程
这一部分是针对策划人员的,程序开发人员可以粗略一览这一部分。
## Ability的设计原则和一些建议

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: cfcc47cc435a1514c9cf242b88b4c813
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,47 @@
# EX-GAS Wiki
> 本页为菜单引导页另外还会总体的概括EX-GAS的设计实现思路。
>
## 简介
>EX-GAS是对UnrealEngine的GASGameplay Ability System的模仿和实现。
GAS 是 "Gameplay Ability System" 的缩写,是一套游戏能力系统。
这个系统的目的是为开发者提供一种灵活而强大的框架,用于实现和管理游戏中的各种角色能力、技能和效果。
如果把EX-GAS高度概括为一句话那就是**WHO DO WHAT**。
- WhoAbilitySystemComponentASC,EX-GAS的实例对象是体系运转的基础单位
- DoAbility是游戏中可以触发的一切行为和技能
- WhatGameplayEffect(GE)掌握了游戏内元素的属性实际控制权GameplayEffect本身应该理解为结果
GAS本质是一套属性数值的管理系统GameplayCue我个人理解为是附加价值虽然这个附加价值很有分量
纵使GAS的Tag体系解决复杂的GameplayEffect和Ability的逻辑但最终的结果目的也只是掌握属性数值变化。
而属性的最底层修改权力交由了GameplayEffect。所以我把GE理解为结果。
UE的GAS的使用门槛很高这一点在我构筑完EX-GAS雏形后更是深有体会。
所以在EX-GAS的设计上我尽可能的做简化优化来降低了使用门槛。
我制作了几个关键的编辑器来帮助开发者快速的使用EX-GAS。
但即便如此GAS本身的繁多参数依然让编辑器的界面看上去十分臃肿这很难简化没有哪个参数是可以被删除的。
甚至雏形阶段的EX-GAS还有很多功能还未实现也就是说还有更多的参数是没有被编辑器暴露出来的。
_**GAS的使用者必须至少有一名程序开发人员因为GAS的使用需要编写大量自定义业务逻辑。
AbilityCueMMC等都是必须根据游戏类型和内容玩法而定的。
非程序开发人员则需要完全理解EX-GAS的运作逻辑才能更好的快速配置出各种各样的技能和玩法表现。**_
## Wiki:EX-GAS的核心组成
- [GameplayTag](#GameplayTag)
- [Attribute](#Attribute)
- [AttributeSet](#AttributeSet)
- [ModifierMagnitudeCalculation](#ModifierMagnitudeCalculation)
- [GameplayEffect](#GameplayEffect)
- [GameplayCue](#GameplayCue)
- [Ability](#Ability)
- [AbilitySystemComponent](#AbilitySystemComponent)
## Wiki:EX-GAS辅助编辑器的使用
- [Setting Aggregator](#SettingAggregator)
- [Gameplay Tag Manager](#AttributeSetEditor)
- [Attribute Manager](#AttributeSetEditor)
- [AttributeSet Manager](#AttributeSetEditor)
- [GAS Asset Aggregator]()
- [Gameplay Effect](#GameplayEffectManager)
- [Ability](#AbilityAssetManager)
- [AbilitySystemComponent](#GameplayCueManager)

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 557be2d0ed7ffbf469523d1a6bfcc515
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,67 @@
# EX-GAS Wiki -- GameplayCue
>目前EX-GAS的GameplayCue功能还未完善。功能相对简陋。
## GameplayCue的作用
GameplayCue是一个用于播放游戏提示的类它的作用是在游戏运行时播放游戏效果比如播放一个特效、播放一个音效等。
## GameplayCue的原则
Cue是游戏提示他必须遵守以下原则
- _**Cue不应该对游戏的数值体系产生影响比如不应该对游戏的属性进行修改不应该对游戏的Buff进行修改等。**_
- _**Cue不应该对游戏玩法产生实际影响比如即时战斗类的游戏Cue不应该影响角色的位移、攻击等。**_
第一条原则是所有类型游戏必须遵守的。
而第二条原则就见仁见智了因为游戏类型和玩法决定了cue的影响范围。
比如即时战斗类游戏cue对角色位移有操作显然就是干涉了战斗但如果是回合制游戏cue对角色位移的操作就可以被当成是动画表现。
甚至即便是即时战斗类游戏cue对角色位移的操作也可以被当成是动画表现只要游戏开发人员认为cue的位移操作不影响游戏的战斗结果即可。
## GameplayCue的类型
GameplayCue的类型分两大类
- GameplayCueInstant瞬时性的Cue比如播放动画伤害UI提示等
- GameplayCueDurational持续性的Cue比如持续性的特效、持续性的音效等
GameplayCueInstant和GameplayCueDurational都是抽象类它们的子类才是真正的可使用Cue类。
Cue是需要程序开发人员大量实现的毕竟游戏不同导致游戏提示千变万化。
### 关于Cue的子类实现
Cue的完整组成为GameplayCue和GameplayCueSpec
- GameplayCue< T >(抽象基类,T为对应的Spec类Cue的数据实类是一个可编辑类开发人员可以在编辑器中设置Cue的各种参数。该类只可以被视作数据类。
- 必须实现CreateSpec方法用于创建对应的Spec类
- GameplayCueSpec抽象基类Cue的规格类是Runtime下Cue的真正实例Cue的具体逻辑在该类中实现。
- GameplayCueInstantSpec瞬时性Cue的规格类
- Trigger(): 必须实现的方法用于触发Cue
- GameplayCueDurationalSpec持续性Cue的规格类
- OnAdd(): 必须实现的方法用于Cue被添加时的逻辑
- OnRemove(): 必须实现的方法用于Cue被移除时的逻辑
- OnGameplayEffectActivated(): 必须实现的方法用于Cue所属的GameplayEffect被激活时的逻辑
- OnGameplayEffectDeactivated(): 必须实现的方法用于Cue所属的GameplayEffect被移除时的逻辑
- OnTick(): 必须实现的方法用于Cue的每帧更新逻辑
### 关于Cue的参数传递
目前EX-GAS的Cue参数传递非常简陋依赖于结构体GameplayCueParameters成员如下
- GameplayEffectSpec sourceGameplayEffectSpecCue所属的GameplayEffect实例如果是GE触发
- AbilitySpec sourceAbilitySpecCue所属的Ability实例如果是Ability触发
- object[] customArguments自定义参数不同于GameplayCue中的数据。
customArguments是供程序开发人员在业务逻辑内自由传递参数的载体。
>注意customArguments是一个object数组开发人员需要自己保证传递的参数类型正确否则会导致运行时错误。
customArguments是最暴力的设计往后EX-GAS的Cue参数传递设计还会进行优化。
## GameplayCue的使用
GameplayCue的使用手段很多最基础的是在GameplayEffect中使用Cue最开始的设计基础也是依附于GameplayEffect。Ability也可以对Cue进行操作。
除此之外Cue的使用不限制于EX-GAS的体系内。开发者可以在任何地方使用Cue只要能获取到GameplayCue的资源实例并且遵守Cue的原则即可。
### 在GameplayEffect中使用Cue
GameplayEffect中使用Cue会根据GameplayEffect执行策略产生变化。
- 即时执行的GameplayEffect: 提供以下选项
- CueOnExecuteInstantCue都会在GameplayEffect执行时触发。
- 持续执行的GameplayEffect: 提供以下选项
- CueDurationalDurational生命周期完全和GameplayEffect同步
- CueOnAddInstantGameplayEffect添加时触发
- CueOnRemoveInstantGameplayEffect移除时触发
- CueOnActivateInstantGameplayEffect激活时触发。
- CueOnDeactivateInstantGameplayEffect失活时触发。
### 在Ability中使用Cue
AbilityAsset中提供了Instant和Durational两个选项的Cue参数。
但是Cue的使用完全依赖于Ability自身的业务逻辑因此程序开发者在AbilitySpec中实现Cue逻辑时一定要保证合理性。
特别是对于Durational类型的Cue一定要保证Cue生命周期的合理性切记不要出现遗漏销毁Cue的情况。

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 02b69f3c421280044b4707312c10498a
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,68 @@
# EX-GAS Wiki -- GameplayEffect
## GameplayEffect的作用
GameplayEffect是EX-GAS的核心之一一切的游戏数值体系交互基于GameplayEffect。
GameplayEffect掌握了游戏内元素的属性控制权。理论上只有它可以对游戏内元素的属性进行修改
(这里指的是修改,数值的初始化不算是修改)。当然,实际情况下,游戏开发人员当然可以手动直接修改属性值。
但是还是希望游戏开发者尽可能的不要打破EX-GAS的数值体系逻辑因为过多的额外操作可能会导致游戏的数值体系变得混乱难以追踪数值变化等等。
另外GameplayEffect还可以触发Cue游戏提示完成游戏效果的表现以及控制获取额外的能力等。
---
> 由于GameplayEffect是被封装好的程序开发者不会接触它的实现逻辑所以本文Wiki将跳过对其接口以及代码逻辑的解析。
> 后续,可能会完善代码接口的介绍。
# GameplayEffect的使用
![gameplayeffect_editor_durational.png](Image%2Fgameplayeffect_editor_durational.png)
GameplayEffect的配置界面如图接下来逐一解释各个参数的含义。
- NameGameplayEffect的名称纯粹用于显示不会影响游戏逻辑。方便编辑者区分GameplayEffect。
- DescriptionGameplayEffect的描述纯粹用于显示不会影响游戏逻辑。方便编辑者阅读理解GameplayEffect。
- DurationPolicyGameplayEffect的执行策略有以下几种
- Instant即时执行GameplayEffect被添加时立即执行执行完毕后销毁自身。
- Duration持续执行GameplayEffect被添加时立即执行持续时间结束后移除自身。
- Infinite无限执行GameplayEffect被添加时立即执行执行完毕后不会移除需要手动移除。
- None无效果,这是默认占位符因为GameplayEffect是结构体None方便视作GameplayEffect的空值。
_**GameplayEffect配置的执行策略禁止使用None**_
- Duration持续时间只有DurationPolicy为Duration时有效。
- Every(Period)周期只有DurationPolicy为Duration或者Infinite时有效。每隔Period时间执行一次PeriodExecution。
- PeriodExecution周期执行的GameplayEffect只有DurationPolicy为Duration或者Infinite且Period>0时有效。每隔Period时间执行一次PeriodExecution。
_**PeriodExecution禁止为空!!**_PeriodExecution原则上只允许是Instant类型的GameplayEffect。但如果根据开发者需求也可以使用其他类型的GameplayEffect。
- GrantedAbilities授予的能力只有DurationPolicy为Duration或者Infinite时有效。在GameplayEffect生命周期内GameplayEffect的持有者会被授予这些能力。
GameplayEffect被移除时这些能力也会被移除。
- Modifiers: 属性修改器。GameplayEffect的核心功能用于修改GameplayEffect持有者的属性。
- Attribute属性名称需要填写属性的全名比如战斗属性集里的生命值AS_Fight.Health
- ModifierMagnitude基础模值这个模值是否使用依赖于MMC的类型。在中有Wiki-MMC详细介绍。
- Operation属性修改操作有加法、乘法、赋值覆写等。
- MMC属性修改计算类用于计算ModifierMagnitude的值。
EX-GAS提供了多种ModifierCalculation开发者也可以自定义ModifierCalculation。
ModifierCalculation的类型在Wiki-MMC详细介绍。
- Tags标签。Tag具有非常重要的作用合适的tag可以处理GameplayEffect之间复杂的关系。
- AssetTags描述性质的标签用来描述GameplayEffect的特性表现比如伤害、治疗、控制等。
- GrantedTagsGameplayEffect的持有者会获得这些标签GameplayEffect被移除时这些标签也会被移除。
Instant类型的GameplayEffect的GrantedTags是无效的。
- ApplicationRequiredTagsGameplayEffect的目标单位必须拥有 **【所有】** 这些标签否则GameplayEffect无法被施加到目标身上。
- OngoingRequiredTagsGameplayEffect的目标单位必须拥有 **【所有】** 这些标签否则GameplayEffect不会被激活施加和激活是两个概念
如果已经被施加的GameplayEffect持续过程中目标的tag变化了不满足效果就会失活满足了就会被激活
Instant类型的GameplayEffect的OngoingRequiredTags是无效的。
- RemoveGameplayEffectsWithTagsGameplayEffect的目标单位当前持有的所有GameplayEffect中拥有 **【任意】** 这些标签的GameplayEffect会被移除。
- CuesGameplayEffect的提示。GameplayEffect可以触发Cue游戏提示完成游戏效果的表现以及控制获取额外的能力等。
- DurationPolicy为Instant时
- CueOnExecuteInstantGameplayEffect执行时触发。
- DurationPolicy为Duration或者Infinite时
- CueDurationalDurational生命周期完全和GameplayEffect同步
- CueOnAddInstantGameplayEffect添加时触发
- CueOnRemoveInstantGameplayEffect移除时触发
- CueOnActivateInstantGameplayEffect激活时触发。
- CueOnDeactivateInstantGameplayEffect失活时触发。
## GameplayEffect的施加Apply和激活Activate
GameplayEffect的施加Apply和激活Activate是两个概念施加是指GameplayEffect被添加到目标身上激活是指GameplayEffect实际生效。
为什么做区分?
举个例子固有被动技能Ability是持续回血被动技能的逻辑显然是永久激活的状态而持续回血的效果GameplayEffect
来源于被动技能那如果单位受到了外部的debuff禁止所有的回血效果那么是不是被动技能被禁止显然不是被动技能还是会持续激活的。
那应该是移除回血效果吗显然也不是被动技能整个过程是不做任何变化如果移除回血效果那debuff一旦消失谁再把回血效果加回来
所以这里需要区分施加和激活被动技能的持续回血效果被施加到单位身上而debuff做的是让回血效果失活而不是移除回血效果一旦debuff结束
回血效果又被激活而这个激活的操作可以理解为回血效果自己激活的依赖于Tag系统

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: f2b6db06b286851419fb59afd740df3e
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fa26d750811c9a44f88f4e478131110e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -0,0 +1,109 @@
fileFormatVersion: 2
guid: 4500fcbdf9ac27349a9c61c6bfd44ab7
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -0,0 +1,109 @@
fileFormatVersion: 2
guid: 4dced26454ba437409e9dae9ac404b54
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,44 @@
# EX-GAS Wiki -- MMC(Modifier Magnitude Calculation)
## MMC的作用
MMC(Modifier Magnitude Calculation)是一个用于计算Modifier的模值的可编辑类它的作用是根据输入的参数计算Modifier的模值然后在后续逻辑中将模值赋给对应的属性。
## MMC的使用
在EX-GAS中MMC只会在GameplayEffect中使用。
MMC依存于GameplayEffectModifier中GameplayEffectModifier是包裹MMC的结构体MMC为GameplayEffectModifier成员之一。
GameplayEffectModifier为GameplayEffect的成员之一。
**GameplayEffectModifier在EX-GAS中非常重要它是GAS属性变化的核心所有的游戏运行时的元素属性变化全部由他操作除了属性初始化或者开发人员手动设置属性值的情况。**
GameplayEffectModifier成员组成所有成员都需要在编辑器中设置
- AttributeNameModifier作用的属性名称一个游戏效果对一个元素属性产生影响时需要表明影响哪个属性
- ModiferMagnitude基础模值这个模值是否使用依赖于MMC的类型。后文MMC的类型中会详细介绍。
- OperationModifier的操作类型有加法、乘法、赋值覆写
- MMC计算Modifier模值的计算类后文MMC的类型中会详细介绍
```
例子伤害效果对单位造成50点伤害
GameplayEffectModifier
AttributeNameAS_Fight.Health
ModifierMagnitude50
OperationAdd
MMCScalableFloatModCalculation -> k=-1,b=0 (下文会介绍ScalableFloatModCalculation的k,b含义)
```
## MMC的类型
MMC的基类为抽象类ModifierMagnitudeCalculation它的子类有以下几种
- ScalableFloatModCalculation可缩放浮点数计算
- 该类型是根据ModifierMagnitude计算Modifier模值的计算公式为`ModifierMagnitude * k + b`
实际上就是一个线性函数k和b为可编辑参数可以在编辑器中设置。
- AttributeBasedModCalculation基于属性的计算
- 该类型是根据属性值计算Modifier模值的计算公式为`AttributeValue * k + b`
计算逻辑与ScalableFloatModCalculation一致。
- 重点在于属性值的来源确定属性值来源的参数有3个
- attributeFromType属性值从谁身上取是从游戏效果的来源创建者还是目标拥有者
- attributeName属性值的名称比如战斗属性集里的生命值AS_Fight.Health
- captureType属性值的捕获类型
- Track: 追踪,在Modifier被执行时当场去取属性值
- SnapShot: 快照,在游戏效果被创建时会对来源和目标的属性进行快照。在Modifier被执行时去取快照的属性值。
- SetByCallerModCalculation由调用者设置的计算
- 不使用任何值计算模值而是在执行时由调用者给出Modifier模值。
- CustomCalculation自定义计算必须继承自抽象基类ModifierMagnitudeCalculation
- 上述3种类型显然不够方便且全面的满足游戏开发者的所有需求所以提供了自定义计算类的功能。
- 允许开发者自由发挥给出各种各样的计算逻辑。

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 36f0dd248cec13a42b86e265c8eaff2f
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: