Beispiel #1
0
    public override void OnCollision(FieldInstance instance)
    {
        base.OnCollision(instance);

        if (objectProjectile.ExplosionVFX > 0)
        {
            Vector2 offset = Rect.point - instance.Rect.point;
            if (instance.ToLeft)
            {
                offset.x -= instance.Rect.width / 2;
            }
            else
            {
                offset.x += instance.Rect.width / 2;
            }
            offset.y += Rect.height / 2;

            Vector3 offset3d = offset;
            offset3d.z = -0.5f;

            ResourceVFX effect = TableLoader.GetTable<ResourceVFX>().Get(objectProjectile.ExplosionVFX);
            GameObject child = RecycleManager.Instance.Instantiate(effect.Resource);
            instance.AttachChild(child, "BC", offset3d);
        }

        if (objectProjectile.ImpactType == E_ImpactType.Destroy)
        {
            Remove();
        }
        else
        {
            float speedX = Mathf.Abs(Velocity.x);
            float velY = Velocity.y;
            float speedReductionRatio = Random.Range(objectProjectile.MinimumSpeedReduction, objectProjectile.MaximumSpeedReduction);
            float bounceSpeedRatio = Mathf.Max(0, 1 - speedReductionRatio);

            var movement = VectorGenerator.Custom(speedX * bounceSpeedRatio, velY * bounceSpeedRatio, objectProjectile.FallingGravity, !ToLeft);
            if (!instance.IsMovementPaused())
            {
                Vector2 targetVel = instance.Velocity;
                if (targetVel != Vector2.zero)
                {
                    movement.Add(new LinearVelocity(targetVel));
                }
            }
            SetMove(movement);
            ChangeMotion("bounce");
        }
    }