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.
198 lines
6.2 KiB
C#
198 lines
6.2 KiB
C#
using Entitas;
|
|
using UnityEngine;
|
|
using Game;
|
|
using System.Collections.Generic;
|
|
|
|
[Game]
|
|
public class ViewComponent : IComponent
|
|
{
|
|
public EntityPoolItem EntityPoolItem;
|
|
public GameObject GameObject;
|
|
public GameObject GameObjectLogic;
|
|
public Transform TransformLogic;
|
|
public Transform TransformView;
|
|
public Transform TransformViewRot;
|
|
public Transform TransformViewOffset;
|
|
public Transform TransformViewMain;
|
|
public Transform TransformViewOther;
|
|
public Collider Collider;
|
|
public Material Material;
|
|
public Vector3 PositionView => TransformViewMain.position;
|
|
public Vector3 PositionLogic => TransformLogic.position;
|
|
public Vector3 PositionPre;
|
|
public SpriteRenderer SpriteRenderer; //物体的主要sprite
|
|
|
|
public MetaData<Vector3> PosView = new MetaData<Vector3>();
|
|
|
|
//额外对象
|
|
public List<EffectPoolItem> EffectObject = new List<EffectPoolItem>(); //挂在实体上的特效
|
|
public ShadowPoolItem SkillPointerObject; //技能指示器
|
|
|
|
// 特殊效果
|
|
public Vector3 LocalPositionOrder = Vector3.zero; //避免z-fighting
|
|
public Vector3 LocalPositionShake = Vector3.zero; //抖动带来的额外偏移
|
|
public Vector3 ScaleDir = Vector3.zero; //缩放方向
|
|
public Color FlashColor = Color.white; //闪白颜色
|
|
public float ShakeTimeLeft; //抖动剩余时间
|
|
public float FlashTimeLeft; //闪白剩余时间
|
|
public float ScaleTimeLeft; //缩放剩余时间
|
|
public float ScaleRate; //缩放强度
|
|
}
|
|
|
|
namespace Game
|
|
{
|
|
public abstract partial class Util
|
|
{
|
|
public static void EntityShake(GameEntity entity, int shakeTimes)
|
|
{
|
|
entity.view.ShakeTimeLeft = shakeTimes * GameConst.ShakeTerm;
|
|
}
|
|
|
|
public static void EntityFlash(GameEntity entity)
|
|
{
|
|
EntityFlash(entity, Color.white);
|
|
}
|
|
|
|
public static void EntityFlash(GameEntity entity, Color flashColor)
|
|
{
|
|
entity.view.FlashTimeLeft = GameConst.FlashTerm;
|
|
entity.view.FlashColor = flashColor;
|
|
}
|
|
|
|
public static void EntityScale(GameEntity entity, Vector3 dir)
|
|
{
|
|
entity.view.ScaleTimeLeft = GameConst.ScaleTerm;
|
|
entity.view.ScaleDir = dir;
|
|
var rate = Mathf.Clamp01((dir.magnitude - GameConst.ScaleFloatingMin) /
|
|
(GameConst.ScaleFloatingMax - GameConst.ScaleFloatingMin));
|
|
var scaleRate = Mathf.Lerp(GameConst.ScaleRateMin, GameConst.ScaleRateMax, rate);
|
|
|
|
entity.view.ScaleRate = scaleRate;
|
|
}
|
|
|
|
public static void SetEntityPos(GameEntity entity, Vector3 pos)
|
|
{
|
|
entity.view.GameObject.transform.position = pos;
|
|
}
|
|
|
|
public static int GetEntityLayer(GameEntity entity)
|
|
{
|
|
return entity.view.GameObject.layer;
|
|
}
|
|
|
|
public static void SetEntityLayer(GameEntity entity, int layer)
|
|
{
|
|
entity.view.GameObject.layer = layer;
|
|
}
|
|
|
|
public static Vector3 EntityLogicPos(int entity)
|
|
{
|
|
var e = Util.GetEntity(entity);
|
|
if (e == null)
|
|
{
|
|
return Vector3.zero;
|
|
}
|
|
|
|
return EntityLogicPos(e);
|
|
}
|
|
|
|
public static Vector3 EntityLogicPos(GameEntity entity)
|
|
{
|
|
return entity.view.TransformLogic.position;
|
|
}
|
|
|
|
public static Vector3 EntityViewPos(int entity)
|
|
{
|
|
var e = Util.GetEntity(entity);
|
|
if (e == null)
|
|
{
|
|
return Vector3.zero;
|
|
}
|
|
|
|
return EntityViewPos(e);
|
|
}
|
|
|
|
public static Vector3 EntityViewPos(GameEntity entity)
|
|
{
|
|
return entity.view.TransformViewMain.position;
|
|
}
|
|
|
|
public static float EntityDistance(int entity1, int entity2)
|
|
{
|
|
var e1 = Util.GetEntity(entity1);
|
|
var e2 = Util.GetEntity(entity2);
|
|
if (e1 == null || e2 == null)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return EntityDistance(e1, e2);
|
|
}
|
|
|
|
public static float EntityDistance(GameEntity entity1, GameEntity entity2)
|
|
{
|
|
return Vector3.Distance(EntityLogicPos(entity1), EntityLogicPos(entity2));
|
|
}
|
|
|
|
public static float EntityDistanceXZ(int entity1, int entity2)
|
|
{
|
|
var e1 = Util.GetEntity(entity1);
|
|
var e2 = Util.GetEntity(entity2);
|
|
if (e1 == null || e2 == null)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return EntityDistanceXZ(e1, e2);
|
|
}
|
|
|
|
public static float EntityDistanceXZ(GameEntity entity1, GameEntity entity2)
|
|
{
|
|
var pos1 = EntityLogicPos(entity1);
|
|
var pos2 = EntityLogicPos(entity2);
|
|
pos1.y = 0;
|
|
pos2.y = 0;
|
|
return Vector3.Distance(pos1, pos2);
|
|
}
|
|
|
|
public static Vector3 EntityOffset(int entity1, int entity2)
|
|
{
|
|
var e1 = Util.GetEntity(entity1);
|
|
var e2 = Util.GetEntity(entity2);
|
|
if (e1 == null || e2 == null)
|
|
{
|
|
return Vector3.zero;
|
|
}
|
|
|
|
return EntityOffset(e1, e2);
|
|
}
|
|
|
|
public static Vector3 EntityOffset(GameEntity entity1, GameEntity entity2)
|
|
{
|
|
return EntityLogicPos(entity2) - EntityLogicPos(entity1);
|
|
}
|
|
|
|
public static void ClearView(GameEntity entity)
|
|
{
|
|
var view = entity.view;
|
|
//特效销毁
|
|
foreach (var item in view.EffectObject)
|
|
{
|
|
item.EffectDestroy();
|
|
}
|
|
|
|
view.EffectObject.Clear();
|
|
//删除技能指示器
|
|
if (view.SkillPointerObject != null)
|
|
{
|
|
view.SkillPointerObject.Destroy();
|
|
}
|
|
|
|
//重置shader参数
|
|
view.Material.SetColor("_FlashColor", new Color(1f, 1f, 1f, 1f));
|
|
|
|
entity.view.GameObjectLogic.SetActive(true);
|
|
view.EntityPoolItem.Destroy();
|
|
}
|
|
}
|
|
} |