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.ClientTransform.rotation * 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.Spline) { XSplineComponent spcomp = Layer.EmitSpline; int splineIndex; if (Layer.EmitSplinePosType == EEmitSplinePos.Uniformly) { int index = node.Index; float p = (float)(index + 1) / Layer.MaxENodes; splineIndex = (int)(spcomp.CachedElements.Count * p) - 1; splineIndex = Mathf.Clamp(splineIndex, 0, spcomp.CachedElements.Count - 1); } else if (Layer.EmitSplinePosType == EEmitSplinePos.Random) { splineIndex = Random.Range(0, spcomp.CachedElements.Count); } else { splineIndex = 0; } retPos = spcomp.transform.localToWorldMatrix.MultiplyPoint(spcomp.CachedElements[splineIndex].Pos); node.SetSplineOffset(spcomp.CachedElements[splineIndex].Offset); } 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); }