修了很多bug和增加功能,优化不少问题

This commit is contained in:
2026-02-28 06:59:22 +08:00
parent 508a40bba0
commit e11cc1da7a
345 changed files with 173803 additions and 69332 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 58776b180e054d949814089d45f8d678
TextureImporter:
internalIDToNameTable:
- first:
213: -8680797543115379092
second: A_0
externalObjects: {}
serializedVersion: 13
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
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 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
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: A_0
rect:
serializedVersion: 2
x: 213
y: 217
width: 355
height: 345
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: c6e268b90ac978780800000000000000
internalID: -8680797543115379092
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
A_0: -8680797543115379092
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: ebccb100e69d1a14884e51d82092e302
TextureImporter:
internalIDToNameTable:
- first:
213: 7425438597007568885
second: B_0
externalObjects: {}
serializedVersion: 13
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
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 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
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: B_0
rect:
serializedVersion: 2
x: 234
y: 223
width: 315
height: 334
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 5ff6c14ff057c0760800000000000000
internalID: 7425438597007568885
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
B_0: 7425438597007568885
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: d7eaba65838aec845b770f1a9033c3b6
TextureImporter:
internalIDToNameTable:
- first:
213: -606033477821260893
second: C_0
externalObjects: {}
serializedVersion: 13
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
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 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
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: C_0
rect:
serializedVersion: 2
x: 236
y: 217
width: 308
height: 344
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 3ab187843cfe697f0800000000000000
internalID: -606033477821260893
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
C_0: -606033477821260893
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: ecd7a8694457df64687ae6b57ab1fa44
TextureImporter:
internalIDToNameTable:
- first:
213: -1182827721247122346
second: S_0
externalObjects: {}
serializedVersion: 13
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
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 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
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: S_0
rect:
serializedVersion: 2
x: 238
y: 217
width: 305
height: 346
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 65c94945470c59fe0800000000000000
internalID: -1182827721247122346
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
S_0: -1182827721247122346
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
@@ -271,8 +271,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 8.26, y: 19.81}
m_SizeDelta: {x: 513.73, y: 139.62}
m_AnchoredPosition: {x: 8.26, y: -19.259}
m_SizeDelta: {x: 513.73, y: 217.76}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6335537327971292952
CanvasRenderer:
@@ -304,10 +304,10 @@ MonoBehaviour:
m_Calls: []
m_FontData:
m_Font: {fileID: 12800000, guid: bd4be44636ad6c24a9b117a7108a75e9, type: 3}
m_FontSize: 15
m_FontSize: 13
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 1
m_MinSize: 0
m_MaxSize: 40
m_Alignment: 0
m_AlignByGeometry: 0
@@ -412,8 +412,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -50, y: 71.820015}
m_SizeDelta: {x: 600, y: 206.36003}
m_AnchoredPosition: {x: -50, y: 28.409}
m_SizeDelta: {x: 600, y: 293.182}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9182298339956936854
CanvasRenderer:
@@ -18,9 +18,15 @@ public class loadDetailsPrefab : MonoBehaviour
[Tooltip("Documentation text normalized.")]
public Vector2 minOffsetPixels = new Vector2(0f, -50f);
[Header("Enter Animation")]
public bool playEnterAnimation = true;
[Min(0.01f)] public float enterAnimDuration = 0.2f;
[Min(0f)] public float enterMoveDistance = 24f;
private GameObject currentDetailsInstance;
private detailsPrefabController currentController;
private Coroutine showCoroutine;
private Coroutine enterAnimCoroutine;
private bool isAbove; // Documentation text normalized.
void Awake()
@@ -82,8 +88,21 @@ public class loadDetailsPrefab : MonoBehaviour
CanvasGroup cg = currentDetailsInstance.GetComponent<CanvasGroup>();
if (cg == null) cg = currentDetailsInstance.AddComponent<CanvasGroup>();
cg.blocksRaycasts = false;
cg.alpha = playEnterAnimation ? 0f : 1f;
currentDetailsInstance.SetActive(true);
if (playEnterAnimation)
{
if (enterAnimCoroutine != null)
{
StopCoroutine(enterAnimCoroutine);
enterAnimCoroutine = null;
}
RectTransform rt = currentDetailsInstance.GetComponent<RectTransform>();
enterAnimCoroutine = StartCoroutine(PlayEnterAnimation(rt, cg));
}
}
private void SetupPosition(Vector3 position)
@@ -282,6 +301,12 @@ public class loadDetailsPrefab : MonoBehaviour
showCoroutine = null;
}
if (enterAnimCoroutine != null)
{
StopCoroutine(enterAnimCoroutine);
enterAnimCoroutine = null;
}
if (currentDetailsInstance != null)
{
Destroy(currentDetailsInstance);
@@ -289,4 +314,42 @@ public class loadDetailsPrefab : MonoBehaviour
currentController = null;
}
}
private System.Collections.IEnumerator PlayEnterAnimation(RectTransform rt, CanvasGroup cg)
{
if (rt == null || cg == null)
{
enterAnimCoroutine = null;
yield break;
}
Vector3 targetPos = rt.position;
Vector3 startPos = targetPos + Vector3.down * enterMoveDistance;
rt.position = startPos;
cg.alpha = 0f;
float duration = Mathf.Max(0.01f, enterAnimDuration);
float elapsed = 0f;
while (elapsed < duration)
{
elapsed += Time.unscaledDeltaTime;
float t = Mathf.Clamp01(elapsed / duration);
float eased = EaseOutCubic(t);
rt.position = Vector3.LerpUnclamped(startPos, targetPos, eased);
cg.alpha = t;
yield return null;
}
rt.position = targetPos;
cg.alpha = 1f;
enterAnimCoroutine = null;
}
private static float EaseOutCubic(float t)
{
float inv = 1f - t;
return 1f - inv * inv * inv;
}
}
@@ -65,7 +65,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Sprite: {fileID: 21300000, guid: 7f3b1220317607e44bbb8f0e1998044a, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
@@ -74,7 +74,7 @@ MonoBehaviour:
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
m_PixelsPerUnitMultiplier: 10
--- !u!1 &859021744337597420
GameObject:
m_ObjectHideFlags: 0
@@ -140,7 +140,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Sprite: {fileID: 21300000, guid: 7f3b1220317607e44bbb8f0e1998044a, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
@@ -149,7 +149,7 @@ MonoBehaviour:
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
m_PixelsPerUnitMultiplier: 4
--- !u!1 &3229840854683389486
GameObject:
m_ObjectHideFlags: 0
@@ -361,10 +361,18 @@ MonoBehaviour:
- {r: 1, g: 1, b: 1, a: 1}
skillContainer: {fileID: 3121310117852151690}
skillCardPrefab: {fileID: 6849663232819926772, guid: cd57e902147b2744ea30e7e412013adc, type: 3}
levelIcon_sprite_C: {fileID: 21300000, guid: a919404cd6477be4c878442426de1d13, type: 3}
levelIcon_sprite_B: {fileID: 21300000, guid: ff77da93eaa5bdd44966dad03e35f56b, type: 3}
levelIcon_sprite_A: {fileID: 21300000, guid: 61dd84e2a30a06a4b913933e34767f4b, type: 3}
levelIcon_sprite_S: {fileID: 21300000, guid: 8f6b0c65c13b1ed478dd3f37e989f2c5, type: 3}
levelIcon_sprite_C: {fileID: 21300000, guid: d7eaba65838aec845b770f1a9033c3b6, type: 3}
levelIcon_sprite_B: {fileID: 21300000, guid: ebccb100e69d1a14884e51d82092e302, type: 3}
levelIcon_sprite_A: {fileID: 21300000, guid: 58776b180e054d949814089d45f8d678, type: 3}
levelIcon_sprite_S: {fileID: 21300000, guid: ecd7a8694457df64687ae6b57ab1fa44, type: 3}
enableHoverAnim: 1
hoverScale: 1.04
hoverTweenTime: 0.12
hoverExpand: 0.18
hoverCompress: 0.08
changeMoveOffset: 40
changeMoveTime: 0.18
changeBlinkTime: 0.05
--- !u!225 &3635589955459441602
CanvasGroup:
m_ObjectHideFlags: 0
@@ -473,8 +481,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 17.5, y: -317.5}
m_SizeDelta: {x: 65, y: 65}
m_AnchoredPosition: {x: 16.818, y: -316.8183}
m_SizeDelta: {x: 96.675, y: 96.675}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7029393728006405258
CanvasRenderer:
@@ -1,4 +1,4 @@
using UnityEngine;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;
@@ -303,13 +303,20 @@ public class slots_heroSlots : MonoBehaviour, IDropHandler, IBeginDragHandler, I
}
}
// Allow right-click to clear this slot
// Allow right-click to clear this slot, left-click to switch to skill configuration
public void OnPointerClick(PointerEventData eventData)
{
if (eventData.button == PointerEventData.InputButton.Right)
{
ClearSlot();
}
else if (eventData.button == PointerEventData.InputButton.Left)
{
if (heroSlot_heroID > 0 && loadSkillsSelect.Instance != null)
{
loadSkillsSelect.Instance.LoadSkillsForHero(heroSlot_heroID);
}
}
}
private void ClearSlot()
@@ -369,8 +376,10 @@ public class slots_heroSlots : MonoBehaviour, IDropHandler, IBeginDragHandler, I
canvasGroup = GetComponent<CanvasGroup>() ?? gameObject.AddComponent<CanvasGroup>();
canvasGroup.blocksRaycasts = false;
// show shared ghost using heroImage sprite (poster)
Sprite s = heroImage != null ? heroImage.sprite : null;
// Use ally_heroSelectIcon from SO for dragging ghost as requested
AllyHero_SO found = FindHeroById(heroSlot_heroID);
Sprite s = (found != null && found.ally_heroSelectIcon != null) ? found.ally_heroSelectIcon : (heroImage != null ? heroImage.sprite : null);
Utils.DragGhost.Show(rootCanvas, s);
Utils.DragGhost.UpdatePosition(eventData.position, eventData.pressEventCamera);