提交 4515a5e3 编写于 作者: T tanghai

简化对象事件系统

上级 a0c38233
......@@ -2,7 +2,6 @@
using Base;
using Model;
using NLog;
using Object = Model.Object;
namespace App
{
......@@ -12,8 +11,8 @@ namespace App
{
try
{
Object.ObjectManager.Register("Model", typeof(Game).Assembly);
Object.ObjectManager.Register("Controller", DllHelper.GetController());
ObjectManager.Instance.Register("Model", typeof(Game).Assembly);
ObjectManager.Instance.Register("Controller", DllHelper.GetController());
StartConfig startConfig = Game.Scene.AddComponent<StartConfigComponent, string[]>(args).MyConfig;
......@@ -67,7 +66,7 @@ namespace App
while (true)
{
Object.ObjectManager.Update();
ObjectManager.Instance.Update();
}
}
catch (Exception e)
......
using System;
using Base;
using Model;
using Object = Model.Object;
namespace Controller
{
......@@ -13,7 +12,7 @@ namespace Controller
A2M_Reload a2MReload = new A2M_Reload();
try
{
Object.ObjectManager.Register("Controller", DllHelper.GetController());
ObjectManager.Instance.Register("Controller", DllHelper.GetController());
}
catch (Exception e)
{
......
......@@ -173,9 +173,6 @@
<Compile Include="..\..\Unity\Assets\Scripts\Object\ILoader.cs">
<Link>Object\ILoader.cs</Link>
</Compile>
<Compile Include="..\..\Unity\Assets\Scripts\Object\IStart.cs">
<Link>Object\IStart.cs</Link>
</Compile>
<Compile Include="..\..\Unity\Assets\Scripts\Object\IUpdate.cs">
<Link>Object\IUpdate.cs</Link>
</Compile>
......
......@@ -3,7 +3,6 @@ using Base;
using UnityEditor;
using UnityEngine;
using Model;
using Object = Model.Object;
namespace MyEditor
{
......@@ -12,6 +11,7 @@ namespace MyEditor
{
static EditorInit()
{
ObjectManager.Instance.Register("Editor", typeof(EditorInit).Assembly);
EditorApplication.update += Update;
}
......@@ -24,12 +24,11 @@ namespace MyEditor
try
{
Object.ObjectManager.Update();
ObjectManager.Instance.Update();
}
catch (Exception e)
{
Object.ObjectManager.Dispose();
Object.ObjectManager = new ObjectManager();
ObjectManager.Reset();
Log.Error(e.ToString());
}
}
......
......@@ -7,14 +7,13 @@ public class ObjectManagerToolsWindow : EditorWindow
[MenuItem("Tools/ObjectManagerTools/显示未Dispose的对象")]
private static void ShowUnDisposeObjects()
{
Log.Info(Object.ObjectManager.ToString());
Log.Info(ObjectManager.Instance.ToString());
}
[MenuItem("Tools/ObjectManagerTools/清除所有对象")]
private static void ClearAllObjects()
{
Object.ObjectManager.Dispose();
Object.ObjectManager = new ObjectManager();
ObjectManager.Reset();
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Reflection;
using Base;
using Object = Model.Object;
namespace Model
{
......@@ -12,7 +10,7 @@ namespace Model
public void Load()
{
Assembly assembly = Object.ObjectManager.GetAssembly("Base");
Assembly assembly = ObjectManager.Instance.GetAssembly("Base");
this.allConfig = new Dictionary<Type, ICategory>();
Type[] types = assembly.GetTypes();
......
......@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Reflection;
using Base;
using Object = Model.Object;
namespace Model
{
......@@ -30,7 +29,7 @@ namespace Model
public void Load()
{
this.allEvents = new Dictionary<EventIdType, List<object>>();
Assembly[] assemblies = Object.ObjectManager.GetAssemblies();
Assembly[] assemblies = ObjectManager.Instance.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
Type[] types = assembly.GetTypes();
......
......@@ -40,7 +40,7 @@ namespace Model
this.handlers = new Dictionary<ushort, List<IMHandler>>();
this.messageOpcode = new Dictionary<Type, MessageAttribute>();
Assembly[] assemblies = Object.ObjectManager.GetAssemblies();
Assembly[] assemblies = ObjectManager.Instance.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
......
......@@ -8,8 +8,8 @@ namespace Model
{
private void Start()
{
Object.ObjectManager.Register("Model", typeof(Game).Assembly);
Object.ObjectManager.Register("Controller", DllHelper.GetController());
ObjectManager.Instance.Register("Model", typeof(Game).Assembly);
ObjectManager.Instance.Register("Controller", DllHelper.GetController());
Game.Scene.AddComponent<EventComponent>().Run(EventIdType.InitSceneStart);
}
......@@ -18,7 +18,7 @@ namespace Model
{
try
{
Object.ObjectManager.Update();
ObjectManager.Instance.Update();
}
catch (Exception e)
{
......
......@@ -2,9 +2,6 @@
namespace Model
{
/// <summary>
/// Component的Id与Owner Entity Id一样
/// </summary>
[BsonKnownTypes(typeof(AConfigComponent))]
public abstract class Component : Object
{
......
......@@ -66,7 +66,7 @@ namespace Model
this.components.Add(component);
this.componentDict.Add(component.GetType(), component);
ObjectManager.Awake(component.Id);
ObjectManager.Instance.Awake(component);
return component;
}
......@@ -87,7 +87,7 @@ namespace Model
this.components.Add(component);
this.componentDict.Add(component.GetType(), component);
ObjectManager.Awake(component.Id, p1);
ObjectManager.Instance.Awake(component, p1);
return component;
}
......@@ -108,7 +108,7 @@ namespace Model
this.components.Add(component);
this.componentDict.Add(component.GetType(), component);
ObjectManager.Awake(component.Id, p1, p2);
ObjectManager.Instance.Awake(component, p1, p2);
return component;
}
......@@ -130,7 +130,7 @@ namespace Model
this.components.Add(component);
this.componentDict.Add(component.GetType(), component);
ObjectManager.Awake(component.Id, p1, p2, p3);
ObjectManager.Instance.Awake(component, p1, p2, p3);
return component;
}
......@@ -147,7 +147,7 @@ namespace Model
}
this.components.Add(component);
this.componentDict.Add(component.GetType(), component);
ObjectManager.Awake(component.Id);
ObjectManager.Instance.Awake(component);
}
public void RemoveComponent<K>() where K : Component
......
namespace Model
{
/// <summary>
/// World的Componet实现该接口后,会在World.Start时调用该Start方法
/// </summary>
public interface IStart
{
void Start();
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: ee0b99021f2abfb408ca33f2f551a1d8
timeCreated: 1474942922
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
......@@ -7,22 +7,19 @@ namespace Model
{
public abstract class Object: IDisposable, ISupportInitialize
{
[BsonIgnore]
public static ObjectManager ObjectManager = new ObjectManager();
[BsonId]
public long Id { get; private set; }
protected Object()
{
Id = IdGenerater.GenerateId();
ObjectManager.Add(this);
ObjectManager.Instance.Add(this);
}
protected Object(long id)
{
this.Id = id;
ObjectManager.Add(this);
ObjectManager.Instance.Add(this);
}
public virtual void Dispose()
......@@ -32,7 +29,7 @@ namespace Model
return;
}
ObjectManager.Remove(this.Id);
ObjectManager.Instance.Remove(this);
this.Id = 0;
}
......
......@@ -39,19 +39,33 @@ namespace Model
private Dictionary<Type, IObjectEvent> objectEvents;
private readonly Dictionary<long, Object> objects = new Dictionary<long, Object>();
private readonly HashSet<Object> objects = new HashSet<Object>();
private readonly HashSet<Object> updates = new HashSet<Object>();
private readonly HashSet<Object> loaders = new HashSet<Object>();
private List<long> starts = new List<long>();
private List<long> newStarts = new List<long>();
private static ObjectManager instance = new ObjectManager();
private List<long> updates = new List<long>(3000);
private List<long> newUpdates = new List<long>(3000);
public static ObjectManager Instance
{
get
{
return instance;
}
}
private readonly List<long> loaders = new List<long>();
private ObjectManager()
{
}
public static void Reset()
{
instance.Dispose();
instance = new ObjectManager();
}
public void Dispose()
{
foreach (Object o in this.objects.Values.ToArray())
foreach (Object o in this.objects.ToArray())
{
o.Dispose();
}
......@@ -99,13 +113,8 @@ namespace Model
private void Load()
{
foreach (long id in this.loaders)
foreach (Object obj in this.loaders)
{
Object obj;
if (!this.objects.TryGetValue(id, out obj))
{
continue;
}
IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{
......@@ -128,44 +137,51 @@ namespace Model
return;
}
this.objects.Add(obj.Id, obj);
this.objects.Add(obj);
IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{
return;
}
IStart iStart = objectEvent as IStart;
if (iStart != null)
{
this.newStarts.Add(obj.Id);
}
IUpdate iUpdate = objectEvent as IUpdate;
if (iUpdate != null)
{
this.newUpdates.Add(obj.Id);
this.updates.Add(obj);
}
ILoader iLoader = objectEvent as ILoader;
if (iLoader != null)
{
this.loaders.Add(obj.Id);
this.loaders.Add(obj);
}
}
public void Remove(long id)
public void Remove(Object obj)
{
this.objects.Remove(id);
}
this.objects.Remove(obj);
public void Awake(long id)
{
Object obj;
if (!objects.TryGetValue(id, out obj))
IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{
return;
}
IUpdate iUpdate = objectEvent as IUpdate;
if (iUpdate != null)
{
this.updates.Remove(obj);
}
ILoader iLoader = objectEvent as ILoader;
if (iLoader != null)
{
this.loaders.Remove(obj);
}
}
public void Awake(Object obj)
{
IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{
......@@ -180,13 +196,8 @@ namespace Model
iAwake.Awake();
}
public void Awake<P1>(long id, P1 p1)
public void Awake<P1>(Object obj, P1 p1)
{
Object obj;
if (!objects.TryGetValue(id, out obj))
{
return;
}
IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{
......@@ -201,13 +212,8 @@ namespace Model
iAwake.Awake(p1);
}
public void Awake<P1, P2>(long id, P1 p1, P2 p2)
public void Awake<P1, P2>(Object obj, P1 p1, P2 p2)
{
Object obj;
if (!objects.TryGetValue(id, out obj))
{
return;
}
IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{
......@@ -222,13 +228,8 @@ namespace Model
iAwake.Awake(p1, p2);
}
public void Awake<P1, P2, P3>(long id, P1 p1, P2 p2, P3 p3)
public void Awake<P1, P2, P3>(Object obj, P1 p1, P2 p2, P3 p3)
{
Object obj;
if (!objects.TryGetValue(id, out obj))
{
return;
}
IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{
......@@ -242,49 +243,11 @@ namespace Model
objectEvent.SetValue(obj);
iAwake.Awake(p1, p2, p3);
}
private void Start()
{
starts = newStarts;
newStarts = new List<long>();
foreach (long id in starts)
{
Object obj;
if (!this.objects.TryGetValue(id, out obj))
{
continue;
}
IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{
continue;
}
IStart iStart = objectEvent as IStart;
if (iStart == null)
{
continue;
}
objectEvent.SetValue(obj);
iStart.Start();
}
}
public void Update()
{
this.Start();
// 交换update
List<long> tmpUpdate = updates;
updates = newUpdates;
newUpdates = tmpUpdate;
newUpdates.Clear();
foreach (long id in updates)
foreach (Object obj in updates)
{
Object obj;
if (!objects.TryGetValue(id, out obj))
{
continue;
}
IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{
......@@ -295,7 +258,6 @@ namespace Model
{
continue;
}
newUpdates.Add(id);
objectEvent.SetValue(obj);
try
{
......@@ -311,7 +273,7 @@ namespace Model
public override string ToString()
{
var info = new Dictionary<string, int>();
foreach (Object obj in objects.Values)
foreach (Object obj in objects)
{
if (info.ContainsKey(obj.GetType().Name))
{
......@@ -330,7 +292,7 @@ namespace Model
sb.Append($"{info[key],10} {key}\r\n");
}
sb.Append($"\r\n start: {newStarts.Count}, update: {newUpdates.Count} total: {this.objects.Count}");
sb.Append($"\r\n update: {this.updates.Count} total: {this.objects.Count}");
return sb.ToString();
}
}
......
......@@ -130,7 +130,6 @@
<Compile Include="Assets\Scripts\Object\Entity.cs" />
<Compile Include="Assets\Scripts\Object\IAwake.cs" />
<Compile Include="Assets\Scripts\Object\ILoader.cs" />
<Compile Include="Assets\Scripts\Object\IStart.cs" />
<Compile Include="Assets\Scripts\Object\IUpdate.cs" />
<Compile Include="Assets\Scripts\Object\Object.cs" />
<Compile Include="Assets\Scripts\Object\ObjectEventAttribute.cs" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册