void DrawGas(substanceInfo substance, float reactionAmount)
    {
        /*ArrayList gass = substance.objects[(int)substanceType.Gas];
         * foreach (GameObject gas in gass)
         * {
         *      gas.transform.localScale *= scaleRate;
         *      Color c = new Color(substance.color[0], substance.color[1], substance.color[2], 0.2f);
         *      gas.GetComponent<MeshRenderer>().material.color = c;
         * }*/
        ArrayList gass = substance.objects[(int)substanceType.Gas];

        foreach (GameObject gas in gass)
        {
            GameObject gasCreater = (GameObject)substance.gasCreater[gass.IndexOf(gas)];
            if (gasCreater != null)
            {
                gas.GetComponent <Bubbles>().MoveEimtter(gasCreater.transform.position);
                gas.GetComponent <Bubbles>().Emit(reactionAmount);
            }
            else
            {
                gas.GetComponent <Bubbles>().Emit(reactionAmount);
            }
        }
    }
    void DrawSubstance(substanceInfo substance, float reactionAmount, substanceType stype)
    {
        switch (stype)
        {
        case substanceType.Solid:
        {
            float newAmount = substance.amount[(int)stype];
            float oldAmount = newAmount - reactionAmount;
            DrawSolid(substance, newAmount / oldAmount);
            break;
        }

        case substanceType.Liquid:
        {
            //DrawLiquid(substance, (float)substance.concentration);
            break;
        }

        case substanceType.Gas:
        {
            //Debug.Log("bubbles" + reactionAmount);
            DrawGas(substance, reactionAmount);
            break;
        }

        default:
            break;
        }
    }
    void DrawSolid(substanceInfo substance, float scaleRate)
    {
        ArrayList solids = substance.objects[(int)substanceType.Solid];

        foreach (GameObject solid in solids)
        {
            solid.transform.localScale *= scaleRate;
        }
    }
    public void DrawPhenomena(Dictionary <string, substanceInfo> substances, reactionInfo rctInfo, Dictionary <string, float> reactionAmounts)
    {
        ArrayList liquids = new ArrayList();

        foreach (substanceInfoOfReaction sir in rctInfo.reactants)
        {
            if (sir.type == substanceType.Liquid)
            {
                liquids.Add(sir);
            }
            else
            {
                DrawSubstance(substances[sir.name], reactionAmounts[sir.name], sir.type);
            }
        }
        foreach (substanceInfoOfReaction sir in rctInfo.products)
        {
            if (sir.type == substanceType.Liquid)
            {
                liquids.Add(sir);
            }
            else
            {
                DrawSubstance(substances[sir.name], reactionAmounts[sir.name], sir.type);
            }
        }
        //DrawLiquids
        ArrayList fluids  = new ArrayList();
        ArrayList colors  = new ArrayList();
        ArrayList amounts = new ArrayList();

        foreach (substanceInfoOfReaction sir in liquids)
        {
            substanceInfo substance = substances[sir.name];
            ArrayList     liqs      = substance.objects[(int)substanceType.Liquid];
            foreach (GameObject liquid in liqs)
            {
                if (liquid.GetComponent <LiquidSimulator>().fluid == null)
                {
                    ;
                }
                if (!fluids.Contains(liquid.GetComponent <LiquidSimulator>().fluid))
                {
                    Debug.Log(sir.name + " " + fluids.Count);
                    fluids.Add(liquid.GetComponent <LiquidSimulator>().fluid);
                    amounts.Add((float)0);
                    colors.Add(Color.white);
                }
                int   i  = fluids.IndexOf(liquid.GetComponent <LiquidSimulator>().fluid);
                float a  = (float)amounts[i];
                float sa = (float)substance.amount[(int)substanceType.Liquid];
                Color c  = (Color)colors[i];
                Debug.Log(" a" + a + " " + c.r + " " + c.g + " " + c.b + " ");
                Debug.Log(" sa" + sa + " " + (float)substance.color[0] + " " + substance.color[1] + " " + substance.color[2] + " ");
                amounts[i] = a + sa;
                colors[i]  = new Color((float)(a * c.r + sa * substance.color[0]) / (a + sa), (float)(a * c.g + sa * substance.color[1]) / (a + sa), (float)(a * c.b + sa * substance.color[2]) / (a + sa), 1.0f);
            }
        }
        foreach (GameObject fluid in fluids)
        {
            Color c = (Color)colors[fluids.IndexOf(fluid)];
            Debug.Log(c.r + " " + c.g + " " + c.b + " ");
            fluid.GetComponent <Obi.ObiParticleRenderer>().particleColor = (Color)colors[fluids.IndexOf(fluid)];
        }
    }