Example #1
0
    void Start()
    {
        m_TopLeftPos    = transform.parent.Find("TopLeftPos").position;
        m_BottomDownPos = transform.parent.Find("BottomDownPos").position;

        float Left      = m_TopLeftPos.x;
        float Width     = m_BottomDownPos.x - m_TopLeftPos.x;
        float Top       = m_TopLeftPos.y;
        float Bottom    = m_BottomDownPos.y;
        int   nodeCount = Mathf.RoundToInt(Width) / 2;

        m_Mass       = 1;
        m_BaseHeight = Top;

        for (int i = 0; i < nodeCount; i++)
        {
            FluidNode node = new FluidNode();
            node.m_LeftTopPos    = new Vector2(Left + Width * i / nodeCount, Top);
            node.m_BottomDownPos = new Vector2(Left + Width * (i + 1) / nodeCount, Bottom);
            node.m_Acceleration  = Vector2.zero;
            node.m_Velocity      = Vector2.zero;

            node.m_Mesh = new Mesh();

            Vector3[] vertices = new Vector3[4];
            vertices[0] = new Vector3(node.m_LeftTopPos.x, node.m_LeftTopPos.y, 0);
            vertices[1] = new Vector3(node.m_BottomDownPos.x, node.m_LeftTopPos.y, 0);
            vertices[2] = new Vector3(node.m_LeftTopPos.x, node.m_BottomDownPos.y, 0);
            vertices[3] = new Vector3(node.m_BottomDownPos.x, node.m_BottomDownPos.y, 0);

            Vector2[] texCoords = new Vector2[4];
            texCoords[0] = new Vector2(0, 1);
            texCoords[1] = new Vector2(1, 1);
            texCoords[2] = new Vector2(0, 0);
            texCoords[3] = new Vector2(1, 0);

            int[] indices = new int[6] {
                0, 1, 3, 3, 2, 0
            };

            node.m_Mesh.vertices  = vertices;
            node.m_Mesh.uv        = texCoords;
            node.m_Mesh.triangles = indices;

            node.m_MeshObject = Instantiate(m_FluidMesh, Vector3.zero, Quaternion.identity) as GameObject;
            node.m_MeshObject.GetComponent <MeshFilter>().mesh = node.m_Mesh;
            node.m_MeshObject.transform.parent = transform;
            //node.m_MeshObject.transform.position = new Vector3((node.m_LeftTopPos.x + node.m_BottomDownPos.x) / 2,
            //    (node.m_LeftTopPos.y + node.m_BottomDownPos.y) / 2, 0);

            node.m_MeshObject.AddComponent <BoxCollider2D>();
            node.m_MeshObject.GetComponent <BoxCollider2D>().isTrigger = true;
            node.m_MeshObject.AddComponent <FluidCollision>();

            m_Fluid.Add(node);
        }
    }
Example #2
0
    public void Wave(float xpos, float velocity)
    {
        ;
        if (xpos >= m_Fluid[0].m_LeftTopPos.x && xpos <= m_Fluid[m_Fluid.Count - 1].m_BottomDownPos.x)
        {
            xpos -= m_Fluid[0].m_LeftTopPos.x;

            int index = Mathf.RoundToInt(m_Fluid.Count * (xpos / (m_Fluid[m_Fluid.Count - 1].m_LeftTopPos.x - m_Fluid[0].m_LeftTopPos.x)));

            FluidNode node = m_Fluid[index];
            node.m_Velocity += new Vector2(0, velocity);
            m_Fluid[index]   = node;
        }
    }
Example #3
0
    void Update()
    {
        // 实现碰撞到的水面的阻尼运动
        for (int i = 0; i < m_Fluid.Count; i++)
        {
            Vector2   force = new Vector2(0, m_Spring * (m_Fluid[i].m_LeftTopPos.y - m_BaseHeight)) + m_Fluid[i].m_Velocity * m_Damping;
            FluidNode node  = m_Fluid[i];
            node.m_Acceleration = -force / m_Mass;
            node.m_LeftTopPos   = new Vector2(node.m_LeftTopPos.x, node.m_LeftTopPos.y + node.m_Velocity.y);
            node.m_Velocity    += node.m_Acceleration;
            m_Fluid[i]          = node;
        }

        // 碰撞到的水面带动附近的水面一起运动
        for (int i = 0; i < m_Fluid.Count; i++)
        {
            if (i > 0)
            {
                FluidNode node = m_Fluid[i];
                node.m_LeftHeightDiff = m_Spread * (m_Fluid[i].m_LeftTopPos.y - m_Fluid[i - 1].m_LeftTopPos.y);
                m_Fluid[i]            = node;
                node            = m_Fluid[i - 1];
                node.m_Velocity = node.m_Velocity + new Vector2(0, m_Fluid[i].m_LeftHeightDiff);
                m_Fluid[i - 1]  = node;
            }
            if (i < m_Fluid.Count - 1)
            {
                FluidNode node = m_Fluid[i];
                node.m_RightHeightDiff = m_Spread * (m_Fluid[i].m_LeftTopPos.y - m_Fluid[i + 1].m_LeftTopPos.y);
                m_Fluid[i]             = node;
                node            = m_Fluid[i + 1];
                node.m_Velocity = node.m_Velocity + new Vector2(0, m_Fluid[i].m_RightHeightDiff);
                m_Fluid[i + 1]  = node;
            }
        }
        for (int i = 0; i < m_Fluid.Count; i++)
        {
            if (i > 0)
            {
                FluidNode node = m_Fluid[i - 1];
                node.m_LeftTopPos = new Vector2(node.m_LeftTopPos.x, node.m_LeftTopPos.y + m_Fluid[i].m_LeftHeightDiff);
                m_Fluid[i - 1]    = node;
            }
            if (i < m_Fluid.Count - 1)
            {
                FluidNode node = m_Fluid[i + 1];
                node.m_LeftTopPos = new Vector2(node.m_LeftTopPos.x, node.m_LeftTopPos.y + m_Fluid[i].m_RightHeightDiff);
                m_Fluid[i + 1]    = node;
            }
        }

        for (int i = 0; i < m_Fluid.Count; i++)
        {
            Vector3[] vertices = new Vector3[4];

            vertices[0] = new Vector3(m_Fluid[i].m_LeftTopPos.x, m_Fluid[i].m_LeftTopPos.y, 0);
            vertices[1] = new Vector3(m_Fluid[i].m_BottomDownPos.x, m_Fluid[i].m_LeftTopPos.y, 0);
            vertices[2] = new Vector3(m_Fluid[i].m_LeftTopPos.x, m_Fluid[i].m_BottomDownPos.y, 0);
            vertices[3] = new Vector3(m_Fluid[i].m_BottomDownPos.x, m_Fluid[i].m_BottomDownPos.y, 0);

            m_Fluid[i].m_Mesh.vertices = vertices;
        }
    }