using System; using System.Linq; using DotRecast.Core.Collections; using JNGame.Math; using JNGame.Sync.Entity.Component; using JNGame.Sync.Frame.Entity; using JNGame.Sync.Frame.Entity.Component.Components; using JNGame.Sync.Frame.Entity.Components; using JNGame.Sync.Frame.Service; using JNGame.Sync.System; namespace JNGame.Sync.Entity { public interface IJNEntity : IJNSyncCycle,IJNSyncId { /// /// 坐标 /// public JNTransformComponent Transform { get; } /// /// 位置 /// public LVector3 Position { get; } public IJNContext GetContext(); public T GetComponent() where T : JNComponent; } public abstract class JNEntity : Entitas.Entity,IJNEntity,IComparable { private ulong _id; public ulong Id => _id; public IJNContext Context { get; private set; } //组件Lookup public JNEntityLookup CLookup{ get; set; } /// /// 坐标 /// public JNTransformComponent Transform => CLookup.Query(this); /// /// 位置 /// public LVector3 Position => Transform.Position; public void OnInit(IJNContext context,ulong id = 0) { Context = context; _id = id; if (_id <= 0) { _id = GetSystem().NextId(); } Context.AddEntity(Id,this); } public abstract JNEntityLookup NewCLookup(); public T GetSystem() where T : SLogicSystem { return Context.GetSync().GetSystem(); } /// /// 获取组件 /// /// /// public T GetComponent() where T : JNComponent { return CLookup.Query(this); } /// /// 添加组件 /// /// /// public JNComponent AddComponent() where T : JNComponent,new() { int index = CLookup.GetIndex(); var temp = CreateComponent(index); temp.OnInit(this); base.AddComponent(index,temp); temp.OnSyncStart(); return temp; } public void RemoveComponent() where T : JNComponent,new() { int index = CLookup.GetIndex(); var component = CLookup.Query(this); component.OnSyncDestroy(); base.RemoveComponent(index); } public override void RemoveAllComponents() { GetComponents().ForEach(child => (child as JNComponent)?.OnSyncDestroy()); base.RemoveAllComponents(); } //实现排序实现 public int CompareTo(object obj) { if (obj is IJNEntity entity) { return Id.CompareTo(entity.Id); } return 1; } public IJNContext GetContext() { return Context; } public override void Destroy() { Context.RemoveEntity(Id); OnSyncDestroy(); RemoveAllComponents(); base.Destroy(); } //生命周期 public virtual void OnSyncStart(){} public virtual void OnSyncUpdate() { //给组件推帧 foreach (var component in GetComponents()) { (component as JNComponent)?.OnSyncUpdate(); } } public virtual void OnSyncDestroy() {} } }