You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.0 KiB
103 lines
3.0 KiB
using UnityEngine; |
|
using FairyGUI; |
|
|
|
public class EmitComponent : GComponent |
|
{ |
|
GLoader _symbolLoader; |
|
GTextField _numberText; |
|
Transform _owner; |
|
|
|
const float OFFSET_ADDITION = 2f; |
|
static Vector2 JITTER_FACTOR = new Vector2(40, 80); |
|
|
|
public EmitComponent() |
|
{ |
|
this.touchable = false; |
|
|
|
_symbolLoader = new GLoader(); |
|
_symbolLoader.autoSize = true; |
|
AddChild(_symbolLoader); |
|
|
|
_numberText = new GTextField(); |
|
_numberText.autoSize = AutoSizeType.Both; |
|
|
|
AddChild(_numberText); |
|
} |
|
|
|
public void SetHurt(Transform owner, int type, long hurt, bool critical) |
|
{ |
|
_owner = owner; |
|
|
|
TextFormat tf = _numberText.textFormat; |
|
if (type == 0) |
|
tf.font = EmitManager.inst.hurtFont1; |
|
else |
|
tf.font = EmitManager.inst.hurtFont2; |
|
_numberText.textFormat = tf; |
|
_numberText.text = hurt.ToString(); |
|
|
|
if (critical) |
|
_symbolLoader.url = EmitManager.inst.criticalSign; |
|
else |
|
_symbolLoader.url = ""; |
|
|
|
UpdateLayout(); |
|
|
|
this.alpha = 1; |
|
UpdatePosition(Vector2.zero); |
|
Vector2 rnd = Vector2.Scale(UnityEngine.Random.insideUnitCircle, JITTER_FACTOR); |
|
int toX = 0; |
|
int toY = -80; |
|
|
|
EmitManager.inst.view.AddChild(this); |
|
GTween.To(Vector2.zero, new Vector2(toX, toY), 1f).SetTarget(this) |
|
.OnUpdate((GTweener tweener) => { this.UpdatePosition(tweener.value.vec2); }).OnComplete(this.OnCompleted); |
|
this.TweenFade(0, 0.5f).SetDelay(0.5f); |
|
} |
|
|
|
void UpdateLayout() |
|
{ |
|
float symbolWidth = this._symbolLoader.width; |
|
if (string.IsNullOrEmpty(this._symbolLoader.url)) |
|
{ |
|
symbolWidth = 0; |
|
} |
|
this.SetSize(symbolWidth + _numberText.width, Mathf.Max(_symbolLoader.height, _numberText.height)); |
|
_numberText.SetXY(symbolWidth > 0 ? (symbolWidth + 2) : 0, |
|
(this.height - _numberText.height) / 2); |
|
_symbolLoader.y = (this.height - _symbolLoader.height) / 2; |
|
} |
|
|
|
void UpdatePosition(Vector2 pos) |
|
{ |
|
if (this._owner == null) |
|
{ |
|
return; |
|
} |
|
Vector3 ownerPos = _owner.position; |
|
ownerPos.y += OFFSET_ADDITION; |
|
Vector3 screenPos = Camera.main.WorldToScreenPoint(ownerPos); |
|
screenPos.y = Screen.height - screenPos.y; //convert to Stage coordinates system |
|
|
|
Vector3 pt = GRoot.inst.GlobalToLocal(screenPos); |
|
this.SetXY(Mathf.RoundToInt(pt.x + pos.x - this.actualWidth / 2), Mathf.RoundToInt(pt.y + pos.y - this.height)); |
|
} |
|
|
|
void OnCompleted() |
|
{ |
|
_owner = null; |
|
EmitManager.inst.view.RemoveChild(this); |
|
EmitManager.inst.ReturnComponent(this); |
|
} |
|
|
|
public void Cancel() |
|
{ |
|
_owner = null; |
|
if (this.parent != null) |
|
{ |
|
GTween.Kill(this); |
|
EmitManager.inst.view.RemoveChild(this); |
|
} |
|
EmitManager.inst.ReturnComponent(this); |
|
} |
|
} |