init
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes License Agreement
|
||||
* Last updated January 1, 2020. Replaces all prior versions.
|
||||
*
|
||||
* Copyright (c) 2013-2020, Esoteric Software LLC
|
||||
*
|
||||
* Integration of the Spine Runtimes into software or otherwise creating
|
||||
* derivative works of the Spine Runtimes is permitted under the terms and
|
||||
* conditions of Section 2 of the Spine Editor License Agreement:
|
||||
* http://esotericsoftware.com/spine-editor-license
|
||||
*
|
||||
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
||||
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
||||
* "Products"), provided that each user of the Products must obtain their own
|
||||
* Spine Editor license and redistribution of the Products in any form must
|
||||
* include this license and copyright notice.
|
||||
*
|
||||
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
||||
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Spine.Unity.Examples {
|
||||
public class EquipAssetExample : ScriptableObject {
|
||||
public EquipSystemExample.EquipType equipType;
|
||||
public Sprite sprite;
|
||||
public string description;
|
||||
public int yourStats;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dcf21dc1875a05044835c5a6c969bda4
|
||||
timeCreated: 1522687338
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,60 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes License Agreement
|
||||
* Last updated January 1, 2020. Replaces all prior versions.
|
||||
*
|
||||
* Copyright (c) 2013-2020, Esoteric Software LLC
|
||||
*
|
||||
* Integration of the Spine Runtimes into software or otherwise creating
|
||||
* derivative works of the Spine Runtimes is permitted under the terms and
|
||||
* conditions of Section 2 of the Spine Editor License Agreement:
|
||||
* http://esotericsoftware.com/spine-editor-license
|
||||
*
|
||||
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
||||
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
||||
* "Products"), provided that each user of the Products must obtain their own
|
||||
* Spine Editor license and redistribution of the Products in any form must
|
||||
* include this license and copyright notice.
|
||||
*
|
||||
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
||||
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Spine.Unity.Examples {
|
||||
public class EquipButtonExample : MonoBehaviour {
|
||||
public EquipAssetExample asset;
|
||||
public EquipSystemExample equipSystem;
|
||||
public Image inventoryImage;
|
||||
|
||||
void OnValidate () {
|
||||
MatchImage();
|
||||
}
|
||||
|
||||
void MatchImage () {
|
||||
if (inventoryImage != null)
|
||||
inventoryImage.sprite = asset.sprite;
|
||||
}
|
||||
|
||||
void Start () {
|
||||
MatchImage();
|
||||
|
||||
var button = GetComponent<Button>();
|
||||
button.onClick.AddListener(
|
||||
delegate { equipSystem.Equip(asset); }
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d818155d239e98d46bb41e307ba270d4
|
||||
timeCreated: 1522744049
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,107 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes License Agreement
|
||||
* Last updated January 1, 2020. Replaces all prior versions.
|
||||
*
|
||||
* Copyright (c) 2013-2020, Esoteric Software LLC
|
||||
*
|
||||
* Integration of the Spine Runtimes into software or otherwise creating
|
||||
* derivative works of the Spine Runtimes is permitted under the terms and
|
||||
* conditions of Section 2 of the Spine Editor License Agreement:
|
||||
* http://esotericsoftware.com/spine-editor-license
|
||||
*
|
||||
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
||||
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
||||
* "Products"), provided that each user of the Products must obtain their own
|
||||
* Spine Editor license and redistribution of the Products in any form must
|
||||
* include this license and copyright notice.
|
||||
*
|
||||
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
||||
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
using Spine.Unity.AttachmentTools;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Spine.Unity.Examples {
|
||||
public class EquipSystemExample : MonoBehaviour, IHasSkeletonDataAsset {
|
||||
|
||||
// Implementing IHasSkeletonDataAsset allows Spine attribute drawers to automatically detect this component as a skeleton data source.
|
||||
public SkeletonDataAsset skeletonDataAsset;
|
||||
SkeletonDataAsset IHasSkeletonDataAsset.SkeletonDataAsset { get { return this.skeletonDataAsset; } }
|
||||
|
||||
public Material sourceMaterial;
|
||||
public bool applyPMA = true;
|
||||
public List<EquipHook> equippables = new List<EquipHook>();
|
||||
|
||||
public EquipsVisualsComponentExample target;
|
||||
public Dictionary<EquipAssetExample, Attachment> cachedAttachments = new Dictionary<EquipAssetExample, Attachment>();
|
||||
|
||||
[System.Serializable]
|
||||
public class EquipHook {
|
||||
public EquipType type;
|
||||
[SpineSlot]
|
||||
public string slot;
|
||||
[SpineSkin]
|
||||
public string templateSkin;
|
||||
[SpineAttachment(skinField: "templateSkin")]
|
||||
public string templateAttachment;
|
||||
}
|
||||
|
||||
public enum EquipType {
|
||||
Gun,
|
||||
Goggles
|
||||
}
|
||||
|
||||
public void Equip (EquipAssetExample asset) {
|
||||
var equipType = asset.equipType;
|
||||
EquipHook howToEquip = equippables.Find(x => x.type == equipType);
|
||||
|
||||
var skeletonData = skeletonDataAsset.GetSkeletonData(true);
|
||||
int slotIndex = skeletonData.FindSlot(howToEquip.slot).Index;
|
||||
var attachment = GenerateAttachmentFromEquipAsset(asset, slotIndex, howToEquip.templateSkin, howToEquip.templateAttachment);
|
||||
target.Equip(slotIndex, howToEquip.templateAttachment, attachment);
|
||||
}
|
||||
|
||||
Attachment GenerateAttachmentFromEquipAsset (EquipAssetExample asset, int slotIndex, string templateSkinName, string templateAttachmentName) {
|
||||
Attachment attachment;
|
||||
cachedAttachments.TryGetValue(asset, out attachment);
|
||||
|
||||
if (attachment == null) {
|
||||
var skeletonData = skeletonDataAsset.GetSkeletonData(true);
|
||||
var templateSkin = skeletonData.FindSkin(templateSkinName);
|
||||
Attachment templateAttachment = templateSkin.GetAttachment(slotIndex, templateAttachmentName);
|
||||
attachment = templateAttachment.GetRemappedClone(asset.sprite, sourceMaterial, premultiplyAlpha: this.applyPMA);
|
||||
// Note: Each call to `GetRemappedClone()` with parameter `premultiplyAlpha` set to `true` creates
|
||||
// a cached Texture copy which can be cleared by calling AtlasUtilities.ClearCache() as shown in the method below.
|
||||
|
||||
cachedAttachments.Add(asset, attachment); // Cache this value for next time this asset is used.
|
||||
}
|
||||
|
||||
return attachment;
|
||||
}
|
||||
|
||||
public void Done () {
|
||||
target.OptimizeSkin();
|
||||
// `GetRepackedSkin()` and each call to `GetRemappedClone()` with parameter `premultiplyAlpha` set to `true`
|
||||
// creates cached Texture copies which can be cleared by calling AtlasUtilities.ClearCache().
|
||||
// You can optionally clear the textures cache after multiple repack operations.
|
||||
// Just be aware that while this cleanup frees up memory, it is also a costly operation
|
||||
// and will likely cause a spike in the framerate.
|
||||
|
||||
//AtlasUtilities.ClearCache();
|
||||
//Resources.UnloadUnusedAssets();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6159005f7c3d5fd4ba33cff41eae5531
|
||||
timeCreated: 1522686506
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,100 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes License Agreement
|
||||
* Last updated January 1, 2020. Replaces all prior versions.
|
||||
*
|
||||
* Copyright (c) 2013-2020, Esoteric Software LLC
|
||||
*
|
||||
* Integration of the Spine Runtimes into software or otherwise creating
|
||||
* derivative works of the Spine Runtimes is permitted under the terms and
|
||||
* conditions of Section 2 of the Spine Editor License Agreement:
|
||||
* http://esotericsoftware.com/spine-editor-license
|
||||
*
|
||||
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
||||
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
||||
* "Products"), provided that each user of the Products must obtain their own
|
||||
* Spine Editor license and redistribution of the Products in any form must
|
||||
* include this license and copyright notice.
|
||||
*
|
||||
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
||||
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
using Spine.Unity.AttachmentTools;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Spine.Unity.Examples {
|
||||
public class EquipsVisualsComponentExample : MonoBehaviour {
|
||||
|
||||
public SkeletonAnimation skeletonAnimation;
|
||||
|
||||
[SpineSkin]
|
||||
public string templateSkinName;
|
||||
|
||||
Spine.Skin equipsSkin;
|
||||
Spine.Skin collectedSkin;
|
||||
|
||||
public Material runtimeMaterial;
|
||||
public Texture2D runtimeAtlas;
|
||||
|
||||
void Start () {
|
||||
equipsSkin = new Skin("Equips");
|
||||
|
||||
// OPTIONAL: Add all the attachments from the template skin.
|
||||
var templateSkin = skeletonAnimation.Skeleton.Data.FindSkin(templateSkinName);
|
||||
if (templateSkin != null)
|
||||
equipsSkin.AddSkin(templateSkin);
|
||||
|
||||
skeletonAnimation.Skeleton.Skin = equipsSkin;
|
||||
RefreshSkeletonAttachments();
|
||||
}
|
||||
|
||||
public void Equip (int slotIndex, string attachmentName, Attachment attachment) {
|
||||
equipsSkin.SetAttachment(slotIndex, attachmentName, attachment);
|
||||
skeletonAnimation.Skeleton.SetSkin(equipsSkin);
|
||||
RefreshSkeletonAttachments();
|
||||
}
|
||||
|
||||
public void OptimizeSkin () {
|
||||
// 1. Collect all the attachments of all active skins.
|
||||
collectedSkin = collectedSkin ?? new Skin("Collected skin");
|
||||
collectedSkin.Clear();
|
||||
collectedSkin.AddSkin(skeletonAnimation.Skeleton.Data.DefaultSkin);
|
||||
collectedSkin.AddSkin(equipsSkin);
|
||||
|
||||
// 2. Create a repacked skin.
|
||||
// Note: materials and textures returned by GetRepackedSkin() behave like 'new Texture2D()' and need to be destroyed
|
||||
if (runtimeMaterial)
|
||||
Destroy(runtimeMaterial);
|
||||
if (runtimeAtlas)
|
||||
Destroy(runtimeAtlas);
|
||||
var repackedSkin = collectedSkin.GetRepackedSkin("Repacked skin", skeletonAnimation.SkeletonDataAsset.atlasAssets[0].PrimaryMaterial,
|
||||
out runtimeMaterial, out runtimeAtlas, maxAtlasSize: 1024, clearCache: false);
|
||||
collectedSkin.Clear();
|
||||
|
||||
// You can optionally clear the textures cache after each ore multiple repack operations are done.
|
||||
//AtlasUtilities.ClearCache();
|
||||
//Resources.UnloadUnusedAssets();
|
||||
|
||||
// 3. Use the repacked skin.
|
||||
skeletonAnimation.Skeleton.Skin = repackedSkin;
|
||||
RefreshSkeletonAttachments();
|
||||
}
|
||||
|
||||
void RefreshSkeletonAttachments () {
|
||||
skeletonAnimation.Skeleton.SetSlotsToSetupPose();
|
||||
skeletonAnimation.AnimationState.Apply(skeletonAnimation.Skeleton); //skeletonAnimation.Update(0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5732385e4912c444dae078ddc7d04c89
|
||||
timeCreated: 1522688085
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,50 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes License Agreement
|
||||
* Last updated January 1, 2020. Replaces all prior versions.
|
||||
*
|
||||
* Copyright (c) 2013-2020, Esoteric Software LLC
|
||||
*
|
||||
* Integration of the Spine Runtimes into software or otherwise creating
|
||||
* derivative works of the Spine Runtimes is permitted under the terms and
|
||||
* conditions of Section 2 of the Spine Editor License Agreement:
|
||||
* http://esotericsoftware.com/spine-editor-license
|
||||
*
|
||||
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
||||
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
||||
* "Products"), provided that each user of the Products must obtain their own
|
||||
* Spine Editor license and redistribution of the Products in any form must
|
||||
* include this license and copyright notice.
|
||||
*
|
||||
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
||||
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
using Spine.Unity;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Spine.Unity.Examples {
|
||||
public class MixAndMatchSkinsButtonExample : MonoBehaviour {
|
||||
|
||||
public SkeletonDataAsset skeletonDataAsset;
|
||||
public MixAndMatchSkinsExample skinsSystem;
|
||||
|
||||
[SpineSkin(dataField: "skeletonDataAsset")] public string itemSkin;
|
||||
public MixAndMatchSkinsExample.ItemType itemType;
|
||||
|
||||
void Start () {
|
||||
var button = GetComponent<Button>();
|
||||
button.onClick.AddListener(
|
||||
delegate { skinsSystem.Equip(itemSkin, itemType); }
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c32a308f5ae4c534991805c82c575058
|
||||
timeCreated: 1522744049
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,195 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes License Agreement
|
||||
* Last updated January 1, 2020. Replaces all prior versions.
|
||||
*
|
||||
* Copyright (c) 2013-2020, Esoteric Software LLC
|
||||
*
|
||||
* Integration of the Spine Runtimes into software or otherwise creating
|
||||
* derivative works of the Spine Runtimes is permitted under the terms and
|
||||
* conditions of Section 2 of the Spine Editor License Agreement:
|
||||
* http://esotericsoftware.com/spine-editor-license
|
||||
*
|
||||
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
||||
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
||||
* "Products"), provided that each user of the Products must obtain their own
|
||||
* Spine Editor license and redistribution of the Products in any form must
|
||||
* include this license and copyright notice.
|
||||
*
|
||||
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
||||
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*****************************************************************************/
|
||||
|
||||
using Spine.Unity.AttachmentTools;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Spine.Unity.Examples {
|
||||
|
||||
public class MixAndMatchSkinsExample : MonoBehaviour {
|
||||
|
||||
// character skins
|
||||
[SpineSkin] public string baseSkin = "skin-base";
|
||||
[SpineSkin] public string eyelidsSkin = "eyelids/girly";
|
||||
|
||||
// here we use arrays of strings to be able to cycle between them easily.
|
||||
[SpineSkin] public string[] hairSkins = { "hair/brown", "hair/blue", "hair/pink", "hair/short-red", "hair/long-blue-with-scarf" };
|
||||
public int activeHairIndex = 0;
|
||||
[SpineSkin] public string[] eyesSkins = { "eyes/violet", "eyes/green", "eyes/yellow" };
|
||||
public int activeEyesIndex = 0;
|
||||
[SpineSkin] public string[] noseSkins = { "nose/short", "nose/long" };
|
||||
public int activeNoseIndex = 0;
|
||||
|
||||
// equipment skins
|
||||
public enum ItemType {
|
||||
Cloth,
|
||||
Pants,
|
||||
Bag,
|
||||
Hat
|
||||
}
|
||||
[SpineSkin] public string clothesSkin = "clothes/hoodie-orange";
|
||||
[SpineSkin] public string pantsSkin = "legs/pants-jeans";
|
||||
[SpineSkin] public string bagSkin = "";
|
||||
[SpineSkin] public string hatSkin = "accessories/hat-red-yellow";
|
||||
|
||||
SkeletonAnimation skeletonAnimation;
|
||||
// This "naked body" skin will likely change only once upon character creation,
|
||||
// so we store this combined set of non-equipment Skins for later re-use.
|
||||
Skin characterSkin;
|
||||
|
||||
// for repacking the skin to a new atlas texture
|
||||
public Material runtimeMaterial;
|
||||
public Texture2D runtimeAtlas;
|
||||
|
||||
void Awake () {
|
||||
skeletonAnimation = this.GetComponent<SkeletonAnimation>();
|
||||
}
|
||||
|
||||
void Start () {
|
||||
UpdateCharacterSkin();
|
||||
UpdateCombinedSkin();
|
||||
}
|
||||
|
||||
public void NextHairSkin () {
|
||||
activeHairIndex = (activeHairIndex + 1) % hairSkins.Length;
|
||||
UpdateCharacterSkin();
|
||||
UpdateCombinedSkin();
|
||||
}
|
||||
|
||||
public void PrevHairSkin () {
|
||||
activeHairIndex = (activeHairIndex + hairSkins.Length - 1) % hairSkins.Length;
|
||||
UpdateCharacterSkin();
|
||||
UpdateCombinedSkin();
|
||||
}
|
||||
|
||||
public void NextEyesSkin () {
|
||||
activeEyesIndex = (activeEyesIndex + 1) % eyesSkins.Length;
|
||||
UpdateCharacterSkin();
|
||||
UpdateCombinedSkin();
|
||||
}
|
||||
|
||||
public void PrevEyesSkin () {
|
||||
activeEyesIndex = (activeEyesIndex + eyesSkins.Length - 1) % eyesSkins.Length;
|
||||
UpdateCharacterSkin();
|
||||
UpdateCombinedSkin();
|
||||
}
|
||||
|
||||
public void NextNoseSkin () {
|
||||
activeNoseIndex = (activeNoseIndex + 1) % noseSkins.Length;
|
||||
UpdateCharacterSkin();
|
||||
UpdateCombinedSkin();
|
||||
}
|
||||
|
||||
public void PrevNoseSkin () {
|
||||
activeNoseIndex = (activeNoseIndex + noseSkins.Length - 1) % noseSkins.Length;
|
||||
UpdateCharacterSkin();
|
||||
UpdateCombinedSkin();
|
||||
}
|
||||
|
||||
public void Equip (string itemSkin, ItemType itemType) {
|
||||
switch (itemType) {
|
||||
case ItemType.Cloth:
|
||||
clothesSkin = itemSkin;
|
||||
break;
|
||||
case ItemType.Pants:
|
||||
pantsSkin = itemSkin;
|
||||
break;
|
||||
case ItemType.Bag:
|
||||
bagSkin = itemSkin;
|
||||
break;
|
||||
case ItemType.Hat:
|
||||
hatSkin = itemSkin;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
UpdateCombinedSkin();
|
||||
}
|
||||
|
||||
public void OptimizeSkin () {
|
||||
// Create a repacked skin.
|
||||
var previousSkin = skeletonAnimation.Skeleton.Skin;
|
||||
// Note: materials and textures returned by GetRepackedSkin() behave like 'new Texture2D()' and need to be destroyed
|
||||
if (runtimeMaterial)
|
||||
Destroy(runtimeMaterial);
|
||||
if (runtimeAtlas)
|
||||
Destroy(runtimeAtlas);
|
||||
Skin repackedSkin = previousSkin.GetRepackedSkin("Repacked skin", skeletonAnimation.SkeletonDataAsset.atlasAssets[0].PrimaryMaterial, out runtimeMaterial, out runtimeAtlas);
|
||||
previousSkin.Clear();
|
||||
|
||||
// Use the repacked skin.
|
||||
skeletonAnimation.Skeleton.Skin = repackedSkin;
|
||||
skeletonAnimation.Skeleton.SetSlotsToSetupPose();
|
||||
skeletonAnimation.AnimationState.Apply(skeletonAnimation.Skeleton);
|
||||
|
||||
// `GetRepackedSkin()` and each call to `GetRemappedClone()` with parameter `premultiplyAlpha` set to `true`
|
||||
// cache necessarily created Texture copies which can be cleared by calling AtlasUtilities.ClearCache().
|
||||
// You can optionally clear the textures cache after multiple repack operations.
|
||||
// Just be aware that while this cleanup frees up memory, it is also a costly operation
|
||||
// and will likely cause a spike in the framerate.
|
||||
AtlasUtilities.ClearCache();
|
||||
Resources.UnloadUnusedAssets();
|
||||
}
|
||||
|
||||
void UpdateCharacterSkin () {
|
||||
var skeleton = skeletonAnimation.Skeleton;
|
||||
var skeletonData = skeleton.Data;
|
||||
characterSkin = new Skin("character-base");
|
||||
// Note that the result Skin returned by calls to skeletonData.FindSkin()
|
||||
// could be cached once in Start() instead of searching for the same skin
|
||||
// every time. For demonstration purposes we keep it simple here.
|
||||
characterSkin.AddSkin(skeletonData.FindSkin(baseSkin));
|
||||
characterSkin.AddSkin(skeletonData.FindSkin(noseSkins[activeNoseIndex]));
|
||||
characterSkin.AddSkin(skeletonData.FindSkin(eyelidsSkin));
|
||||
characterSkin.AddSkin(skeletonData.FindSkin(eyesSkins[activeEyesIndex]));
|
||||
characterSkin.AddSkin(skeletonData.FindSkin(hairSkins[activeHairIndex]));
|
||||
}
|
||||
|
||||
void AddEquipmentSkinsTo (Skin combinedSkin) {
|
||||
var skeleton = skeletonAnimation.Skeleton;
|
||||
var skeletonData = skeleton.Data;
|
||||
combinedSkin.AddSkin(skeletonData.FindSkin(clothesSkin));
|
||||
combinedSkin.AddSkin(skeletonData.FindSkin(pantsSkin));
|
||||
if (!string.IsNullOrEmpty(bagSkin)) combinedSkin.AddSkin(skeletonData.FindSkin(bagSkin));
|
||||
if (!string.IsNullOrEmpty(hatSkin)) combinedSkin.AddSkin(skeletonData.FindSkin(hatSkin));
|
||||
}
|
||||
|
||||
void UpdateCombinedSkin () {
|
||||
var skeleton = skeletonAnimation.Skeleton;
|
||||
var resultCombinedSkin = new Skin("character-combined");
|
||||
|
||||
resultCombinedSkin.AddSkin(characterSkin);
|
||||
AddEquipmentSkinsTo(resultCombinedSkin);
|
||||
|
||||
skeleton.SetSkin(resultCombinedSkin);
|
||||
skeleton.SetSlotsToSetupPose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b5a66492fdefc494b8399943a0f9b250
|
||||
timeCreated: 1601458489
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user