42 lines
2.4 KiB
C#
42 lines
2.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
namespace DepthsOfGreed.HandbookUI
|
|
{
|
|
[Serializable] public sealed class PreviewSpriteLayer
|
|
{
|
|
public Sprite sprite;
|
|
public Vector2 offset;
|
|
public Vector2 scale=Vector2.one;
|
|
public float rotation;
|
|
public bool rotateWithAim=true;
|
|
}
|
|
public sealed class LayeredTowerPreview:MonoBehaviour
|
|
{
|
|
readonly List<SpriteRenderer> renderers=new List<SpriteRenderer>();
|
|
PreviewSpriteLayer[] layers;
|
|
public void Show(HandbookTowerEntry entry,Sprite fallback)
|
|
{
|
|
layers=entry.previewLayers??Array.Empty<PreviewSpriteLayer>();
|
|
Sprite reference=null;for(int i=layers.Length-1;i>=0;i--)if(layers[i]?.sprite){reference=layers[i].sprite;break;}
|
|
bool empty=!reference;if(empty)reference=fallback;
|
|
float size=entry.baseShape==BaseShape.Rectangle?entry.baseSize.x:entry.baseRadius*1.4142136f;
|
|
float common=entry.previewScale>0?entry.previewScale:size/Mathf.Max(.001f,reference.bounds.size.x);
|
|
int count=empty?1:layers.Length;
|
|
while(renderers.Count<count){var go=new GameObject("PreviewLayer_"+renderers.Count);go.transform.SetParent(transform,false);renderers.Add(go.AddComponent<SpriteRenderer>());}
|
|
for(int i=0;i<renderers.Count;i++)
|
|
{
|
|
var r=renderers[i];bool visible=i<count && (empty || layers[i]?.sprite);r.gameObject.SetActive(visible);if(!visible)continue;
|
|
var layer=empty?new PreviewSpriteLayer{sprite=fallback}:layers[i];r.sprite=layer.sprite;r.sortingOrder=20+count-i;
|
|
r.transform.localPosition=(Vector3)(layer.offset*common);r.transform.localScale=new Vector3(common*layer.scale.x,common*layer.scale.y,1);
|
|
if(empty && entry.baseShape==BaseShape.Rectangle && entry.previewScale<=0)r.transform.localScale=new Vector3(entry.baseSize.x/reference.bounds.size.x,entry.baseSize.y/reference.bounds.size.y,1);
|
|
}
|
|
LateUpdate();
|
|
}
|
|
public void SetOpacity(float alpha){foreach(var r in renderers)r.color=new Color(1,1,1,alpha);}
|
|
void LateUpdate()
|
|
{for(int i=0;i<renderers.Count;i++)if(renderers[i].gameObject.activeSelf){var l=layers!=null && i<layers.Length?layers[i]:null;renderers[i].transform.localRotation=Quaternion.Euler(0,0,(l?.rotation??0)-(l!=null && !l.rotateWithAim?transform.eulerAngles.z:0));}}
|
|
}
|
|
}
|
|
|