示例#1
0
        public static BlockInstance CreateBlockInstance <T>(BlockInstanceOptions options) where T : BlockInstance
        {
            options.positionZ = Instance.InstanceBlocks.transform.position.z;
            var instance = BlockInstance.CreateInstance <T>(options);

            instance.transform.parent = Instance.InstanceBlocks.transform;
            return(instance);
        }
        public static T CreateInstance <T>(BlockInstanceOptions options) where T : BlockInstance
        {
            var gameobject = options.GameObject ?? new GameObject($"{options.BlockType.name}{options.Blocks.Bound.center.x},{options.Blocks.Bound.center.y}");
            var instance   = gameobject.AddComponent <T>();

            instance.UpdateInstance(options);

            return(instance);
        }
 public override void UpdateInstance(BlockInstanceOptions options)
 {
     base.UpdateInstance(options);
     BoxCollider.usedByEffector            = true;
     platformEffector                      = gameObject.GetOrAddComponent <PlatformEffector2D>();
     platformEffector.useColliderMask      = false;
     platformEffector.sideArc              = 0;
     platformEffector.surfaceArc           = 170;
     GetComponent <Rigidbody2D>().bodyType = RigidbodyType2D.Static;
 }
        public virtual void UpdateInstance(BlockInstanceOptions options)
        {
            /*if (Collider)
             *  Destroy(Collider);*/
            if (BlocksObject != null)
            {
                BlocksObject.ForEach(block => Destroy(block));
            }

            Blocks    = options.Blocks;
            BlockType = options.BlockType;
            data      = options.Data;
            IsStatic  = options.IsStatic;
            gameObject.transform.position = options.Blocks.Bound.center.Set(z: options.positionZ);

            if (options.GenerateCollider && options.BlockType.MergeMode == BlockMergeMode.Both)
            {
                var composite = gameObject.GetOrAddComponent <CompositeCollider2D>();
                composite.geometryType   = CompositeCollider2D.GeometryType.Polygons;
                composite.offsetDistance = 0.01f;
                composite.isTrigger      = options.IsTrigger;
                if (!(Collider is CompositeCollider2D))
                {
                    Destroy(Collider);
                }
                Collider = composite;
            }
            else if (options.GenerateCollider)
            {
                BoxCollider           = gameObject.GetOrAddComponent <BoxCollider2D>();
                BoxCollider.size      = options.Blocks.Bound.size.ToVector2();
                BoxCollider.isTrigger = options.IsTrigger;
                if (!(Collider is BoxCollider2D))
                {
                    Destroy(Collider);
                }
                Collider = BoxCollider;
            }

            if (options.GenerateCollider || options.GenerateRenderer)
            {
                BlocksObject =
                    options.Blocks.Select(block =>
                {
                    var obj                = new GameObject();
                    obj.layer              = 11;
                    obj.name               = $"Block-{block.Position.x},{block.Position.y}";
                    obj.transform.parent   = transform;
                    obj.transform.position = block.Position.ToVector3(transform.position.z) + new Vector3(.5f, .5f, 0);
                    if (options.GenerateRenderer)
                    {
                        var renderer    = obj.AddComponent <SpriteRenderer>();
                        renderer.sprite = block.BlockType.sprite;
                    }
                    if (options.GenerateCollider && options.BlockType.MergeMode == BlockMergeMode.Both)
                    {
                        var collider             = obj.AddComponent <BoxCollider2D>();
                        collider.offset          = Vector2.zero;
                        collider.size            = Vector2.one;
                        collider.usedByComposite = true;
                    }
                    if (!options.IsStatic)
                    {
                        options.BlockType.OnBlockObjectCreated(this, obj, block);
                    }
                    return(obj);
                }).ToList();
            }
        }
 public static BlockInstance CreateInstance(BlockInstanceOptions options)
 {
     return(CreateInstance <BlockInstance>(options));
 }