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
3 years ago
|
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);
|
||
|
}
|
||
|
}
|