using UnityEngine; using FairyGUI.Utils; namespace FairyGUI { /// /// /// public partial class GLoader3D : GObject, IAnimationGear, IColorGear { string _url; AlignType _align; VertAlignType _verticalAlign; bool _autoSize; FillType _fill; bool _shrinkOnly; string _animationName; string _skinName; bool _playing; int _frame; bool _loop; bool _updatingLayout; Color _color; protected PackageItem _contentItem; protected GoWrapper _content; public GLoader3D() { _url = string.Empty; _align = AlignType.Left; _verticalAlign = VertAlignType.Top; _playing = true; _color = Color.white; } override protected void CreateDisplayObject() { displayObject = new Container("GLoader3D"); displayObject.gOwner = this; _content = new GoWrapper(); _content.onUpdate += OnUpdateContent; ((Container)displayObject).AddChild(_content); ((Container)displayObject).opaque = true; } override public void Dispose() { _content.Dispose(); base.Dispose(); } /// /// /// public string url { get { return _url; } set { if (_url == value) return; ClearContent(); _url = value; LoadContent(); UpdateGear(7); } } override public string icon { get { return _url; } set { this.url = value; } } /// /// /// public AlignType align { get { return _align; } set { if (_align != value) { _align = value; UpdateLayout(); } } } /// /// /// public VertAlignType verticalAlign { get { return _verticalAlign; } set { if (_verticalAlign != value) { _verticalAlign = value; UpdateLayout(); } } } /// /// /// public FillType fill { get { return _fill; } set { if (_fill != value) { _fill = value; UpdateLayout(); } } } /// /// /// public bool shrinkOnly { get { return _shrinkOnly; } set { if (_shrinkOnly != value) { _shrinkOnly = value; UpdateLayout(); } } } /// /// /// public bool autoSize { get { return _autoSize; } set { if (_autoSize != value) { _autoSize = value; UpdateLayout(); } } } public bool playing { get { return _playing; } set { if (_playing != value) { _playing = value; OnChange("playing"); UpdateGear(5); } } } public int frame { get { return _frame; } set { if (_frame != value) { _frame = value; OnChange("frame"); UpdateGear(5); } } } /// /// Not implemented /// public float timeScale { get; set; } /// /// Not implemented /// public bool ignoreEngineTimeScale { get; set; } /// /// Not implemented /// /// public void Advance(float time) { } /// /// /// public bool loop { get { return _loop; } set { if (_loop != value) { _loop = value; OnChange("loop"); } } } /// /// /// /// public string animationName { get { return _animationName; } set { _animationName = value; OnChange("animationName"); UpdateGear(5); } } /// /// /// /// public string skinName { get { return _skinName; } set { _skinName = value; OnChange("skinName"); UpdateGear(5); } } /// /// /// public Material material { get { return _content.material; } set { _content.material = value; } } /// /// /// public string shader { get { return _content.shader; } set { _content.shader = value; } } /// /// /// public Color color { get { return _color; } set { if (_color != value) { _color = value; UpdateGear(4); OnChange("color"); } } } /// /// /// public GameObject wrapTarget { get { return _content.wrapTarget; } } /// /// /// /// /// /// /// public void SetWrapTarget(GameObject gameObject, bool cloneMaterial, int width, int height) { _content.SetWrapTarget(gameObject, cloneMaterial); _content.SetSize(width, height); sourceWidth = width; sourceHeight = height; UpdateLayout(); } override public IFilter filter { get { return _content.filter; } set { _content.filter = value; } } override public BlendMode blendMode { get { return _content.blendMode; } set { _content.blendMode = value; } } /// /// /// protected void LoadContent() { ClearContent(); if (string.IsNullOrEmpty(_url)) return; _contentItem = UIPackage.GetItemByURL(_url); if (_contentItem != null) { _contentItem = _contentItem.getBranch(); _contentItem = _contentItem.getHighResolution(); _contentItem.Load(); if (_contentItem.type == PackageItemType.Spine) { #if FAIRYGUI_SPINE LoadSpine(); #endif } else if (_contentItem.type == PackageItemType.DragoneBones) { #if FAIRYGUI_DRAGONBONES LoadDragonBones(); #endif } } else LoadExternal(); } virtual protected void OnChange(string propertyName) { if (_contentItem == null) return; if (_contentItem.type == PackageItemType.Spine) { #if FAIRYGUI_SPINE OnChangeSpine(propertyName); #endif } else if (_contentItem.type == PackageItemType.DragoneBones) { #if FAIRYGUI_DRAGONBONES OnChangeDragonBones(propertyName); #endif } } virtual protected void LoadExternal() { } virtual protected void FreeExternal() { GameObject.DestroyImmediate(_content.wrapTarget); } protected void UpdateLayout() { if (sourceWidth == 0 || sourceHeight == 0) return; float contentWidth = sourceWidth; float contentHeight = sourceHeight; if (_autoSize) { _updatingLayout = true; if (contentWidth == 0) contentWidth = 50; if (contentHeight == 0) contentHeight = 30; SetSize(contentWidth, contentHeight); _updatingLayout = false; if (_width == contentWidth && _height == contentHeight) { _content.SetXY(0, 0); _content.SetScale(1, 1); InvalidateBatchingState(); return; } //如果不相等,可能是由于大小限制造成的,要后续处理 } float sx = 1, sy = 1; if (_fill != FillType.None) { sx = this.width / sourceWidth; sy = this.height / sourceHeight; if (sx != 1 || sy != 1) { if (_fill == FillType.ScaleMatchHeight) sx = sy; else if (_fill == FillType.ScaleMatchWidth) sy = sx; else if (_fill == FillType.Scale) { if (sx > sy) sx = sy; else sy = sx; } else if (_fill == FillType.ScaleNoBorder) { if (sx > sy) sy = sx; else sx = sy; } if (_shrinkOnly) { if (sx > 1) sx = 1; if (sy > 1) sy = 1; } contentWidth = sourceWidth * sx; contentHeight = sourceHeight * sy; } } _content.SetScale(sx, sy); float nx; float ny; if (_align == AlignType.Center) nx = (this.width - contentWidth) / 2; else if (_align == AlignType.Right) nx = this.width - contentWidth; else nx = 0; if (_verticalAlign == VertAlignType.Middle) ny = (this.height - contentHeight) / 2; else if (_verticalAlign == VertAlignType.Bottom) ny = this.height - contentHeight; else ny = 0; _content.SetXY(nx, ny); InvalidateBatchingState(); } protected void ClearContent() { if (_content.wrapTarget != null) { if (_contentItem != null) { if (_contentItem.type == PackageItemType.Spine) { #if FAIRYGUI_SPINE FreeSpine(); #endif } else if (_contentItem.type == PackageItemType.DragoneBones) { #if FAIRYGUI_DRAGONBONES FreeDragonBones(); #endif } } else FreeExternal(); } _content.wrapTarget = null; _contentItem = null; } protected void OnUpdateContent(UpdateContext context) { if (_contentItem == null) return; if (_contentItem.type == PackageItemType.Spine) { #if FAIRYGUI_SPINE OnUpdateSpine(context); #endif } else if (_contentItem.type == PackageItemType.DragoneBones) { #if FAIRYGUI_DRAGONBONES OnUpdateDragonBones(context); #endif } } override protected void HandleSizeChanged() { base.HandleSizeChanged(); if (!_updatingLayout) UpdateLayout(); } override public void Setup_BeforeAdd(ByteBuffer buffer, int beginPos) { base.Setup_BeforeAdd(buffer, beginPos); buffer.Seek(beginPos, 5); _url = buffer.ReadS(); _align = (AlignType)buffer.ReadByte(); _verticalAlign = (VertAlignType)buffer.ReadByte(); _fill = (FillType)buffer.ReadByte(); _shrinkOnly = buffer.ReadBool(); _autoSize = buffer.ReadBool(); _animationName = buffer.ReadS(); _skinName = buffer.ReadS(); _playing = buffer.ReadBool(); _frame = buffer.ReadInt(); _loop = buffer.ReadBool(); if (buffer.ReadBool()) this.color = buffer.ReadColor(); //color if (!string.IsNullOrEmpty(_url)) LoadContent(); } } }