());
if (!textureAtlasList.Contains(data))
{
textureAtlasList.Add(data);
}
}
///
/// - Remove a TextureAtlasData instance.
///
/// - The TextureAtlasData instance cache name.
/// - Whether to dispose data.
///
///
///
///
/// DragonBones 3.0
/// en_US
///
/// - 移除 TextureAtlasData 实例。
///
/// - TextureAtlasData 实例的缓存名称。
/// - 是否释放数据。
///
///
///
///
/// DragonBones 3.0
/// zh_CN
public virtual void RemoveTextureAtlasData(string name, bool disposeData = true)
{
if (this._textureAtlasDataMap.ContainsKey(name))
{
var textureAtlasDataList = this._textureAtlasDataMap[name];
if (disposeData)
{
foreach (var textureAtlasData in textureAtlasDataList)
{
this._dragonBones.BufferObject(textureAtlasData);
}
}
this._textureAtlasDataMap.Remove(name);
}
}
///
/// - Get a specific armature data.
///
/// - The armature data name.
/// - The cached name for DragonbonesData instance.
///
/// DragonBones 5.1
/// en_US
///
/// - 获取特定的骨架数据。
///
/// - 骨架数据名称。
/// - DragonBonesData 实例的缓存名称。
///
/// DragonBones 5.1
/// zh_CN
public virtual ArmatureData GetArmatureData(string name, string dragonBonesName = "")
{
var dataPackage = new BuildArmaturePackage();
if (!this._FillBuildArmaturePackage(dataPackage, dragonBonesName, name, "", ""))
{
return null;
}
return dataPackage.armature;
}
///
/// - Clear all cached DragonBonesData instances and TextureAtlasData instances.
///
/// - Whether to dispose data.
/// DragonBones 4.5
/// en_US
///
/// - 清除缓存的所有 DragonBonesData 实例和 TextureAtlasData 实例。
///
/// - 是否释放数据。
/// DragonBones 4.5
/// zh_CN
public virtual void Clear(bool disposeData = true)
{
if (disposeData)
{
foreach (var dragonBoneData in this._dragonBonesDataMap.Values)
{
this._dragonBones.BufferObject(dragonBoneData);
}
foreach (var textureAtlasDatas in this._textureAtlasDataMap.Values)
{
foreach (var textureAtlasData in textureAtlasDatas)
{
this._dragonBones.BufferObject(textureAtlasData);
}
}
}
_dragonBonesDataMap.Clear();
_textureAtlasDataMap.Clear();
}
///
/// - Create a armature from cached DragonBonesData instances and TextureAtlasData instances.
/// Note that when the created armature that is no longer in use, you need to explicitly dispose {@link #dragonBones.Armature#dispose()}.
///
/// - The armature data name.
/// - The cached name of the DragonBonesData instance. (If not set, all DragonBonesData instances are retrieved, and when multiple DragonBonesData instances contain a the same name armature data, it may not be possible to accurately create a specific armature)
/// - The skin name, you can set a different ArmatureData name to share it's skin data. (If not set, use the default skin data)
/// The armature.
///
/// TypeScript style, for reference only.
///
/// let armature = factory.buildArmature("armatureName", "dragonBonesName");
/// armature.clock = factory.clock;
///
///
///
///
/// DragonBones 3.0
/// en_US
///
/// - 通过缓存的 DragonBonesData 实例和 TextureAtlasData 实例创建一个骨架。
/// 注意,创建的骨架不再使用时,需要显式释放 {@link #dragonBones.Armature#dispose()}。
///
/// - 骨架数据名称。
/// - DragonBonesData 实例的缓存名称。 (如果未设置,将检索所有的 DragonBonesData 实例,当多个 DragonBonesData 实例中包含同名的骨架数据时,可能无法准确的创建出特定的骨架)
/// - 皮肤名称,可以设置一个其他骨架数据名称来共享其皮肤数据。(如果未设置,则使用默认的皮肤数据)
/// 骨架。
///
/// TypeScript 风格,仅供参考。
///
/// let armature = factory.buildArmature("armatureName", "dragonBonesName");
/// armature.clock = factory.clock;
///
///
///
///
/// DragonBones 3.0
/// zh_CN
public virtual Armature BuildArmature(string armatureName, string dragonBonesName = "", string skinName = null, string textureAtlasName = null)
{
var dataPackage = new BuildArmaturePackage();
if (!this._FillBuildArmaturePackage(dataPackage, dragonBonesName, armatureName, skinName, textureAtlasName))
{
Helper.Assert(false, "No armature data: " + armatureName + ", " + (dragonBonesName != "" ? dragonBonesName : ""));
return null;
}
var armature = this._BuildArmature(dataPackage);
this._BuildBones(dataPackage, armature);
this._BuildSlots(dataPackage, armature);
this._BuildConstraints(dataPackage, armature);
armature.InvalidUpdate(null, true);
// Update armature pose.
armature.AdvanceTime(0.0f);
return armature;
}
///
public virtual void ReplaceDisplay(Slot slot, DisplayData displayData, int displayIndex = -1)
{
if (displayIndex < 0)
{
displayIndex = slot.displayIndex;
}
if (displayIndex < 0)
{
displayIndex = 0;
}
slot.ReplaceDisplayData(displayData, displayIndex);
var displayList = slot.displayList; // Copy.
if (displayList.Count <= displayIndex)
{
displayList.ResizeList(displayIndex + 1);
for (int i = 0, l = displayList.Count; i < l; ++i)
{
// Clean undefined.
displayList[i] = null;
}
}
if (displayData != null)
{
var rawDisplayDatas = slot.rawDisplayDatas;
DisplayData rawDisplayData = null;
if (rawDisplayDatas != null)
{
if (displayIndex < rawDisplayDatas.Count)
{
rawDisplayData = rawDisplayDatas[displayIndex];
}
}
displayList[displayIndex] = this._GetSlotDisplay(null, displayData, rawDisplayData, slot);
}
else
{
displayList[displayIndex] = null;
}
slot.displayList = displayList;
}
///
/// - Replaces the current display data for a particular slot with a specific display data.
/// Specify display data with "dragonBonesName/armatureName/slotName/displayName".
///
/// - The DragonBonesData instance cache name.
/// - The armature data name.
/// - The slot data name.
/// - The display data name.
/// - The slot.
/// - The index of the display data that is replaced. (If it is not set, replaces the current display data)
///
/// TypeScript style, for reference only.
///
/// let slot = armature.getSlot("weapon");
/// factory.replaceSlotDisplay("dragonBonesName", "armatureName", "slotName", "displayName", slot);
///
///
/// DragonBones 4.5
/// en_US
///
/// - 用特定的显示对象数据替换特定插槽当前的显示对象数据。
/// 用 "dragonBonesName/armatureName/slotName/displayName" 指定显示对象数据。
///
/// - DragonBonesData 实例的缓存名称。
/// - 骨架数据名称。
/// - 插槽数据名称。
/// - 显示对象数据名称。
/// - 插槽。
/// - 被替换的显示对象数据的索引。 (如果未设置,则替换当前的显示对象数据)
///
/// TypeScript 风格,仅供参考。
///
/// let slot = armature.getSlot("weapon");
/// factory.replaceSlotDisplay("dragonBonesName", "armatureName", "slotName", "displayName", slot);
///
///
/// DragonBones 4.5
/// zh_CN
public bool ReplaceSlotDisplay(string dragonBonesName,
string armatureName,
string slotName,
string displayName,
Slot slot, int displayIndex = -1)
{
var armatureData = this.GetArmatureData(armatureName, dragonBonesName);
if (armatureData == null || armatureData.defaultSkin == null)
{
return false;
}
var displayData = armatureData.defaultSkin.GetDisplay(slotName, displayName);
if (displayData == null)
{
return false;
}
this.ReplaceDisplay(slot, displayData, displayIndex);
return true;
}
///
public bool ReplaceSlotDisplayList(string dragonBonesName, string armatureName, string slotName, Slot slot)
{
var armatureData = this.GetArmatureData(armatureName, dragonBonesName);
if (armatureData == null || armatureData.defaultSkin == null)
{
return false;
}
var displays = armatureData.defaultSkin.GetDisplays(slotName);
if (displays == null)
{
return false;
}
var displayIndex = 0;
// for (const displayData of displays)
for (int i = 0, l = displays.Count; i < l; ++i)
{
var displayData = displays[i];
this.ReplaceDisplay(slot, displayData, displayIndex++);
}
return true;
}
///
/// - Share specific skin data with specific armature.
///
/// - The armature.
/// - The skin data.
/// - Whether it completely override the original skin. (Default: false)
/// - A list of slot names that do not need to be replace.
///
/// TypeScript style, for reference only.
///
/// let armatureA = factory.buildArmature("armatureA", "dragonBonesA");
/// let armatureDataB = factory.getArmatureData("armatureB", "dragonBonesB");
/// if (armatureDataB && armatureDataB.defaultSkin) {
/// factory.replaceSkin(armatureA, armatureDataB.defaultSkin, false, ["arm_l", "weapon_l"]);
/// }
///
///
///
///
/// DragonBones 5.6
/// en_US
///
/// - 将特定的皮肤数据共享给特定的骨架使用。
///
/// - 骨架。
/// - 皮肤数据。
/// - 是否完全覆盖原来的皮肤。 (默认: false)
/// - 不需要被替换的插槽名称列表。
///
/// TypeScript 风格,仅供参考。
///
/// let armatureA = factory.buildArmature("armatureA", "dragonBonesA");
/// let armatureDataB = factory.getArmatureData("armatureB", "dragonBonesB");
/// if (armatureDataB && armatureDataB.defaultSkin) {
/// factory.replaceSkin(armatureA, armatureDataB.defaultSkin, false, ["arm_l", "weapon_l"]);
/// }
///
///
///
///
/// DragonBones 5.6
/// zh_CN
public bool ReplaceSkin(Armature armature, SkinData skin, bool isOverride = false, List exclude = null)
{
var success = false;
var defaultSkin = skin.parent.defaultSkin;
foreach (var slot in armature.GetSlots())
{
if (exclude != null && exclude.Contains(slot.name))
{
continue;
}
var displays = skin.GetDisplays(slot.name);
if (displays == null)
{
if (defaultSkin != null && skin != defaultSkin)
{
displays = defaultSkin.GetDisplays(slot.name);
}
if (displays == null)
{
if (isOverride)
{
slot.rawDisplayDatas = null;
slot.displayList.Clear(); //
}
continue;
}
}
var displayCount = displays.Count;
var displayList = slot.displayList; // Copy.
displayList.ResizeList(displayCount); // Modify displayList length.
for (int i = 0, l = displayCount; i < l; ++i)
{
var displayData = displays[i];
if (displayData != null)
{
displayList[i] = this._GetSlotDisplay(null, displayData, null, slot);
}
else
{
displayList[i] = null;
}
}
success = true;
slot.rawDisplayDatas = displays;
slot.displayList = displayList;
}
return success;
}
///
/// - Replaces the existing animation data for a specific armature with the animation data for the specific armature data.
/// This enables you to make a armature template so that other armature without animations can share it's animations.
///
/// - The armtaure.
/// - The armature data.
/// - Whether to completely overwrite the original animation. (Default: false)
///
/// TypeScript style, for reference only.
///
/// let armatureA = factory.buildArmature("armatureA", "dragonBonesA");
/// let armatureDataB = factory.getArmatureData("armatureB", "dragonBonesB");
/// if (armatureDataB) {
/// factory.replaceAnimation(armatureA, armatureDataB);
/// }
///
///
///
///
/// DragonBones 5.6
/// en_US
///
/// - 用特定骨架数据的动画数据替换特定骨架现有的动画数据。
/// 这样就能实现制作一个骨架动画模板,让其他没有制作动画的骨架共享该动画。
///
/// - 骨架。
/// - 骨架数据。
/// - 是否完全覆盖原来的动画。(默认: false)
///
/// TypeScript 风格,仅供参考。
///
/// let armatureA = factory.buildArmature("armatureA", "dragonBonesA");
/// let armatureDataB = factory.getArmatureData("armatureB", "dragonBonesB");
/// if (armatureDataB) {
/// factory.replaceAnimation(armatureA, armatureDataB);
/// }
///
///
///
///
/// DragonBones 5.6
/// zh_CN
public bool ReplaceAnimation(Armature armature,
ArmatureData armatureData,
bool isOverride = true)
{
var skinData = armatureData.defaultSkin;
if (skinData == null)
{
return false;
}
if (isOverride)
{
armature.animation.animations = armatureData.animations;
}
else
{
var rawAnimations = armature.animation.animations;
Dictionary animations = new Dictionary();
foreach (var k in rawAnimations.Keys)
{
animations[k] = rawAnimations[k];
}
foreach (var k in armatureData.animations.Keys)
{
animations[k] = armatureData.animations[k];
}
armature.animation.animations = animations;
}
foreach (var slot in armature.GetSlots())
{
var index = 0;
foreach (var display in slot.displayList)
{
if (display is Armature)
{
var displayDatas = skinData.GetDisplays(slot.name);
if (displayDatas != null && index < displayDatas.Count)
{
var displayData = displayDatas[index];
if (displayData != null && displayData.type == DisplayType.Armature)
{
var childArmatureData = this.GetArmatureData(displayData.path, displayData.parent.parent.parent.name);
if (childArmatureData != null)
{
this.ReplaceAnimation(display as Armature, childArmatureData, isOverride);
}
}
}
}
}
}
return true;
}
///
public Dictionary GetAllDragonBonesData()
{
return this._dragonBonesDataMap;
}
///
public Dictionary> GetAllTextureAtlasData()
{
return this._textureAtlasDataMap;
}
///
/// - An Worldclock instance updated by engine.
///
/// DragonBones 5.7
/// en_US
///
/// - 由引擎驱动的 WorldClock 实例。
///
/// DragonBones 5.7
/// zh_CN
public WorldClock clock
{
get { return this._dragonBones.clock; }
}
///
/// - Deprecated, please refer to {@link #replaceSkin}.
///
/// en_US
///
/// - 已废弃,请参考 {@link #replaceSkin}。
///
/// zh_CN
[System.Obsolete("")]
public bool ChangeSkin(Armature armature, SkinData skin, List exclude = null)
{
return ReplaceSkin(armature, skin, false, exclude);
}
}
}