Skip to content

Commit 5b7d6b2

Browse files
committed
[+] Entity Component 在回滚后提供引用绑定接口
1 parent 9cf9109 commit 5b7d6b2

19 files changed

Lines changed: 155 additions & 85 deletions

File tree

Unity/Assets/Scripts/BackUp/Ext/ExtensionBackup.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ public void ReadBackup(Deserializer reader){
129129
namespace Lockstep.Game{
130130
public partial class Enemy :IBackup{
131131
public void WriteBackup(Serializer writer){
132+
writer.Write(EntityId);
132133
writer.Write(PrefabId);
133134
writer.Write(curHealth);
134135
writer.Write(damage);
@@ -142,11 +143,11 @@ public void WriteBackup(Serializer writer){
142143
colliderData.WriteBackup(writer);
143144
rigidbody.WriteBackup(writer);
144145
skillBox.WriteBackup(writer);
145-
transform.WriteBackup(writer);
146-
writer.Write(EntityId);
146+
transform.WriteBackup(writer);
147147
}
148148

149149
public void ReadBackup(Deserializer reader){
150+
EntityId = reader.ReadInt32();
150151
PrefabId = reader.ReadInt32();
151152
curHealth = reader.ReadInt32();
152153
damage = reader.ReadInt32();
@@ -160,15 +161,15 @@ public void ReadBackup(Deserializer reader){
160161
colliderData.ReadBackup(reader);
161162
rigidbody.ReadBackup(reader);
162163
skillBox.ReadBackup(reader);
163-
transform.ReadBackup(reader);
164-
EntityId = reader.ReadInt32();
164+
transform.ReadBackup(reader);
165165
}
166166
}
167167
}
168168

169169
namespace Lockstep.Game{
170170
public partial class Player :IBackup{
171171
public void WriteBackup(Serializer writer){
172+
writer.Write(EntityId);
172173
writer.Write(PrefabId);
173174
writer.Write(curHealth);
174175
writer.Write(damage);
@@ -184,11 +185,11 @@ public void WriteBackup(Serializer writer){
184185
mover.WriteBackup(writer);
185186
rigidbody.WriteBackup(writer);
186187
skillBox.WriteBackup(writer);
187-
transform.WriteBackup(writer);
188-
writer.Write(EntityId);
188+
transform.WriteBackup(writer);
189189
}
190190

191191
public void ReadBackup(Deserializer reader){
192+
EntityId = reader.ReadInt32();
192193
PrefabId = reader.ReadInt32();
193194
curHealth = reader.ReadInt32();
194195
damage = reader.ReadInt32();
@@ -204,8 +205,7 @@ public void ReadBackup(Deserializer reader){
204205
mover.ReadBackup(reader);
205206
rigidbody.ReadBackup(reader);
206207
skillBox.ReadBackup(reader);
207-
transform.ReadBackup(reader);
208-
EntityId = reader.ReadInt32();
208+
transform.ReadBackup(reader);
209209
}
210210
}
211211
}
@@ -251,19 +251,19 @@ public void ReadBackup(Deserializer reader){
251251
namespace Lockstep.Game{
252252
public partial class Spawner :IBackup{
253253
public void WriteBackup(Serializer writer){
254+
writer.Write(EntityId);
254255
writer.Write(PrefabId);
255256
writer.Write(_timer);
256257
info.WriteBackup(writer);
257-
transform.WriteBackup(writer);
258-
writer.Write(EntityId);
258+
transform.WriteBackup(writer);
259259
}
260260

261261
public void ReadBackup(Deserializer reader){
262+
EntityId = reader.ReadInt32();
262263
PrefabId = reader.ReadInt32();
263264
_timer = reader.ReadLFloat();
264265
info.ReadBackup(reader);
265-
transform.ReadBackup(reader);
266-
EntityId = reader.ReadInt32();
266+
transform.ReadBackup(reader);
267267
}
268268
}
269269
}

Unity/Assets/Scripts/BackUp/ExtensionAfterBackupComponent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ namespace Lockstep.Game {
44
public partial class CAnimator : IAfterBackup{ public void OnAfterDeserialize(){ } }
55
public partial class CBrain : IAfterBackup{ public void OnAfterDeserialize(){ } }
66
public partial class CMover : IAfterBackup{ public void OnAfterDeserialize(){ } }
7+
public partial class CRigidbody : IAfterBackup {public void OnAfterDeserialize(){ }}
78
public partial class PlayerInput : IAfterBackup{ public void OnAfterDeserialize(){ } }
89
public partial class Skill : IAfterBackup{ public void OnAfterDeserialize(){ } }
910
public partial class SpawnerInfo : IAfterBackup{public void OnAfterDeserialize(){ } }
10-
public partial class CRigidbody : IAfterBackup {public void OnAfterDeserialize(){ }}
1111
}
1212

1313
namespace Lockstep.Collision2D {

Unity/Assets/Scripts/BackUp/ExtensionAfterBackupEntity.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
namespace Lockstep.Game {
44
public partial class Enemy : IAfterBackup {
5-
public void OnAfterDeserialize(){ }
5+
public void OnAfterDeserialize(){
6+
7+
}
68
}
79

810
public partial class Player : IAfterBackup {

Unity/Assets/Scripts/Core/Base/BaseEntity.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,27 @@ namespace Lockstep.Game {
1111
[Serializable]
1212
[NoBackup]
1313
public partial class BaseEntity : BaseLifeCycle, IEntity, ILPTriggerEventHandler {
14-
public int EntityId { get; set; }
14+
public int EntityId;
1515
public int PrefabId;
1616
public CTransform2D transform = new CTransform2D();
1717
[NoBackup] public object engineTransform;
1818
protected List<BaseComponent> allComponents;
1919

20+
[ReRefBackup] public IGameStateService GameStateService { get; set; }
21+
[ReRefBackup] public IServiceContainer ServiceContainer { get; set; }
22+
23+
public T GetService<T>() where T : IService{
24+
return ServiceContainer.GetService<T>();
25+
}
26+
27+
public void DoBindRef(){
28+
BindRef();
29+
}
30+
31+
protected virtual void BindRef(){
32+
allComponents?.Clear();
33+
}
34+
2035
protected void RegisterComponent(BaseComponent comp){
2136
if (allComponents == null) {
2237
allComponents = new List<BaseComponent>();

Unity/Assets/Scripts/Logic/Config/GameConfig.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ public void CopyTo(object dst){
2121
FieldInfo[] fields = dst.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public);
2222
foreach (var field in fields) {
2323
var type = field.FieldType;
24-
if (typeof(BaseComponent).IsAssignableFrom(type)
25-
|| typeof(CRigidbody).IsAssignableFrom(type)
26-
|| typeof(Transform).IsAssignableFrom(type)
24+
if (typeof(INeedBackup).IsAssignableFrom(type)
2725
) {
2826
CopyTo(field.GetValue(dst), field.GetValue(Entity));
2927
}

Unity/Assets/Scripts/Logic/EntityComponent/Component/CAnimator.cs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,27 @@
44
using Lockstep.Collision2D;
55
using Lockstep.Math;
66
using Lockstep.Game;
7+
using Lockstep.UnityExt;
78
using Debug = Lockstep.Logging.Debug;
89

10+
#if UNITY_5_3_OR_NEWER
11+
using HideInInspector = UnityEngine.HideInInspector;
12+
#endif
913

1014
namespace Lockstep.Game {
1115
public interface IAnimatorView {
1216
void Play(string name, bool isCross);
1317
void Sample(LFloat time);
1418
}
1519

20+
1621
[Serializable]
17-
public partial class CAnimator : BaseComponent {
18-
[ReRefBackup] public AnimatorConfig config;
19-
[ReRefBackup] public IAnimatorView view;
20-
[ReRefBackup] public AnimInfo curAnimInfo;
21-
[ReRefBackup] public AnimBindInfo curAnimBindInfo;
22+
public partial class CAnimator : Component {
23+
public int configId;
24+
25+
[HideInInspector] [ReRefBackup] public AnimatorConfig config;
26+
[HideInInspector] [ReRefBackup] public IAnimatorView view;
27+
[HideInInspector] [ReRefBackup] public AnimBindInfo curAnimBindInfo;
2228

2329
[Backup] private LFloat _animLen;
2430
[Backup] private LFloat _timer;
@@ -29,14 +35,25 @@ public partial class CAnimator : BaseComponent {
2935
private LVector3 _intiPos;
3036

3137
private List<AnimInfo> _animInfos => config.anims;
38+
public AnimInfo curAnimInfo => _curAnimIdx == -1 ? null : _animInfos[_curAnimIdx];
3239

33-
public override void DoStart(){
40+
public override void BindEntity(BaseEntity baseEntity){
41+
base.BindEntity(baseEntity);
42+
config = entity.GetService<IGameConfigService>().GetAnimatorConfig(configId);
3443
if (config == null) return;
44+
UpdateBindInfo();
3545
_animNames.Clear();
3646
foreach (var info in _animInfos) {
3747
_animNames.Add(info.name);
3848
}
49+
}
3950

51+
void UpdateBindInfo(){
52+
curAnimBindInfo = config.events.Find((a) => a.name == _curAnimName);
53+
if (curAnimBindInfo == null) curAnimBindInfo = AnimBindInfo.Empty;
54+
}
55+
56+
public override void DoStart(){
4057
Play(AnimDefine.Idle);
4158
}
4259

@@ -75,9 +92,8 @@ public void Play(string name, bool isCrossfade = false){
7592
Debug.Trace($"{baseEntity.EntityId} PlayAnim {name} rawName {_curAnimName}");
7693
var hasChangedAnim = _curAnimName != name;
7794
_curAnimName = name;
78-
curAnimInfo = _animInfos[idx];
79-
curAnimBindInfo = config.events.Find((a) => a.name == name);
80-
if (curAnimBindInfo == null) curAnimBindInfo = AnimBindInfo.Empty;
95+
_curAnimIdx = idx;
96+
UpdateBindInfo();
8197
if (hasChangedAnim) {
8298
//owner.TakeDamage(0, owner.transform2D.Pos3);
8399
ResetAnim();

Unity/Assets/Scripts/Logic/EntityComponent/Component/CBrain.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,16 @@ namespace Lockstep.Game {
66
[Serializable]
77
public partial class CBrain : Component {
88
public Entity target { get; private set; }
9+
public int targetId ;
910
public LFloat stopDistSqr = 1 * 1;
1011
public LFloat atkInterval = 1;
1112
private LFloat atkTimer;
1213

14+
public override void BindEntity(BaseEntity e){
15+
base.BindEntity(e);
16+
target = GameStateService.GetEntity(targetId) as Entity;
17+
}
18+
1319
public override void DoUpdate(LFloat deltaTime){
1420
if (!entity.rigidbody.isOnFloor) {
1521
return;
@@ -28,6 +34,8 @@ public override void DoUpdate(LFloat deltaTime){
2834
}
2935

3036
target = minTarget;
37+
targetId = target.EntityId;
38+
3139
if (minTarget == null)
3240
return;
3341
if (minDist > stopDistSqr) {

Unity/Assets/Scripts/Logic/EntityComponent/Component/CSkillBox.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,26 +33,30 @@ public void ReadBackup(Deserializer reader){
3333
[Serializable]
3434
[SelfImplement]
3535
public partial class CSkillBox : Component, ISkillEventHandler {
36-
public int skillConfigId;
36+
public int configId;
3737
public bool isFiring;
38-
[Backup] private int _curSkillIdx = 0;
3938
[ReRefBackup] public SkillBoxConfig config;
39+
[Backup] private int _curSkillIdx = 0;
4040
[Backup] private List<Skill> _skills = new List<Skill>();
4141
public Skill curSkill => (_curSkillIdx >= 0) ? _skills[_curSkillIdx] : null;
4242

43-
#if UNITY_EDITOR
44-
[UnityEngine.SerializeField]
45-
#endif
46-
public override void DoStart(){
47-
base.DoStart();
48-
if (config != null) {
49-
config.CheckInit();
43+
public override void BindEntity(BaseEntity e){
44+
base.BindEntity(e);
45+
config = entity.GetService<IGameConfigService>().GetSkillConfig(configId);
46+
if (config == null) return;
47+
config.CheckInit();
48+
if (config.skillInfos.Count != _skills.Count) {
49+
_skills.Clear();
5050
foreach (var info in config.skillInfos) {
5151
var skill = new Skill();
52-
skill.DoStart(entity, info, this);
5352
_skills.Add(skill);
53+
skill.BindEntity(entity, info, this);
5454
}
5555
}
56+
for (int i = 0; i < _skills.Count; i++) {
57+
var skill = _skills[i];
58+
skill.BindEntity(entity, config.skillInfos[i], this);
59+
}
5660
}
5761

5862
public override void DoUpdate(LFloat deltaTime){

Unity/Assets/Scripts/Logic/EntityComponent/Component/Skill/Skill.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public partial class Skill : INeedBackup {
5353

5454
public void ForceStop(){ }
5555

56-
public void DoStart(Entity entity, SkillInfo info, ISkillEventHandler eventHandler){
56+
public void BindEntity(Entity entity, SkillInfo info, ISkillEventHandler eventHandler){
5757
this.entity = entity;
5858
this.SkillInfo = info;
5959
this.eventHandler = eventHandler;

Unity/Assets/Scripts/Logic/EntityComponent/Entity.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public partial class Entity : BaseEntity {
1111
public CRigidbody rigidbody = new CRigidbody();
1212
public CAnimator animator = new CAnimator();
1313
public ColliderData colliderData = new ColliderData();
14-
14+
1515
public CSkillBox skillBox = new CSkillBox();
1616
public LFloat moveSpd = 5;
1717
public LFloat turnSpd = 360;
@@ -24,11 +24,13 @@ public partial class Entity : BaseEntity {
2424

2525
public bool isDead => curHealth <= 0;
2626

27-
[ReRefBackup] public IGameStateService GameStateService { get; set; }
28-
27+
2928
[ReRefBackup] public IEntityView EntityView;
3029
[ReRefBackup] public Action<Entity> OnDied;
31-
public Entity(){
30+
31+
32+
protected override void BindRef(){
33+
base.BindRef();
3234
RegisterComponent(animator);
3335
RegisterComponent(skillBox);
3436
}
@@ -48,7 +50,7 @@ public override void DoUpdate(LFloat deltaTime){
4850
rigidbody.DoUpdate(deltaTime);
4951
base.DoUpdate(deltaTime);
5052
}
51-
53+
5254
public bool Fire(int idx = 0){
5355
return skillBox.Fire(idx);
5456
}
@@ -69,13 +71,11 @@ public virtual void TakeDamage(int amount, LVector3 hitPoint){
6971
PhysicSystem.Instance.RemoveCollider(this);
7072
}
7173
}
74+
7275
protected virtual void OnTakeDamage(int amount, LVector3 hitPoint){ }
7376

7477
protected virtual void OnDead(){
7578
Debug.Log($"{EntityId} Dead");
7679
}
77-
78-
79-
8080
}
8181
}

0 commit comments

Comments
 (0)