Example #1
0
        public void SetEmitPosition(EffectNode node)
        {
            Vector3 retPos    = Vector3.zero;
            Vector3 clientPos = node.GetRealClientPos();


            if (Layer.EmitType == (int)EMITTYPE.BOX)
            {
                Vector3 center = Layer.EmitPoint;
                float   x      = Random.Range(center.x - Layer.BoxSize.x / 2, center.x + Layer.BoxSize.x / 2);
                float   y      = Random.Range(center.y - Layer.BoxSize.y / 2, center.y + Layer.BoxSize.y / 2);
                float   z      = Random.Range(center.z - Layer.BoxSize.z / 2, center.z + Layer.BoxSize.z / 2);
                retPos.x = x; retPos.y = y; retPos.z = z;

                if (!Layer.SyncClient)
                {
                    //if (!Layer.BoxInheritRotation)
                    // retPos = clientPos + retPos;
                    //else
                    retPos = Layer.ClientTransform.rotation * retPos + clientPos;
                }
                else
                {
                    //if (Layer.BoxInheritRotation)
                    retPos = Layer.ClientTransform.rotation * retPos;
                }
            }
            else if (Layer.EmitType == (int)EMITTYPE.POINT)
            {
                retPos = Layer.EmitPoint;
                if (!Layer.SyncClient)
                {
                    retPos = clientPos + Layer.EmitPoint;
                }
            }
            else if (Layer.EmitType == (int)EMITTYPE.SPHERE)
            {
                retPos = Layer.EmitPoint;
                if (!Layer.SyncClient)
                {//同步的话在NodeUpdate里会更新位置
                    retPos = clientPos + Layer.EmitPoint;
                }
                Vector3    r   = Vector3.up * Layer.Radius;
                Quaternion rot = Quaternion.Euler(Random.Range(0, 360), Random.Range(0, 360), Random.Range(0, 360));
                retPos = rot * r + retPos;
            }
            //Line direction is based on client transform's rotation.
            else if (Layer.EmitType == (int)EMITTYPE.LINE)
            {
                Vector3 left  = Layer.LineStartObj.position;
                Vector3 right = Layer.LineEndObj.position;
                Vector3 dir   = right - left;

                float length;
                if (Layer.EmitUniform)
                {
                    float p = (float)(node.Index + 1) / Layer.MaxENodes;
                    length = dir.magnitude * p;
                }
                else
                {
                    length = Random.Range(0, dir.magnitude);
                }

                retPos = left + dir.normalized * length - clientPos;
                if (!Layer.SyncClient)
                {
                    retPos = clientPos + retPos;
                }
            }
            else if (Layer.EmitType == (int)EMITTYPE.CIRCLE)
            {
                float rangle;
                if (Layer.EmitUniform)
                {
                    int   index = node.Index;
                    float p     = (float)(index + 1) / Layer.MaxENodes;
                    rangle = 360 * p;
                }
                else
                {
                    rangle = Random.Range(0, 360);
                }

                float radius = Layer.Radius;
                if (Layer.UseRandomCircle)
                {
                    radius = Random.Range(Layer.CircleRadiusMin, Layer.CircleRadiusMax);
                }

                Quaternion rotY  = Quaternion.Euler(0, rangle, 0);
                Vector3    v     = rotY * (Vector3.right * radius);
                Quaternion rotTo = Quaternion.FromToRotation(Vector3.up, Layer.ClientTransform.rotation * Layer.CircleDir);
                retPos = rotTo * v;
                if (!Layer.SyncClient)
                {
                    retPos = clientPos + retPos + Layer.EmitPoint;
                }
                else
                {
                    retPos = retPos + Layer.EmitPoint;
                }
            }
            else if (Layer.EmitType == (int)EMITTYPE.Mesh)
            {
                if (Layer.EmitMesh == null)
                {
                    Debug.LogWarning("please set a mesh to the emitter.");
                    return;
                }
                int index = 0;
                if (Layer.EmitMeshType == 0)
                {
                    int vertCount = Layer.EmitMesh.vertexCount;
                    if (Layer.EmitUniform)
                    {
                        index = (node.Index) % (vertCount - 1);
                    }
                    else
                    {
                        index = Random.Range(0, vertCount - 1);
                    }
                    retPos = Layer.EmitMesh.vertices[index];
                    if (!Layer.SyncClient)
                    {
                        retPos = clientPos + retPos + Layer.EmitPoint;
                    }
                    else
                    {
                        retPos = retPos + Layer.EmitPoint;
                    }
                }
                else if (Layer.EmitMeshType == 1)
                {
                    Vector3[] verts    = Layer.EmitMesh.vertices;
                    int       triCount = Layer.EmitMesh.triangles.Length / 3;
                    if (Layer.EmitUniform)
                    {
                        index = (node.Index) % (triCount - 1);
                    }
                    else
                    {
                        index = Random.Range(0, triCount - 1);
                    }
                    int vid1 = Layer.EmitMesh.triangles[index * 3 + 0];
                    int vid2 = Layer.EmitMesh.triangles[index * 3 + 1];
                    int vid3 = Layer.EmitMesh.triangles[index * 3 + 2];
                    retPos = (verts[vid1] + verts[vid2] + verts[vid3]) / 3;
                    if (!Layer.SyncClient)
                    {
                        retPos = clientPos + retPos + Layer.EmitPoint;
                    }
                    else
                    {
                        retPos = retPos + Layer.EmitPoint;
                    }
                }
            }
            node.SetLocalPosition(retPos);
        }
