private bool createEffect() { LightEffectParam newParam = new LightEffectParam(); EffectParam.ColoneTo(ref newParam); float maxDistance = EffectParam.fDistance; float effectRad = EffectParam.fAttackRange; Vector3 newSourcePos = newParam.srcObject.transform.position; if (sourceTransform != null) { newSourcePos = sourceTransform.position; } Vector3 areaTargetPos = EffectParam.targetPos; Vector3 newTargetPos = areaTargetPos; //构造一个范围内的随机目标位置 if (areaConfig.projectOnGround == true) { //构造一个投影到地面的圆形 int angle = Random.Range(0, 360); float _rad = angle * Mathf.PI / 180.0f; Vector3 offset = new Vector3(Mathf.Sin(_rad), 0, Mathf.Cos(_rad)); float dis = Random.Range(0.0f, effectRad); offset *= dis; newTargetPos += offset; RaycastHit _ClosestHitInfo_Down; RaycastHit _ClosestHitInfo_Up; float rayDistance = maxDistance; Ray PointToGroundRayDown = new Ray(newTargetPos, new Vector3(0, -1, 0)); Ray PointToGroundRayUp = new Ray(newTargetPos, new Vector3(0, 1, 0)); bool DownHit = Physics.Raycast(PointToGroundRayDown, out _ClosestHitInfo_Down, rayDistance, -1); bool UpHit = Physics.Raycast(PointToGroundRayUp, out _ClosestHitInfo_Up, rayDistance, -1); Vector3 recordPos = newTargetPos; float hitDistance = maxDistance; if (DownHit) { hitDistance = (_ClosestHitInfo_Down.point - recordPos).magnitude; newTargetPos = _ClosestHitInfo_Down.point; } if (UpHit) { if ((_ClosestHitInfo_Up.point - recordPos).magnitude < hitDistance) { hitDistance = (_ClosestHitInfo_Up.point - recordPos).magnitude; newTargetPos = _ClosestHitInfo_Up.point; } } newParam.targetPos = newTargetPos; } else if (effectRad > 0.01f) { //构造一个圆锥 Vector3 normal = EffectParam.targetPos - newSourcePos; Vector3 tangent = new Vector3(0, 0, 1); Vector3.OrthoNormalize(ref normal, ref tangent); int angle = Random.Range(0, 360); Quaternion rotation = Quaternion.AngleAxis((float)angle, normal); tangent = rotation * tangent; float dis = Random.Range(0.0f, effectRad); tangent *= dis; newTargetPos += tangent; if (areaConfig.extentToMaxDistance) {//将目标点拉远,延长用更容易造成与地面的碰撞 Vector3 dir = newTargetPos - newSourcePos; dir.Normalize(); newTargetPos = newSourcePos + dir * maxDistance; } newParam.targetPos = newTargetPos; } else { if (areaConfig.extentToMaxDistance) {//将目标点拉远,延长用更容易造成与地面的碰撞 Vector3 dir = newTargetPos - newSourcePos; dir.Normalize(); newTargetPos = newSourcePos + dir * maxDistance; } newParam.targetObject = EffectParam.targetObject; newParam.targetPos = EffectParam.targetPos; } if (areaConfig.customOffset.sqrMagnitude > 0.001f) { //有此设置时,变更起始点,变为相对于newParam.targetPos,偏移customOffet Vector3 offsetNormal = EffectParam.targetPos - newSourcePos; offsetNormal.y = 0; offsetNormal.Normalize(); Vector3 offsetTangent = new Vector3(0, 1, 0); Vector3 offsetBinormal = Vector3.Cross(offsetTangent, offsetNormal); //Vector3.OrthoNormalize(ref offsetNormal, ref offsetTangent,ref offsetBinormal); Vector3 offSet = newParam.targetPos; offSet += offsetNormal * areaConfig.customOffset.z; offSet += offsetTangent * areaConfig.customOffset.y; offSet += offsetBinormal * areaConfig.customOffset.x; newParam.sourcePos = offSet; newParam.nEffectFlag |= (int)LightEffectParam.EFFECT_FLAG.CustomSourcePos; } LightingEffectManager leManager = EffectParam.srcObject.GetComponent <LightingEffectManager>(); if (leManager != null) { ////测试用代码,用来标记检测发射区域是否正确 //GameObject checkPoint = GameObject.CreatePrimitive(PrimitiveType.Sphere); //checkPoint.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f); //checkPoint.transform.SetPosition( newParam.targetPos; //checkPoint.collider.enabled = false; //checkPoint.name = "Point" + mEffectLeftCount.ToString(); leManager.AddLighting(areaConfig.subEffectID, newParam); } return(true); }