void TurretRoutine() { if (animateTurret != _TurretAni.None && !unit.IsStunned()) { Vector3 shootPos = turretObject.position; if (animateTurret == _TurretAni.YAxis) { Vector3 targetPos = target.GetTargetT().position; targetPos.y = turretObject.position.y; Quaternion wantedRot = Quaternion.LookRotation(targetPos - turretObject.position); turretObject.rotation = Quaternion.Slerp(turretObject.rotation, wantedRot, turretRotateSpeed * Time.deltaTime); if (Quaternion.Angle(turretObject.rotation, wantedRot) < aimTolerance) { targetInLOS = true; } else { targetInLOS = false; } } else if (animateTurret == _TurretAni.Full) { if (turretRotationModel == _RotationMode.FullTurret) { Vector3 targetPos = target.GetTargetT().position; Quaternion wantedRot = Quaternion.LookRotation(targetPos - turretObject.position); //calculate elavation offset float distFactor = Mathf.Min(1, Vector3.Distance(turretObject.position, targetPos) / turretMaxRange); float offset = distFactor * turretMaxAngle; wantedRot *= Quaternion.Euler(-offset, 0, 0); turretObject.rotation = Quaternion.Slerp(turretObject.rotation, wantedRot, turretRotateSpeed * Time.deltaTime); if (Quaternion.Angle(turretObject.rotation, wantedRot) < aimTolerance) { targetInLOS = true; } else { targetInLOS = false; } } else if (turretRotationModel == _RotationMode.SeparatedBarrel) { Vector3 targetPos = target.GetTargetT().position; Vector3 dummyPos = targetPos; dummyPos.y = turretObject.position.y; Quaternion wantedRot = Quaternion.LookRotation(dummyPos - turretObject.position); turretObject.rotation = Quaternion.Slerp(turretObject.rotation, wantedRot, turretRotateSpeed * Time.deltaTime); //calculate elavation offset if (barrelObject != null) { shootPos = barrelObject.position; wantedRot = Quaternion.LookRotation(targetPos - barrelObject.position); wantedRot = Quaternion.Euler(wantedRot.eulerAngles.x, barrelObject.rotation.eulerAngles.y, 0); float distFactor = Mathf.Min(1, Vector3.Distance(turretObject.position, targetPos) / turretMaxRange); float offset = distFactor * turretMaxAngle; wantedRot *= Quaternion.Euler(-offset, 0, 0); barrelObject.rotation = Quaternion.Slerp(barrelObject.rotation, wantedRot, turretRotateSpeed * Time.deltaTime); if (Quaternion.Angle(barrelObject.rotation, wantedRot) < aimTolerance) { targetInLOS = true; } else { targetInLOS = false; } } else { if (Quaternion.Angle(turretObject.rotation, wantedRot) < aimTolerance) { targetInLOS = true; } else { targetInLOS = false; } } } } if (targetInLOS && losMode == _LOSMode.Realistic) { Vector3 targetPos = target.GetTargetT().position; Vector3 dir = targetPos - shootPos; float dist = Vector3.Distance(targetPos, shootPos); RaycastHit hit; if (Physics.Raycast(shootPos, dir, out hit, dist)) { if (hit.transform != target.thisT) { targetInLOS = false; //Debug.DrawLine(targetPos, shootPos, Color.white, .75f); //Debug.DrawLine(hit.point, shootPos, Color.red, .75f); } } } } }