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 PosView = new MetaData(); //额外对象 public List EffectObject = new List(); //挂在实体上的特效 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(); } } }