Exemple #1
0
        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();
     }
 }
Exemple #4
0
 protected ECSConfig()
 {
     _instance = this;
 }
Exemple #5
0
 public static void ReloadFormFile()
 {
     _instance = JsonUtility.FromJson <ECSConfig>(SaveFile);
 }
Exemple #6
0
            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;
                }
            }
Exemple #7
0
 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));
     }
 }