コード例 #1
0
ファイル: RibbonTrail.cs プロジェクト: qsw1214/FightWar
 public override void Initialize(EffectNode node)
 {
     base.Initialize(node);
     SetUVCoord(node.LowerLeftUV, node.UVDimensions);
     SetColor(node.Color);
     SetHeadPosition(node.GetRealClientPos() + node.Position /*+ node.OriDirection.normalized * node.Owner.TailDistance*/);
     ResetElementsPos();
 }
コード例 #2
0
        public Vector3 GetEmitRotation(EffectNode node)
        {
            Vector3 ret = Vector3.zero;

            //Set Direction:
            if (Layer.DirType == DIRECTION_TYPE.Sphere)
            {
                ret = node.GetOriginalPos() - Layer.DirCenter.position;
                if (ret == Vector3.zero)
                {
                    //use random rotation.
                    Vector3    r   = Vector3.up;
                    Quaternion rot = Quaternion.Euler(Random.Range(0, 360), Random.Range(0, 360), Random.Range(0, 360));
                    ret = rot * r;
                }
            }
            else if (Layer.DirType == DIRECTION_TYPE.Planar)
            {
                ret = Layer.OriVelocityAxis;
            }
            else if (Layer.DirType == DIRECTION_TYPE.Cone)
            {
                //if emit uniform circle, the rotation should be spread from the center.
                if (Layer.EmitType == (int)EMITTYPE.CIRCLE && Layer.EmitUniform)
                {
                    Vector3 dir;
                    if (!Layer.SyncClient)
                    {
                        dir = node.Position - (node.GetRealClientPos() + Layer.EmitPoint);
                    }
                    else
                    {
                        dir = node.Position - Layer.EmitPoint;
                    }
                    Vector3    target = Vector3.RotateTowards(dir, Layer.CircleDir, (90 - Layer.AngleAroundAxis) * Mathf.Deg2Rad, 1);
                    Quaternion rot    = Quaternion.FromToRotation(dir, target);
                    ret = rot * dir;
                }
                else
                {
                    //first, rotate y around z 30 degrees
                    Quaternion rotY = Quaternion.Euler(0, 0, Layer.AngleAroundAxis);
                    //second, rotate around y 360 random dir;
                    Quaternion rotAround = Quaternion.Euler(0, Random.Range(0, 360), 0);
                    //last, rotate the dir to OriVelocityAxis
                    Quaternion rotTo = Quaternion.FromToRotation(Vector3.up, Layer.OriVelocityAxis);
                    ret = rotTo * rotAround * rotY * Vector3.up;
                }
            }
            else if (Layer.DirType == DIRECTION_TYPE.Cylindrical)
            {
                Vector3 dir  = node.GetOriginalPos() - Layer.DirCenter.position;
                float   dist = Vector3.Dot(Layer.OriVelocityAxis, dir);
                ret = dir - dist * Layer.OriVelocityAxis.normalized;
            }
            return(ret);
        }
コード例 #3
0
ファイル: Emitter.cs プロジェクト: bianchengxiaobei/BeastGame
        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);
        }
コード例 #4
0
 public override void Initialize(EffectNode node)
 {
     base.Initialize(node);
     SetUVCoord(node.LowerLeftUV, node.UVDimensions);
     SetColor(node.Color);
     SetHeadPosition(node.GetRealClientPos() + node.Position /*+ node.OriDirection.normalized * node.Owner.TailDistance*/);
     ResetElementsPos();
     mLastClientPos = node.Owner.ClientTransform.position;
 }
コード例 #5
0
ファイル: Emitter.cs プロジェクト: GDxU/incomplete-richman
        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);
        }
コード例 #6
0
ファイル: Emitter.cs プロジェクト: GDxU/incomplete-richman
        public Vector3 GetEmitRotation(EffectNode node)
        {
            Vector3 ret = Vector3.zero;
            //Set Direction:
            if (Layer.DirType == DIRECTION_TYPE.Sphere)
            {
                ret = node.GetOriginalPos() - Layer.ClientTransform.position;
				if (ret == Vector3.zero)
				{
					//use random rotation.
					Vector3 r = Vector3.up;
                	Quaternion rot = Quaternion.Euler(Random.Range(0, 360), Random.Range(0, 360), Random.Range(0, 360));
                	ret = rot * r;
				}
            }
            else if (Layer.DirType == DIRECTION_TYPE.Planar)
            {
                ret = Layer.OriVelocityAxis; 
            }
            else if (Layer.DirType == DIRECTION_TYPE.Cone)
            {
                //if emit uniform circle, the rotation should be spread from the center.
                if (Layer.EmitType == (int)EMITTYPE.CIRCLE && Layer.EmitUniform)
                {
                    Vector3 dir;
                    if (!Layer.SyncClient)
                        dir = node.Position - (node.GetRealClientPos() + Layer.EmitPoint);
                    else
                        dir = node.Position - Layer.EmitPoint;
                    
                    int coneAngle = Layer.AngleAroundAxis;
                    if (Layer.UseRandomDirAngle)
                    {
                        coneAngle = Random.Range(Layer.AngleAroundAxis,Layer.AngleAroundAxisMax);
                    }
                    
                    Vector3 target = Vector3.RotateTowards(dir, Layer.CircleDir, (90 - coneAngle) * Mathf.Deg2Rad, 1);
                    Quaternion rot = Quaternion.FromToRotation(dir, target);
                    ret = rot * dir;
                }
                else
                {
                    //first, rotate y around z 30 degrees
                    Quaternion rotY = Quaternion.Euler(0, 0, Layer.AngleAroundAxis);
                    //second, rotate around y 360 random dir;
                    Quaternion rotAround = Quaternion.Euler(0, Random.Range(0, 360), 0);
                    //last, rotate the dir to OriVelocityAxis
                    Quaternion rotTo = Quaternion.FromToRotation(Vector3.up, Layer.OriVelocityAxis);
                    ret = rotTo * rotAround * rotY * Vector3.up;
                }
            }
            else if (Layer.DirType == DIRECTION_TYPE.Cylindrical)
            {
                Vector3 dir = node.GetOriginalPos() - Layer.ClientTransform.position;
                

                if (dir == Vector3.zero)
                {
                 //use random rotation.
                 Vector3 r = Vector3.up;
                 Quaternion rot = Quaternion.Euler(Random.Range(0, 360), Random.Range(0, 360), Random.Range(0, 360));
                 dir = rot * r;
                }
                
                float dist = Vector3.Dot(Layer.OriVelocityAxis, dir);
                ret = dir - dist * Layer.OriVelocityAxis.normalized;
                
                
                
            }
            return  ret;
        }