You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			561 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			561 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
| 
											2 years ago
										 | using UnityEngine; | ||
|  | using FairyGUI.Utils; | ||
|  | 
 | ||
|  | namespace FairyGUI | ||
|  | { | ||
|  |     /// <summary> | ||
|  |     ///  | ||
|  |     /// </summary> | ||
|  |     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(); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         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; } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         public AlignType align | ||
|  |         { | ||
|  |             get { return _align; } | ||
|  |             set | ||
|  |             { | ||
|  |                 if (_align != value) | ||
|  |                 { | ||
|  |                     _align = value; | ||
|  |                     UpdateLayout(); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         public VertAlignType verticalAlign | ||
|  |         { | ||
|  |             get { return _verticalAlign; } | ||
|  |             set | ||
|  |             { | ||
|  |                 if (_verticalAlign != value) | ||
|  |                 { | ||
|  |                     _verticalAlign = value; | ||
|  |                     UpdateLayout(); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         public FillType fill | ||
|  |         { | ||
|  |             get { return _fill; } | ||
|  |             set | ||
|  |             { | ||
|  |                 if (_fill != value) | ||
|  |                 { | ||
|  |                     _fill = value; | ||
|  |                     UpdateLayout(); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         public bool shrinkOnly | ||
|  |         { | ||
|  |             get { return _shrinkOnly; } | ||
|  |             set | ||
|  |             { | ||
|  |                 if (_shrinkOnly != value) | ||
|  |                 { | ||
|  |                     _shrinkOnly = value; | ||
|  |                     UpdateLayout(); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         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); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Not implemented | ||
|  |         /// </summary> | ||
|  |         public float timeScale | ||
|  |         { | ||
|  |             get; | ||
|  |             set; | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Not implemented | ||
|  |         /// </summary> | ||
|  |         public bool ignoreEngineTimeScale | ||
|  |         { | ||
|  |             get; | ||
|  |             set; | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Not implemented | ||
|  |         /// </summary> | ||
|  |         /// <param name="time"></param> | ||
|  |         public void Advance(float time) | ||
|  |         { | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         public bool loop | ||
|  |         { | ||
|  |             get { return _loop; } | ||
|  |             set | ||
|  |             { | ||
|  |                 if (_loop != value) | ||
|  |                 { | ||
|  |                     _loop = value; | ||
|  |                     OnChange("loop"); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         /// <value></value> | ||
|  |         public string animationName | ||
|  |         { | ||
|  |             get { return _animationName; } | ||
|  |             set | ||
|  |             { | ||
|  |                 _animationName = value; | ||
|  |                 OnChange("animationName"); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         /// <value></value> | ||
|  |         public string skinName | ||
|  |         { | ||
|  |             get { return _skinName; } | ||
|  |             set | ||
|  |             { | ||
|  |                 _skinName = value; | ||
|  |                 OnChange("skinName"); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         public Material material | ||
|  |         { | ||
|  |             get { return _content.material; } | ||
|  |             set { _content.material = value; } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         public string shader | ||
|  |         { | ||
|  |             get { return _content.shader; } | ||
|  |             set { _content.shader = value; } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         public Color color | ||
|  |         { | ||
|  |             get { return _color; } | ||
|  |             set | ||
|  |             { | ||
|  |                 if (_color != value) | ||
|  |                 { | ||
|  |                     _color = value; | ||
|  |                     UpdateGear(4); | ||
|  | 
 | ||
|  |                     OnChange("color"); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         public GameObject wrapTarget | ||
|  |         { | ||
|  |             get { return _content.wrapTarget; } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         /// <param name="gameObject"></param> | ||
|  |         /// <param name="cloneMaterial"></param> | ||
|  |         /// <param name="width"></param> | ||
|  |         /// <param name="height"></param> | ||
|  |         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; } | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         ///  | ||
|  |         /// </summary> | ||
|  |         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() | ||
|  |         { | ||
|  |             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(); | ||
|  |         } | ||
|  |     } | ||
|  | } |