private void Awake() { var config = new ECSConfig { halfRange = new Fix64(40), deltaTime = (Fix64)0.01667f, g = (Fix64)6.6720e-08, }; // because of the dumb physics, this will exponentially increase calculations const int maxParticles = 100; _ecs = new ECS(config); _ecs.CurrentFrame.RegisterComponent <Particle>(maxParticles); _ecs.CurrentFrame.AddSystem(new ParticleSystem()); for (var i = 0; i < maxParticles; i++) { var particleEntity = _ecs.CurrentFrame.Create(); _ecs.CurrentFrame.Add <Particle>(particleEntity); } var particleFilter = _ecs.CurrentFrame.Filter <Particle>(); while (particleFilter.Next(out var e, out var particle)) { particle->Mass = new Fix64(10000); particle->Position = new Vector2(Random.Range((float)-config.halfRange, (float)config.halfRange), Random.Range((float)-config.halfRange, (float)config.halfRange)).ToFixVector2(); var ecsEntityView = Instantiate(entityView); ecsEntityView.transform.position = particle->Position.ToUnityVector2(); ecsEntityView.Init(_ecs, e); } }
private void OnDestroy() { if (ECSConfig.IsModfy()) { if (EditorUtility.DisplayDialog("提示", "ECS有未保存的修改,是否保存?", "保存", "放弃")) { ECSConfig.SaveToFile(); } else { ECSConfig.ReloadFormFile(); } } //Undo.ClearUndo(ECSConfig.Instance); }
void OnGUI() { for (int i = 0; i < ECSConfig.Instance.Contexts.Count; ++i) { var context = ECSConfig.Instance.Contexts[i]; using (new EditorGUILayout.VerticalScope("Box")) { using (new EditorGUILayout.HorizontalScope()) { GUILayout.Label(context.Name); GUILayout.FlexibleSpace(); if (GUILayout.Button("移除")) { ECSConfig.MakeModify("remove context"); ECSConfig.Instance.Contexts.RemoveAt(i); --i; continue; } } using (new EditorGUILayout.HorizontalScope()) { if (!string.IsNullOrEmpty(context.UpLevelContext)) { GUILayout.Label("上层Context: "); GUILayout.Label(context.UpLevelContext); } if (GUILayout.Button("选择上层Context")) { var names = ECSConfig.Instance.Contexts.Where(it => it.Name != context.Name && context.Name != it.UpLevelContext).Select(it => it.Name).ToArray(); if (names.Length > 0) { GenericMenu generic = new GenericMenu(); foreach (var name in names) { generic.AddItem(new GUIContent(name), name == context.UpLevelContext, () => { ECSConfig.MakeModify("set up level context"); context.UpLevelContext = name; }); } generic.ShowAsContext(); } } } GUILayout.Space(5); if (GUILayout.Button(context.DirectoryPath, EditorStyles.linkLabel)) { string selectPath = context.DirectoryPath; if (selectPath.EndsWith("/")) { selectPath = selectPath.Substring(0, selectPath.Length - 1); } var obj = AssetDatabase.LoadMainAssetAtPath(selectPath); EditorGUIUtility.PingObject(obj); Selection.activeObject = obj; } if (GUILayout.Button("重新生成ECS文件")) { context.GenECSFile(true); } } GUILayout.Space(10); } DrawCreate(); DrawAddExits(); if (ECSConfig.IsModfy() && GUILayout.Button("保存")) { ECSConfig.SaveToFile(); } }
protected ECSConfig() { _instance = this; }
public static void ReloadFormFile() { _instance = JsonUtility.FromJson <ECSConfig>(SaveFile); }
private static void UpdateParticleGravity(Frame f, ulong e, Particle *particle, ECSConfig config) { particle->Position += particle->Velocity * config.deltaTime; var particleFilter = f.Filter <Particle>(); while (particleFilter.Next(out var otherEntity, out var otherParticle)) { if (otherEntity == e) { continue; } var toOther = otherParticle->Position - particle->Position; var sqrMagnitude = toOther.SqrMagnitude; if (sqrMagnitude <= Fix64.Zero) { continue; } if (sqrMagnitude >= config.halfRange * config.halfRange) { continue; } var forceGravity = (config.g * particle->Mass * otherParticle->Mass) / sqrMagnitude; particle->Velocity += toOther.Normalized * forceGravity * config.deltaTime; } }
private static void UpdateParticlePosition(Frame f, ulong e, Particle *particle, ECSConfig config) { particle->Position += particle->Velocity * config.deltaTime; if (particle->Position.x > config.halfRange) { particle->Position = new FixVector2(particle->Position.x - config.halfRange * new Fix64(2), particle->Position.y); } if (particle->Position.x < -config.halfRange) { particle->Position = new FixVector2(particle->Position.x + config.halfRange * new Fix64(2), particle->Position.y); } if (particle->Position.y < -config.halfRange) { particle->Position = new FixVector2(particle->Position.x, particle->Position.y + config.halfRange * new Fix64(2)); } if (particle->Position.y > config.halfRange) { particle->Position = new FixVector2(particle->Position.x, particle->Position.y - config.halfRange * new Fix64(2)); } }