Example #2
0
        public void SetEmitPosition(EffectNode node)
        {
            Vector3 retPos = Vector3.zero;
            if (Layer.EmitType == (int)EMITTYPE.BOX)
            {
                Vector3 center = Layer.EmitPoint;
                float x = Random.Range(center.x - Layer.BoxSize.x / 2, center.x + Layer.BoxSize.x / 2);
                float y = Random.Range(center.y - Layer.BoxSize.y / 2, center.y + Layer.BoxSize.y / 2);
                float z = Random.Range(center.z - Layer.BoxSize.z / 2, center.z + Layer.BoxSize.z / 2);
                retPos.x = x; retPos.y = y; retPos.z = z;
                if (!Layer.SyncClient)
                {
                    if (!Layer.BoxInheritRotation)
                        retPos = Layer.ClientTransform.position + retPos;
                    else
                        retPos = Layer.ClientTransform.rotation * retPos + Layer.ClientTransform.position;
                }
                else
                {
                    if (Layer.BoxInheritRotation)
                        retPos = Layer.ClientTransform.rotation * retPos;
                }
            }
            else if (Layer.EmitType == (int)EMITTYPE.POINT)
            {
                retPos = Layer.EmitPoint;
                if (!Layer.SyncClient)
                {
                    retPos = Layer.ClientTransform.position + Layer.EmitPoint;
                }
            }
            else if (Layer.EmitType == (int)EMITTYPE.SPHERE)
            {
                retPos = Layer.EmitPoint;
                if (!Layer.SyncClient)
                {//同步的话在NodeUpdate里会更新位置
                    retPos = Layer.ClientTransform.position + Layer.EmitPoint;
                }
                Vector3 r = Vector3.up * Layer.Radius;
                Quaternion rot = Quaternion.Euler(Random.Range(0, 360), Random.Range(0, 360), Random.Range(0, 360));
                retPos = rot * r + retPos;
            }
            //Line direction is based on client transform's rotation.
            else if (Layer.EmitType == (int)EMITTYPE.LINE)
            {
                Vector3 left = Layer.EmitPoint + Layer.ClientTransform.forward * Layer.LineLengthLeft;
                Vector3 right = Layer.EmitPoint + Layer.ClientTransform.forward * Layer.LineLengthRight;
                Vector3 dir = right - left;

                float length;
                if (Layer.EmitUniform)
                {
                    float p = (float)(node.Index + 1) / Layer.MaxENodes;
                    length = dir.magnitude * p;
                }
                else
                {
                    length = Random.Range(0, dir.magnitude);
                }

                retPos = left + dir.normalized * length;
                if (!Layer.SyncClient)
                    retPos = Layer.ClientTransform.position + retPos;
            }
            else if (Layer.EmitType == (int)EMITTYPE.CIRCLE)
            {
                float rangle;
                if (Layer.EmitUniform)
                {
                    float p = (float)(node.Index + 1) / Layer.MaxENodes;
                    rangle = 360 * p;
                }
                else
                {
                    rangle = Random.Range(0, 360);
                }
                Quaternion rotY = Quaternion.Euler(0, rangle, 0);
                Vector3 v = rotY * (Vector3.right * Layer.Radius);
                Quaternion rotTo = Quaternion.FromToRotation(Vector3.up, Layer.ClientTransform.rotation * Layer.CircleDir);
                retPos = rotTo * v;
                if (!Layer.SyncClient)
                    retPos = Layer.ClientTransform.position + retPos + Layer.EmitPoint;
                else
                    retPos = retPos + Layer.EmitPoint;
            }
            else if (Layer.EmitType == (int)EMITTYPE.Mesh)
            {
                if (Layer.EmitMesh == null)
                {
                    Debug.LogWarning("please set a mesh to the emitter.");
                    return;
                }
                int index = 0;
                if (Layer.EmitMeshType == 0)
                {
                    int vertCount = Layer.EmitMesh.vertexCount;
                    if (Layer.EmitUniform)
                        index = (node.Index) % (vertCount - 1);
                    else
                        index = Random.Range(0, vertCount - 1);
                    retPos = Layer.EmitMesh.vertices[index];
                    if (!Layer.SyncClient)
                        retPos = Layer.ClientTransform.position + retPos + Layer.EmitPoint;
                    else
                        retPos = retPos + Layer.EmitPoint;
                }
                else if (Layer.EmitMeshType == 1)
                {
                    Vector3[] verts = Layer.EmitMesh.vertices;
                    int triCount = Layer.EmitMesh.triangles.Length / 3;
                    if (Layer.EmitUniform)
                        index = (node.Index) % (triCount - 1);
                    else
                        index = Random.Range(0, triCount - 1);
                    int vid1 = Layer.EmitMesh.triangles[index * 3 + 0];
                    int vid2 = Layer.EmitMesh.triangles[index * 3 + 1];
                    int vid3 = Layer.EmitMesh.triangles[index * 3 + 2];
                    retPos = (verts[vid1] + verts[vid2] + verts[vid3]) / 3;
                    if (!Layer.SyncClient)
                        retPos = Layer.ClientTransform.position + retPos + Layer.EmitPoint;
                    else
                        retPos = retPos + Layer.EmitPoint;
                }
            }
            node.SetLocalPosition(retPos);
        }