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); }
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); }